[tbb] 21/64: Imported Upstream version 3.0+r018
Graham Inggs
ginggs at moszumanska.debian.org
Mon Jul 3 12:27:47 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 a4d9948cd63dbcc21075368fb6bcf16314b3b964
Author: Graham Inggs <ginggs at debian.org>
Date: Mon Jul 3 14:13:38 2017 +0200
Imported Upstream version 3.0+r018
---
CHANGES | Bin 28957 -> 32869 bytes
Makefile | 3 +-
build/Makefile.rml | 17 +-
build/Makefile.tbb | 33 +-
build/Makefile.tbbmalloc | 26 +-
build/Makefile.test | 216 +-
build/SunOS.inc | 5 -
build/SunOS.suncc.inc | 3 +
build/common_rules.inc | 6 +-
build/generate_tbbvars.bat | 86 +-
build/generate_tbbvars.sh | 72 +-
build/linux.gcc.inc | 5 +-
build/lrb.inc | 90 -
build/lrb.native.inc | 100 -
build/macos.gcc.inc | 4 +-
build/vsproject/tbb.vcproj | 1026 +++---
build/vsproject/tbbmalloc.vcproj | 926 +++--
build/vsproject/tbbmalloc_proxy.vcproj | 428 ++-
build/windows.cl.inc | 16 +-
build/windows.gcc.inc | 6 +
build/windows.icl.inc | 13 +-
build/windows.inc | 2 +-
build/{windows.cl.inc => xbox360.cl.inc} | 50 +-
build/{lrb.host.inc => xbox360.inc} | 65 +-
doc/Release_Notes.txt | 36 +-
doc/html/a00001.html | 8 +-
doc/html/a00002.html | 8 +-
doc/html/a00003.html | 8 +-
doc/html/a00004.html | 30 +-
doc/html/a00005.html | 22 +-
doc/html/a00006.html | 26 +-
doc/html/a00007.html | 38 +-
doc/html/a00009.html | 10 +-
doc/html/a00011.html | 24 +-
doc/html/a00012.html | 69 +-
doc/html/a00013.html | 95 +
doc/html/a00014.html | 37 -
doc/html/a00015.html | 18 +-
doc/html/a00016.html | 20 +-
doc/html/a00017.html | 34 +-
doc/html/a00018.html | 54 +-
doc/html/{a00018.html => a00019.html} | 58 +-
doc/html/a00020.html | 68 -
doc/html/a00021.html | 110 +-
doc/html/a00026.html | 108 +-
doc/html/a00030.html | 41 -
doc/html/a00031.html | 45 +-
doc/html/a00032.html | 36 -
doc/html/a00033.html | 38 -
doc/html/a00034.html | 25 +-
doc/html/a00035.html | 19 +-
doc/html/a00036.html | 10 +-
doc/html/a00037.html | 11 +-
doc/html/a00038.html | 9 +-
doc/html/a00039.html | 17 +-
doc/html/a00040.html | 10 +-
doc/html/{a00037.html => a00041.html} | 6 +-
doc/html/a00042.html | 9 +-
doc/html/{a00039.html => a00043.html} | 14 +-
doc/html/a00044.html | 14 +-
doc/html/a00045.html | 49 -
doc/html/a00046.html | 30 +-
doc/html/a00047.html | 43 -
doc/html/a00048.html | 16 +-
doc/html/a00049.html | 20 +-
doc/html/a00050.html | 26 +-
doc/html/a00051.html | 24 +-
doc/html/a00052.html | 41 -
doc/html/a00053.html | 20 +-
doc/html/a00054.html | 27 +-
doc/html/{a00049.html => a00055.html} | 16 +-
doc/html/a00056.html | 14 +-
doc/html/{a00051.html => a00057.html} | 20 +-
doc/html/a00058.html | 27 +-
doc/html/a00059.html | 16 +-
doc/html/a00060.html | 19 +-
doc/html/a00061.html | 24 +-
doc/html/a00062.html | 28 +-
doc/html/{a00054.html => a00063.html} | 38 +-
doc/html/a00064.html | 86 -
doc/html/a00065.html | 59 +-
doc/html/a00066.html | 39 -
doc/html/{a00058.html => a00067.html} | 22 +-
doc/html/{a00059.html => a00068.html} | 18 +-
doc/html/{a00060.html => a00069.html} | 24 +-
doc/html/{a00061.html => a00070.html} | 20 +-
doc/html/{a00085.html => a00072.html} | 5 +-
doc/html/a00073.html | 29 +-
doc/html/a00075.html | 77 +-
doc/html/a00076.html | 82 +
doc/html/a00077.html | 15 +-
doc/html/a00079.html | 44 -
doc/html/a00084.html | 14 +-
doc/html/a00086.html | 26 +-
doc/html/a00087.html | 38 -
doc/html/a00088.html | 19 +-
doc/html/a00090.html | 21 +-
doc/html/a00091.html | 36 -
doc/html/{a00081.html => a00092.html} | 12 +-
doc/html/{a00083.html => a00094.html} | 8 +-
doc/html/{a00084.html => a00095.html} | 6 +-
doc/html/{a00085.html => a00096.html} | 6 +-
doc/html/{a00086.html => a00097.html} | 6 +-
doc/html/a00098.html | 11 +-
doc/html/{a00088.html => a00099.html} | 28 +-
doc/html/{a00089.html => a00100.html} | 30 +-
doc/html/a00101.html | 12 +-
doc/html/a00102.html | 17 +-
doc/html/{a00098.html => a00109.html} | 6 +-
doc/html/{a00101.html => a00113.html} | 10 +-
doc/html/{a00102.html => a00114.html} | 22 +-
doc/html/a00120.html | 62 -
doc/html/a00121.html | 63 -
doc/html/a00123.html | 56 -
doc/html/a00124.html | 59 -
doc/html/a00126.html | 72 -
doc/html/a00127.html | 224 --
doc/html/a00128.html | 86 -
doc/html/a00129.html | 93 -
doc/html/a00130.html | 114 -
doc/html/a00132.html | 157 -
doc/html/a00133.html | 84 -
doc/html/a00134.html | 306 --
doc/html/a00135.html | 646 ----
doc/html/a00136.html | 68 -
doc/html/a00136.png | Bin 1172 -> 0 bytes
doc/html/a00137.html | 68 -
doc/html/a00138.html | 91 -
doc/html/a00138.png | Bin 1172 -> 0 bytes
doc/html/a00139.html | 169 -
doc/html/a00140.html | 154 -
doc/html/a00141.html | 572 +--
doc/html/a00142.html | 39 +-
doc/html/a00143.html | 167 +-
doc/html/a00144.html | 184 +-
doc/html/a00145.html | 36 +-
doc/html/a00146.html | 36 +-
doc/html/a00147.html | 18 +-
doc/html/a00148.html | 194 +-
doc/html/a00149.html | 161 +-
doc/html/a00150.html | 102 +-
doc/html/a00151.html | 117 +-
doc/html/a00152.html | 42 +-
doc/html/a00153.html | 130 +-
doc/html/{a00132.png => a00153.png} | Bin
doc/html/a00154.html | 63 +-
doc/html/a00155.html | 281 +-
doc/html/{a00134.png => a00155.png} | Bin
doc/html/a00156.html | 621 +++-
doc/html/a00157.html | 120 +-
doc/html/a00157.png | Bin 0 -> 1379 bytes
doc/html/a00158.html | 86 +-
doc/html/a00159.html | 68 +-
doc/html/a00159.png | Bin 0 -> 1385 bytes
doc/html/a00160.html | 150 +-
doc/html/a00161.html | 113 +-
doc/html/{a00140.png => a00161.png} | Bin
doc/html/a00162.html | 575 ++-
doc/html/a00163.html | 131 +-
doc/html/{a00142.png => a00163.png} | Bin
doc/html/a00164.html | 196 +-
doc/html/a00165.html | 137 +-
doc/html/{a00144.png => a00165.png} | Bin
doc/html/a00166.html | 93 +-
doc/html/a00167.html | 40 +-
doc/html/a00168.html | 36 +-
doc/html/a00169.html | 101 +-
doc/html/a00170.html | 67 +-
doc/html/a00171.html | 138 +-
doc/html/{a00149.png => a00171.png} | Bin
doc/html/a00172.html | 157 +-
doc/html/a00173.html | 50 +-
doc/html/a00174.html | 584 +--
doc/html/a00175.html | 208 +-
doc/html/a00176.html | 57 +-
doc/html/a00177.html | 139 +-
doc/html/a00178.html | 109 +-
doc/html/a00179.html | 115 +-
doc/html/a00180.html | 157 +-
doc/html/a00181.html | 64 +-
doc/html/a00182.html | 106 +-
doc/html/a00183.html | 76 +-
doc/html/a00184.html | 70 +-
doc/html/a00185.html | 98 +-
doc/html/a00186.html | 204 +-
doc/html/a00187.html | 49 +-
doc/html/a00188.html | 65 +
doc/html/{a00164.html => a00189.html} | 37 +-
doc/html/{a00165.html => a00190.html} | 26 +-
doc/html/{a00166.html => a00191.html} | 22 +-
doc/html/{a00131.html => a00192.html} | 26 +-
doc/html/{a00125.html => a00193.html} | 28 +-
doc/html/{a00169.html => a00194.html} | 26 +-
doc/html/{a00170.html => a00195.html} | 24 +-
doc/html/{a00171.html => a00196.html} | 30 +-
doc/html/{a00172.html => a00197.html} | 60 +-
doc/html/{a00173.html => a00198.html} | 10 +-
doc/html/{a00174.html => a00199.html} | 237 +-
doc/html/{a00174.png => a00199.png} | Bin
doc/html/{a00142.html => a00200.html} | 26 +-
doc/html/{a00175.html => a00201.html} | 34 +-
doc/html/{a00176.html => a00202.html} | 27 +-
doc/html/{a00177.html => a00203.html} | 36 +-
doc/html/{a00178.html => a00204.html} | 30 +-
doc/html/{a00179.html => a00205.html} | 12 +-
doc/html/{a00180.html => a00206.html} | 50 +-
doc/html/{a00180.png => a00206.png} | Bin
doc/html/{a00181.html => a00207.html} | 20 +-
doc/html/{a00122.html => a00208.html} | 35 +-
doc/html/{a00182.html => a00209.html} | 22 +-
doc/html/{a00182.png => a00209.png} | Bin
doc/html/{a00183.html => a00210.html} | 22 +-
doc/html/{a00184.html => a00211.html} | 28 +-
doc/html/{a00185.html => a00212.html} | 10 +-
doc/html/{a00186.html => a00213.html} | 16 +-
doc/html/{a00187.html => a00214.html} | 12 +-
doc/html/a00241.html | 344 --
doc/html/a00242.html | 47 -
doc/html/a00243.html | 313 --
doc/html/a00244.html | 56 -
doc/html/a00246.html | 44 -
doc/html/a00247.html | 921 -----
doc/html/{a00218.html => a00248.html} | 32 +-
doc/html/{a00237.html => a00267.html} | 415 ++-
doc/html/{a00240.html => a00273.html} | 16 +-
doc/html/a00274.html | 429 ++-
doc/html/a00275.html | 121 +-
doc/html/a00276.html | 402 ++-
doc/html/a00277.html | 157 +-
doc/html/{a00245.html => a00278.html} | 6 +-
doc/html/a00279.html | 98 +-
doc/html/a00280.html | 2066 +++++------
doc/html/a00293.html | 914 -----
doc/html/a00298.html | 1446 ++++++++
doc/html/a00305.html | 872 -----
doc/html/{a00263.html => a00308.html} | 2 +-
doc/html/{a00265.html => a00310.html} | 8 +-
doc/html/{a00266.html => a00311.html} | 50 +-
doc/html/a00313.html | 238 --
doc/html/a00315.html | 81 -
doc/html/a00316.html | 83 -
doc/html/a00317.html | 480 ---
doc/html/{a00274.html => a00319.html} | 40 +-
doc/html/{a00275.html => a00320.html} | 38 +-
doc/html/{a00276.html => a00321.html} | 54 +-
doc/html/{a00277.html => a00322.html} | 28 +-
doc/html/{a00279.html => a00324.html} | 48 +-
doc/html/a00325.html | 1253 +++++++
doc/html/{a00292.html => a00335.html} | 426 +--
doc/html/a00336.html | 263 ++
doc/html/a00338.html | 360 --
doc/html/a00341.html | 924 +++++
doc/html/a00342.html | 341 --
doc/html/{a00302.html => a00350.html} | 2 +-
doc/html/a00353.html | 1019 ++++++
doc/html/a00360.html | 237 --
doc/html/a00361.html | 124 -
doc/html/a00362.html | 293 +-
doc/html/a00363.html | 247 --
doc/html/a00364.html | 184 +-
doc/html/a00365.html | 179 +-
doc/html/a00366.html | 588 ++-
doc/html/a00367.html | 609 ----
doc/html/{a00326.html => a00375.html} | 111 +-
doc/html/a00376.html | 266 --
doc/html/{a00330.html => a00379.html} | 12 +-
doc/html/{a00332.html => a00381.html} | 54 +-
doc/html/a00387.html | 457 ++-
doc/html/a00391.html | 401 ++-
doc/html/a00393.html | 300 --
doc/html/{a00347.html => a00396.html} | 18 +-
doc/html/{a00351.html => a00400.html} | 40 +-
doc/html/a00403.html | 299 --
doc/html/{a00355.html => a00404.html} | 52 +-
doc/html/a00409.html | 491 +++
doc/html/a00420.html | 136 +
doc/html/a00421.html | 168 +
doc/html/a00422.html | 179 +
doc/html/a00423.html | 246 ++
doc/html/{a00364.html => a00424.html} | 48 +-
doc/html/{a00365.html => a00425.html} | 64 +-
doc/html/{a00366.html => a00426.html} | 243 +-
doc/html/a00427.html | 656 ++++
doc/html/a00436.html | 265 ++
doc/html/{a00383.html => a00443.html} | 26 +-
doc/html/{a00384.html => a00444.html} | 4 +-
doc/html/{a00386.html => a00446.html} | 69 +-
doc/html/{a00387.html => a00447.html} | 295 +-
doc/html/{a00391.html => a00451.html} | 175 +-
doc/html/{a00392.html => a00452.html} | 31 +-
doc/html/a00453.html | 321 ++
doc/html/{a00394.html => a00454.html} | 1102 +++---
doc/html/{a00397.html => a00458.html} | 4 +-
doc/html/{a00398.html => a00459.html} | 198 +-
doc/html/a00466.html | 310 ++
doc/html/{a00411.html => a00474.html} | 2 +-
doc/html/{a00413.html => a00476.html} | 54 +-
doc/html/annotated.html | 144 +-
doc/html/concepts.html | 2 +-
doc/html/deprecated.html | 9 +-
doc/html/files.html | 101 +-
doc/html/functions.html | 394 +--
doc/html/functions_enum.html | 8 +-
doc/html/functions_eval.html | 18 +-
doc/html/functions_func.html | 343 +-
doc/html/functions_rela.html | 6 +-
doc/html/functions_type.html | 23 +-
doc/html/functions_vars.html | 8 +-
doc/html/globals.html | 20 +-
doc/html/globals_func.html | 20 +-
doc/html/hierarchy.html | 146 +-
doc/html/index.html | 2 +-
doc/html/modules.html | 14 +-
doc/html/namespacemembers.html | 39 +-
doc/html/namespacemembers_enum.html | 7 +-
doc/html/namespacemembers_eval.html | 9 +-
doc/html/namespacemembers_func.html | 26 +-
doc/html/namespacemembers_type.html | 5 +-
doc/html/namespacemembers_vars.html | 45 -
doc/html/namespaces.html | 6 +-
doc/html/pages.html | 2 +-
doc/html/parallel_do_body_req.html | 2 +-
doc/html/parallel_for_body_req.html | 2 +-
doc/html/parallel_reduce_body_req.html | 2 +-
doc/html/parallel_reduce_lambda_req.html | 2 +-
doc/html/parallel_scan_body_req.html | 2 +-
doc/html/parallel_sort_iter_req.html | 2 +-
doc/html/range_req.html | 2 +-
examples/GettingStarted/sub_string_finder/Makefile | 4 +-
.../sub_string_finder/Makefile.windows | 13 +-
.../GettingStarted/sub_string_finder/index.html | 6 +-
.../msvs/sub_string_finder.icproj | 11 +
.../{vc8 => msvs}/sub_string_finder.vcproj | 704 ++--
.../sub_string_finder_cl.sln} | 100 +-
.../msvs/sub_string_finder_extended.icproj | 11 +
.../sub_string_finder_extended.vcproj | 704 ++--
.../sub_string_finder_icl.sln} | 124 +-
.../msvs/sub_string_finder_pretty.icproj | 11 +
.../{vc8 => msvs}/sub_string_finder_pretty.vcproj | 704 ++--
.../sub_string_finder/sub_string_finder.cpp | 71 +-
.../sub_string_finder/vc7.1/sub_string_finder.sln | 40 -
.../sub_string_finder/vc7.1/sub_string_finder.suo | Bin 11264 -> 0 bytes
.../vc7.1/sub_string_finder.vcproj | 128 -
.../vc7.1/sub_string_finder_extended.vcproj | 128 -
.../vc7.1/sub_string_finder_pretty.vcproj | 128 -
.../sub_string_finder/vc8/sub_string_finder.suo | Bin 16896 -> 0 bytes
.../sub_string_finder/vc9/sub_string_finder.suo | Bin 9728 -> 0 bytes
.../sub_string_finder/vc9/sub_string_finder.vcproj | 349 --
.../vc9/sub_string_finder_extended.vcproj | 349 --
.../vc9/sub_string_finder_pretty.vcproj | 349 --
examples/Makefile | 11 +-
examples/common/copy_libraries.bat | 66 +
examples/common/gui/Makefile.win | 31 +-
.../concurrent_hash_map/count_strings/Makefile | 4 +-
.../count_strings/Makefile.windows | 14 +-
.../concurrent_hash_map/count_strings/index.html | 6 +-
.../count_strings/msvs/count_strings.icproj | 11 +
.../{vc8 => msvs}/count_strings.vcproj | 712 ++--
.../count_strings_cl.sln} | 51 +-
.../count_strings_icl.sln} | 58 +-
.../count_strings/vc7.1/count_strings.sln | 21 -
.../count_strings/vc7.1/count_strings.suo | Bin 8704 -> 0 bytes
.../count_strings/vc7.1/count_strings.vcproj | 131 -
.../count_strings/vc8/count_strings.suo | Bin 9216 -> 0 bytes
.../count_strings/vc9/count_strings.suo | Bin 7680 -> 0 bytes
.../count_strings/vc9/count_strings.vcproj | 353 --
examples/index.html | 25 +-
examples/parallel_do/parallel_preorder/Makefile | 4 +-
.../parallel_do/parallel_preorder/Makefile.windows | 13 +-
examples/parallel_do/parallel_preorder/index.html | 6 +-
.../msvs/parallel_preorder.icproj | 11 +
.../{vc8 => msvs}/parallel_preorder.vcproj | 748 ++--
.../msvs/parallel_preorder_cl.sln} | 50 +-
.../parallel_preorder_icl.sln} | 58 +-
.../parallel_preorder/vc7.1/parallel_preorder.sln | 21 -
.../parallel_preorder/vc7.1/parallel_preorder.suo | Bin 7168 -> 0 bytes
.../vc7.1/parallel_preorder.vcproj | 145 -
.../parallel_preorder/vc8/parallel_preorder.suo | Bin 7680 -> 0 bytes
.../parallel_preorder/vc9/parallel_preorder.sln | 25 -
.../parallel_preorder/vc9/parallel_preorder.suo | Bin 7680 -> 0 bytes
.../parallel_preorder/vc9/parallel_preorder.vcproj | 371 --
examples/parallel_for/game_of_life.NET/Makefile | 3 +
.../parallel_for/game_of_life.NET/Makefile.windows | 9 +-
examples/parallel_for/game_of_life.NET/index.html | 4 +-
.../{vc8 => msvs}/Game_of_life.sln | 74 +-
.../{vc8 => msvs}/Game_of_life.vcproj | 1588 ++++-----
.../game_of_life.NET/{vc8 => msvs}/app.ico | Bin
.../game_of_life.NET/{vc8 => msvs}/app.rc | 0
.../game_of_life.NET/{vc8 => msvs}/resource.h | 0
.../game_of_life.NET/vc9/Game_of_life.sln | 37 -
.../game_of_life.NET/vc9/Game_of_life.vcproj | 792 -----
examples/parallel_for/game_of_life.NET/vc9/app.ico | Bin 1078 -> 0 bytes
examples/parallel_for/game_of_life.NET/vc9/app.rc | 63 -
.../parallel_for/game_of_life.NET/vc9/resource.h | 3 -
examples/parallel_for/polygon_overlay/Makefile | 4 +-
.../parallel_for/polygon_overlay/Makefile.windows | 28 +-
examples/parallel_for/polygon_overlay/index.html | 6 +-
.../parallel_for/polygon_overlay/msvs/pover.icproj | 11 +
.../polygon_overlay/{vc7.1 => msvs}/pover.rc | 0
.../polygon_overlay/{vc8 => msvs}/pover.vcproj | 1664 ++++-----
.../{vc8/pover.sln => msvs/pover_cl.sln} | 74 +-
.../{vc9/pover.sln => msvs/pover_icl.sln} | 90 +-
.../polygon_overlay/{vc7.1 => msvs}/resource.h | 0
examples/parallel_for/polygon_overlay/rpolygon.h | 2 +-
.../parallel_for/polygon_overlay/vc7.1/pover.sln | 35 -
.../parallel_for/polygon_overlay/vc7.1/pover.suo | Bin 10240 -> 0 bytes
.../polygon_overlay/vc7.1/pover.vcproj | 500 ---
examples/parallel_for/polygon_overlay/vc8/pover.rc | 61 -
.../parallel_for/polygon_overlay/vc8/pover.suo | Bin 21504 -> 0 bytes
.../parallel_for/polygon_overlay/vc8/resource.h | 14 -
examples/parallel_for/polygon_overlay/vc9/pover.rc | 61 -
.../parallel_for/polygon_overlay/vc9/pover.suo | Bin 8192 -> 0 bytes
.../parallel_for/polygon_overlay/vc9/pover.vcproj | 825 -----
.../parallel_for/polygon_overlay/vc9/resource.h | 14 -
examples/parallel_for/seismic/Makefile | 4 +-
examples/parallel_for/seismic/Makefile.windows | 28 +-
.../parallel_for/seismic/SeismicSimulation.cpp | 2 +-
examples/parallel_for/seismic/index.html | 6 +-
.../seismic/{vc7.1 => msvs}/SeismicSimulation.ico | Bin
.../seismic/msvs/SeismicSimulation.icproj | 11 +
.../seismic/{vc8 => msvs}/SeismicSimulation.rc | 0
.../seismic/{vc8 => msvs}/SeismicSimulation.vcproj | 1640 ++++-----
.../SeismicSimulation_cl.sln} | 74 +-
.../SeismicSimulation_icl.sln} | 90 +-
.../seismic/{vc7.1 => msvs}/resource.h | 0
.../parallel_for/seismic/{vc7.1 => msvs}/small.ico | Bin
.../seismic/vc7.1/SeismicSimulation.rc | 146 -
.../seismic/vc7.1/SeismicSimulation.sln | 27 -
.../seismic/vc7.1/SeismicSimulation.suo | Bin 13312 -> 0 bytes
.../seismic/vc7.1/SeismicSimulation.vcproj | 313 --
.../parallel_for/seismic/vc8/SeismicSimulation.ico | Bin 23558 -> 0 bytes
.../parallel_for/seismic/vc8/SeismicSimulation.suo | Bin 11264 -> 0 bytes
examples/parallel_for/seismic/vc8/resource.h | 32 -
.../parallel_for/seismic/vc9/SeismicSimulation.ico | Bin 23558 -> 0 bytes
.../parallel_for/seismic/vc9/SeismicSimulation.rc | 145 -
.../parallel_for/seismic/vc9/SeismicSimulation.suo | Bin 8192 -> 0 bytes
.../seismic/vc9/SeismicSimulation.vcproj | 813 -----
examples/parallel_for/seismic/vc9/resource.h | 32 -
examples/parallel_for/seismic/vc9/small.ico | Bin 23558 -> 0 bytes
examples/parallel_for/tachyon/Makefile | 4 +-
examples/parallel_for/tachyon/Makefile.windows | 24 +-
examples/parallel_for/tachyon/index.html | 8 +-
.../parallel_for/tachyon/{vc7.1 => msvs}/gui.ico | Bin
.../parallel_for/tachyon/{vc7.1 => msvs}/gui.rc | 0
.../tachyon/{vc7.1 => msvs}/resource.h | 0
.../{seismic/vc8 => tachyon/msvs}/small.ico | Bin
examples/parallel_for/tachyon/msvs/tachyon.icproj | 11 +
.../tachyon/msvs/tachyon.serial.icproj | 11 +
.../tachyon/{vc8 => msvs}/tachyon.serial.vcproj | 1390 ++++----
.../parallel_for/tachyon/msvs/tachyon.tbb.icproj | 11 +
.../tachyon/{vc8 => msvs}/tachyon.tbb.vcproj | 1462 ++++----
.../parallel_for/tachyon/msvs/tachyon.tbb1d.icproj | 11 +
.../tachyon/{vc8 => msvs}/tachyon.tbb1d.vcproj | 1462 ++++----
.../tachyon/{vc8 => msvs}/tachyon.vcproj | 2092 +++++------
.../{vc8/tachyon.sln => msvs/tachyon_cl.sln} | 184 +-
.../{vc8/tachyon.sln => msvs/tachyon_icl.sln} | 248 +-
examples/parallel_for/tachyon/vc7.1/small.ico | Bin 23558 -> 0 bytes
.../tachyon/vc7.1/tachyon.serial.vcproj | 247 --
examples/parallel_for/tachyon/vc7.1/tachyon.sln | 63 -
examples/parallel_for/tachyon/vc7.1/tachyon.suo | Bin 19968 -> 0 bytes
.../parallel_for/tachyon/vc7.1/tachyon.tbb.vcproj | 259 --
.../tachyon/vc7.1/tachyon.tbb1d.vcproj | 259 --
examples/parallel_for/tachyon/vc7.1/tachyon.vcproj | 494 ---
examples/parallel_for/tachyon/vc8/tachyon.suo | Bin 33792 -> 0 bytes
.../parallel_for/tachyon/vc9/tachyon.serial.vcproj | 687 ----
examples/parallel_for/tachyon/vc9/tachyon.sln | 92 -
examples/parallel_for/tachyon/vc9/tachyon.suo | Bin 15872 -> 0 bytes
.../parallel_for/tachyon/vc9/tachyon.tbb.vcproj | 723 ----
.../parallel_for/tachyon/vc9/tachyon.tbb1d.vcproj | 723 ----
examples/parallel_for/tachyon/vc9/tachyon.vcproj | 1039 ------
examples/parallel_reduce/convex_hull/Makefile | 4 +-
.../parallel_reduce/convex_hull/Makefile.windows | 13 +-
.../convex_hull/convex_hull_sample.cpp | 2 +
examples/parallel_reduce/convex_hull/index.html | 6 +-
.../convex_hull/msvs/convex_hull_benchmark.icproj | 11 +
.../{vc8 => msvs}/convex_hull_benchmark.vcproj | 732 ++--
.../convex_hull.sln => msvs/convex_hull_cl.sln} | 70 +-
.../convex_hull.sln => msvs/convex_hull_icl.sln} | 86 +-
.../convex_hull/msvs/convex_hull_sample.icproj | 11 +
.../{vc8 => msvs}/convex_hull_sample.vcproj | 728 ++--
.../convex_hull/vc7.1/convex_hull.sln | 32 -
.../convex_hull/vc7.1/convex_hull.suo | Bin 10240 -> 0 bytes
.../convex_hull/vc7.1/convex_hull_bench.vcproj | 140 -
.../convex_hull/vc7.1/convex_hull_sample.vcproj | 140 -
.../convex_hull/vc8/convex_hull.suo | Bin 12288 -> 0 bytes
.../convex_hull/vc9/convex_hull.suo | Bin 8704 -> 0 bytes
.../convex_hull/vc9/convex_hull_benchmark.vcproj | 363 --
.../convex_hull/vc9/convex_hull_sample.vcproj | 361 --
examples/parallel_reduce/primes/Makefile | 4 +-
examples/parallel_reduce/primes/Makefile.windows | 13 +-
examples/parallel_reduce/primes/index.html | 6 +-
examples/parallel_reduce/primes/msvs/primes.icproj | 11 +
.../primes/{vc8 => msvs}/primes.vcproj | 712 ++--
.../primes/{vc8/primes.sln => msvs/primes_cl.sln} | 50 +-
.../convex_hull.sln => primes/msvs/primes_icl.sln} | 68 +-
examples/parallel_reduce/primes/vc7.1/primes.sln | 21 -
examples/parallel_reduce/primes/vc7.1/primes.suo | Bin 9216 -> 0 bytes
.../parallel_reduce/primes/vc7.1/primes.vcproj | 131 -
examples/parallel_reduce/primes/vc8/primes.suo | Bin 9216 -> 0 bytes
examples/parallel_reduce/primes/vc9/primes.sln | 25 -
examples/parallel_reduce/primes/vc9/primes.suo | Bin 7680 -> 0 bytes
examples/parallel_reduce/primes/vc9/primes.vcproj | 353 --
examples/parallel_while/index.html | 25 -
.../parallel_while/parallel_preorder/Graph.cpp | 109 -
examples/parallel_while/parallel_preorder/Makefile | 46 -
examples/parallel_while/parallel_preorder/Matrix.h | 68 -
.../parallel_while/parallel_preorder/index.html | 95 -
.../parallel_preorder/parallel_preorder.cpp | 196 -
.../parallel_preorder/vc7.1/parallel_preorder.sln | 21 -
.../parallel_preorder/vc7.1/parallel_preorder.suo | Bin 9216 -> 0 bytes
.../vc7.1/parallel_preorder.vcproj | 145 -
.../parallel_preorder/vc8/parallel_preorder.suo | Bin 9728 -> 0 bytes
.../parallel_preorder/vc8/parallel_preorder.vcproj | 374 --
.../parallel_preorder/vc9/parallel_preorder.sln | 25 -
.../parallel_preorder/vc9/parallel_preorder.suo | Bin 7680 -> 0 bytes
.../parallel_preorder/vc9/parallel_preorder.vcproj | 371 --
.../parallel_preorder.xcodeproj/project.pbxproj | 314 --
examples/pipeline/index.html | 2 -
examples/pipeline/square/Makefile | 12 +-
examples/pipeline/square/Makefile.windows | 13 +-
examples/pipeline/square/index.html | 6 +-
examples/pipeline/square/msvs/gen_input.icproj | 11 +
.../pipeline/square/{vc8 => msvs}/gen_input.vcproj | 708 ++--
examples/pipeline/square/msvs/square.icproj | 11 +
.../pipeline/square/{vc8 => msvs}/square.vcproj | 760 ++--
.../square/{vc8 => msvs}/square.vcproj.user | 74 +-
.../square/{vc8/square.sln => msvs/square_cl.sln} | 76 +-
.../square/{vc9/square.sln => msvs/square_icl.sln} | 92 +-
examples/pipeline/square/square.cpp | 30 +-
examples/pipeline/square/vc7.1/gen_input.vcproj | 132 -
examples/pipeline/square/vc7.1/square.sln | 30 -
examples/pipeline/square/vc7.1/square.vcproj | 138 -
examples/pipeline/square/vc9/gen_input.vcproj | 347 --
examples/pipeline/square/vc9/square.vcproj | 375 --
examples/pipeline/square/vc9/square.vcproj.user | 37 -
examples/pipeline/text_filter/Makefile | 49 -
examples/pipeline/text_filter/Makefile.windows | 50 -
examples/pipeline/text_filter/index.html | 58 -
examples/pipeline/text_filter/text_filter.cpp | 244 --
.../pipeline/text_filter/vc7.1/text_filter.sln | 21 -
.../pipeline/text_filter/vc7.1/text_filter.suo | Bin 13312 -> 0 bytes
.../pipeline/text_filter/vc7.1/text_filter.vcproj | 137 -
examples/pipeline/text_filter/vc8/text_filter.sln | 25 -
examples/pipeline/text_filter/vc8/text_filter.suo | Bin 9728 -> 0 bytes
.../pipeline/text_filter/vc8/text_filter.vcproj | 368 --
examples/pipeline/text_filter/vc9/text_filter.sln | 25 -
examples/pipeline/text_filter/vc9/text_filter.suo | Bin 7680 -> 0 bytes
.../pipeline/text_filter/vc9/text_filter.vcproj | 365 --
.../xcode/text_filter.xcodeproj/project.pbxproj | 324 --
examples/task/tree_sum/Makefile | 4 +-
examples/task/tree_sum/Makefile.windows | 13 +-
examples/task/tree_sum/index.html | 6 +-
examples/task/tree_sum/msvs/tree_sum.icproj | 11 +
.../task/tree_sum/{vc8 => msvs}/tree_sum.vcproj | 744 ++--
.../{vc8/tree_sum.sln => msvs/tree_sum_cl.sln} | 50 +-
.../{vc8/tree_sum.sln => msvs/tree_sum_icl.sln} | 58 +-
examples/task/tree_sum/vc7.1/tree_sum.sln | 21 -
examples/task/tree_sum/vc7.1/tree_sum.suo | Bin 9216 -> 0 bytes
examples/task/tree_sum/vc7.1/tree_sum.vcproj | 147 -
examples/task/tree_sum/vc8/tree_sum.suo | Bin 9216 -> 0 bytes
examples/task/tree_sum/vc9/tree_sum.suo | Bin 8704 -> 0 bytes
examples/task/tree_sum/vc9/tree_sum.vcproj | 369 --
examples/task_group/index.html | 24 +
.../primes => task_group/sudoku}/Makefile | 12 +-
.../sudoku}/Makefile.windows | 12 +-
examples/task_group/sudoku/index.html | 66 +
examples/task_group/sudoku/input1 | 19 +
examples/task_group/sudoku/input2 | 18 +
examples/task_group/sudoku/input3 | 19 +
examples/task_group/sudoku/input4 | 19 +
examples/task_group/sudoku/msvs/sudoku.icproj | 11 +
.../sudoku/msvs/sudoku.vcproj} | 42 +-
.../sudoku/msvs/sudoku_cl.sln} | 6 +-
.../sudoku/msvs/sudoku_icl.sln} | 58 +-
examples/task_group/sudoku/sudoku.cpp | 284 ++
examples/test_all/fibonacci/Makefile | 4 +-
examples/test_all/fibonacci/Makefile.windows | 13 +-
examples/test_all/fibonacci/index.html | 6 +-
examples/test_all/fibonacci/msvs/fibonacci.icproj | 11 +
.../fibonacci/{vc8 => msvs}/fibonacci.vcproj | 712 ++--
.../{vc8/fibonacci.sln => msvs/fibonacci_cl.sln} | 50 +-
.../{vc9/fibonacci.sln => msvs/fibonacci_icl.sln} | 58 +-
examples/test_all/fibonacci/vc7.1/fibonacci.sln | 21 -
examples/test_all/fibonacci/vc7.1/fibonacci.suo | Bin 8704 -> 0 bytes
examples/test_all/fibonacci/vc7.1/fibonacci.vcproj | 130 -
examples/test_all/fibonacci/vc8/fibonacci.suo | Bin 8704 -> 0 bytes
examples/test_all/fibonacci/vc9/fibonacci.suo | Bin 8704 -> 0 bytes
examples/test_all/fibonacci/vc9/fibonacci.vcproj | 353 --
include/tbb/_concurrent_queue_internal.h | 151 +-
include/tbb/_concurrent_unordered_internal.h | 1440 ++++++++
include/tbb/blocked_range.h | 2 +-
include/tbb/combinable.h | 14 +-
include/tbb/compat/condition_variable | 459 +++
include/tbb/compat/ppl.h | 6 +-
.../tbb/compat/thread | 35 +-
include/tbb/concurrent_hash_map.h | 52 +-
include/tbb/concurrent_queue.h | 30 +-
include/tbb/concurrent_unordered_map.h | 241 ++
include/tbb/concurrent_vector.h | 66 +-
include/tbb/enumerable_thread_specific.h | 653 ++--
include/tbb/machine/linux_common.h | 2 +
include/tbb/machine/linux_ia32.h | 38 +-
include/tbb/machine/linux_intel64.h | 20 +-
include/tbb/machine/windows_ia32.h | 9 +-
include/tbb/machine/xbox360_ppc.h | 85 +
include/tbb/mutex.h | 43 +-
include/tbb/parallel_do.h | 36 +-
include/tbb/parallel_for.h | 25 +-
include/tbb/parallel_for_each.h | 2 +-
include/tbb/parallel_reduce.h | 34 +-
include/tbb/parallel_scan.h | 20 +-
include/tbb/parallel_while.h | 2 +-
include/tbb/partitioner.h | 14 +-
include/tbb/pipeline.h | 281 +-
include/tbb/queuing_mutex.h | 16 +-
include/tbb/queuing_rw_mutex.h | 14 +-
include/tbb/reader_writer_lock.h | 240 ++
include/tbb/recursive_mutex.h | 30 +-
include/tbb/spin_mutex.h | 2 +-
include/tbb/spin_rw_mutex.h | 1 -
include/tbb/task.h | 200 +-
include/tbb/task_group.h | 21 +-
include/tbb/task_scheduler_observer.h | 2 +-
include/tbb/tbb.h | 3 +
include/tbb/tbb_allocator.h | 13 +-
include/tbb/tbb_config.h | 65 +-
include/tbb/tbb_exception.h | 55 +-
include/tbb/tbb_machine.h | 48 +
include/tbb/tbb_profiling.h | 2 +-
include/tbb/tbb_stddef.h | 59 +-
include/tbb/tbb_thread.h | 31 +-
src/Makefile | 28 +-
src/index.html | 43 +
src/old/concurrent_queue_v2.cpp | 4 +-
src/old/concurrent_queue_v2.h | 2 +-
src/old/concurrent_vector_v2.cpp | 15 +-
src/old/concurrent_vector_v2.h | 20 +-
src/old/spin_rw_mutex_v2.cpp | 6 +-
src/old/spin_rw_mutex_v2.h | 2 +-
src/{tbb/itt_notify_proxy.c => old/task_v2.cpp} | 35 +-
src/old/test_task_v2.cpp | 123 +
src/perf/statistics.cpp | 68 -
src/perf/time_framework.h | 1 +
src/perf/time_sandbox.h | 2 +-
src/perf/time_vector.cpp | 1 +
src/rml/client/rml_factory.h | 10 +-
src/rml/include/rml_base.h | 22 +-
src/rml/include/rml_omp.h | 35 +-
src/rml/include/rml_tbb.h | 18 +-
src/rml/server/irml.rc | 2 +-
src/rml/server/job_automaton.h | 12 +-
src/rml/server/rml_server.cpp | 2606 ++++++++++++--
src/rml/server/thread_monitor.h | 7 +-
src/rml/test/test_rml_mixed.cpp | 9 +
src/rml/test/test_rml_omp.cpp | 86 +-
src/rml/test/test_rml_tbb.cpp | 124 +-
src/rml/test/test_server.h | 94 +-
src/rml/test/test_thread_monitor.cpp | 3 +-
src/tbb/arena.cpp | 386 ++
src/tbb/arena.h | 482 +++
src/tbb/cache_aligned_allocator.cpp | 24 +-
src/tbb/concurrent_monitor.cpp | 109 +
src/tbb/concurrent_monitor.h | 295 ++
src/tbb/concurrent_queue.cpp | 367 +-
src/tbb/concurrent_vector.cpp | 45 +-
src/tbb/condition_variable.cpp | 213 ++
src/tbb/custom_scheduler.h | 473 +++
src/tbb/dynamic_link.cpp | 4 +
src/tbb/dynamic_link.h | 6 +
src/tbb/enumerable_thread_specific.cpp | 172 -
src/tbb/governor.cpp | 241 ++
src/tbb/governor.h | 189 +
src/tbb/intrusive_list.h | 255 ++
src/tbb/itt_notify.cpp | 267 +-
src/tbb/itt_notify.h | 114 +-
src/tbb/lin32-tbb-export.def | 40 +-
src/tbb/lin64-tbb-export.def | 27 +-
src/tbb/lin64ipf-tbb-export.def | 27 +-
src/tbb/mac32-tbb-export.def | 24 +-
src/tbb/mac64-tbb-export.def | 24 +-
src/tbb/mailbox.h | 193 +
src/tbb/market.cpp | 304 ++
src/tbb/market.h | 210 ++
src/tbb/observer_proxy.cpp | 237 ++
.../Graph.h => src/tbb/observer_proxy.h | 91 +-
src/tbb/pipeline.cpp | 29 +-
src/tbb/private_server.cpp | 20 +-
src/tbb/queuing_rw_mutex.cpp | 4 +-
src/tbb/reader_writer_lock.cpp | 356 ++
src/tbb/scheduler.cpp | 1179 +++++++
src/tbb/scheduler.h | 552 +++
src/tbb/scheduler_common.h | 165 +
src/tbb/scheduler_utility.h | 198 ++
src/tbb/task.cpp | 3733 +-------------------
src/tbb/task_group_context.cpp | 285 ++
src/tbb/task_stream.h | 170 +
src/tbb/tbb_main.cpp | 249 ++
src/tbb/tbb_main.h | 106 +
src/tbb/tbb_misc.cpp | 116 +-
src/tbb/tbb_misc.h | 135 +-
src/tbb/tbb_thread.cpp | 42 +-
src/tbb/tls.h | 6 +
src/tbb/tools_api/_ittnotify_static.h | 166 -
.../{_disable_warnings.h => disable_warnings.h} | 17 +-
src/tbb/tools_api/internal/ittnotify.h | 661 ++++
src/tbb/tools_api/ittnotify.h | 2173 ++++++------
.../tools_api/{_config.h => ittnotify_config.h} | 19 +-
src/tbb/tools_api/ittnotify_static.c | 755 ++--
src/tbb/tools_api/ittnotify_static.h | 231 ++
.../tbb/tools_api/ittnotify_types.h | 93 +-
src/tbb/tools_api/legacy/ittnotify.h | 817 +++++
src/tbb/tools_api/prototype/ittnotify.h | 148 +
src/tbb/win32-tbb-export.def | 34 +-
src/tbb/win64-tbb-export.def | 34 +-
src/tbb/xbox360-tbb-export.def | 234 ++
src/tbbmalloc/MemoryAllocator.cpp | 378 +-
src/tbbmalloc/proxy.cpp | 65 +-
src/tbbmalloc/tbb_function_replacement.cpp | 22 +-
src/tbbmalloc/tbb_function_replacement.h | 10 +-
src/tbbmalloc/tbbmalloc.cpp | 34 +-
src/tbbmalloc/win-gcc-tbbmalloc-export.def | 36 +-
src/tbbmalloc/xbox360-tbbmalloc-export.def | 42 +
src/test/harness.h | 93 +-
src/test/harness_allocator.h | 32 +-
src/test/harness_bad_expr.h | 5 +
src/test/harness_cpu.h | 38 +-
src/test/harness_eh.h | 78 +-
.../ppl.h => src/test/harness_inject_scheduler.h | 70 +-
src/test/harness_lrb.h | 257 --
src/test/harness_lrb_host.cpp | 312 --
src/test/harness_memory.h | 16 +-
src/test/harness_report.h | 5 +-
src/test/test_allocator_STL.h | 10 +
src/test/test_assembly.cpp | 91 +-
src/test/test_atomic.cpp | 9 +-
src/test/test_blocked_range.cpp | 2 +-
src/test/test_blocked_range2d.cpp | 2 +-
src/test/test_blocked_range3d.cpp | 2 +-
src/test/test_combinable.cpp | 10 +
src/test/test_compiler.cpp | 8 +-
src/test/test_concurrent_hash_map.cpp | 37 +-
src/test/test_concurrent_monitor.cpp | 244 ++
src/test/test_concurrent_queue.cpp | 64 +-
src/test/test_concurrent_unordered.cpp | 452 +++
src/test/test_concurrent_vector.cpp | 74 +-
src/test/test_condition_variable.h | 693 ++++
src/test/test_critical_section.cpp | 5 +-
src/test/test_eh_algorithms.cpp | 315 +-
src/test/test_eh_tasks.cpp | 235 +-
src/test/test_enumerable_thread_specific.cpp | 349 +-
src/test/test_handle_perror.cpp | 32 +-
src/test/test_inits_loop.cpp | 2 +-
src/test/test_intrusive_list.cpp | 156 +
src/test/test_lambda.cpp | 24 +-
src/test/test_malloc_compliance.cpp | 19 +-
src/test/test_malloc_lib_unload.cpp | 58 +-
src/test/test_malloc_overload.cpp | 42 +-
src/test/test_malloc_regression.cpp | 56 +-
src/test/test_malloc_whitebox.cpp | 73 +-
src/test/test_model_plugin.cpp | 101 +-
src/test/test_mutex.cpp | 14 +-
src/test/test_openmp.cpp | 6 +-
src/test/test_parallel_for.cpp | 37 +-
src/test/test_parallel_for_each.cpp | 41 +-
src/test/test_parallel_invoke.cpp | 12 +-
src/test/test_parallel_pipeline.cpp | 243 ++
src/test/test_parallel_sort.cpp | 20 +-
src/test/test_pipeline_with_tbf.cpp | 7 +-
src/test/test_reader_writer_lock.cpp | 226 ++
src/test/test_rwm_upgrade_downgrade.cpp | 7 +-
.../test_std_thread.cpp} | 38 +-
src/test/test_task.cpp | 378 +-
src/test/test_task_assertions.cpp | 34 +-
src/test/test_task_auto_init.cpp | 6 +-
src/test/test_task_group.cpp | 49 +-
src/test/test_task_leaks.cpp | 110 +-
src/test/test_task_scheduler_init.cpp | 91 +-
src/test/test_task_scheduler_observer.cpp | 2 +
.../test_tbb_condition_variable.cpp} | 30 +-
src/test/test_tbb_header.cpp | 4 +
src/test/test_tbb_thread.cpp | 257 +-
src/test/test_tbb_version.cpp | 32 +-
src/test/{test_tbb_thread.cpp => test_thread.h} | 85 +-
src/test/test_user_events.cpp | 209 --
784 files changed, 54143 insertions(+), 61156 deletions(-)
diff --git a/CHANGES b/CHANGES
index 837445a..ef101f1 100644
Binary files a/CHANGES and b/CHANGES differ
diff --git a/Makefile b/Makefile
index cb2560f..f8faec0 100644
--- a/Makefile
+++ b/Makefile
@@ -72,9 +72,8 @@ clean_examples:
mkdir:
$(shell $(MD) "$(work_dir)_release" >$(NUL) 2>$(NUL))
- $(if $(subst undefined,,$(origin_build_dir)),,cd "$(work_dir)_release" && $(MAKE_TBBVARS) $(tbb_build_prefix)_release)
$(shell $(MD) "$(work_dir)_debug" >$(NUL) 2>$(NUL))
- $(if $(subst undefined,,$(origin_build_dir)),,cd "$(work_dir)_debug" && $(MAKE_TBBVARS) $(tbb_build_prefix)_debug)
+ @echo Created $(work_dir)_release and ..._debug directories
info:
@echo OS: $(tbb_os)
diff --git a/build/Makefile.rml b/build/Makefile.rml
index a02c70b..a32fdc1 100644
--- a/build/Makefile.rml
+++ b/build/Makefile.rml
@@ -24,9 +24,9 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-tbb_root ?= $(TBB22_INSTALL_DIR)
+tbb_root ?= $(TBB30_INSTALL_DIR)
BUILDING_PHASE=1
-TEST_RESOURCE = $(TBB.RES)
+TEST_RESOURCE = $(RML.RES)
include $(tbb_root)/build/common.inc
DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
@@ -71,7 +71,6 @@ LIBS += $(LIBDL)
INCLUDES += $(INCLUDE_KEY)$(RML_ROOT)/include $(INCLUDE_KEY).
T_INCLUDES = $(INCLUDES) $(INCLUDE_KEY)$(tbb_root)/src/test $(INCLUDE_KEY)$(RML_SERVER_ROOT)
-WARNING_SUPPRESS += $(RML_WARNING_SUPPRESS)
# Suppress superfluous warnings for RML compilation
R_CPLUS_FLAGS = $(subst DO_ITT_NOTIFY,DO_ITT_NOTIFY=0,$(CPLUS_FLAGS_NOSTRICT)) $(WARNING_SUPPRESS) \
@@ -142,12 +141,12 @@ test_%.$(TEST_EXT): test_%.$(OBJ) $(TBB_DEP_NON_RML_TEST)
### run_cmd is usually empty
rml_test: $(call cross_suffix,$(RML.DLL)) $(TEST_PREREQUISITE) $(RML_TESTS)
- $(run_cmd) ./test_job_automaton.$(TEST_EXT)
- $(run_cmd) ./test_thread_monitor.$(TEST_EXT)
- $(run_cmd) ./test_rml_tbb.$(TEST_EXT)
- $(run_cmd) ./test_rml_omp.$(TEST_EXT)
- $(run_cmd) ./test_rml_mixed.$(TEST_EXT)
- $(run_cmd) ./test_rml_omp_c_linkage.$(TEST_EXT)
+ $(run_cmd) ./test_job_automaton.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_thread_monitor.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_tbb.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_omp.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_mixed.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_omp_c_linkage.$(TEST_EXT) $(args)
#------------------------------------------------------
# End of rules for making the TBBMalloc unit tests
diff --git a/build/Makefile.tbb b/build/Makefile.tbb
index d83c42a..0206246 100644
--- a/build/Makefile.tbb
+++ b/build/Makefile.tbb
@@ -28,7 +28,7 @@
# Define rules for making the TBB shared library.
#------------------------------------------------------------------------------
-tbb_root ?= "$(TBB22_INSTALL_DIR)"
+tbb_root ?= "$(TBB30_INSTALL_DIR)"
BUILDING_PHASE=1
include $(tbb_root)/build/common.inc
DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
@@ -52,9 +52,18 @@ ifeq (1,$(TBB_NOSTRICT))
# The files below need the -strict_ansi flag downgraded to -ansi to compile
KNOWN_NOSTRICT = concurrent_hash_map.o \
- concurrent_queue.o \
+ concurrent_queue.o \
concurrent_vector_v2.o \
- concurrent_vector.o
+ concurrent_vector.o \
+ task.o \
+ task_group_context.o \
+ governor.o \
+ market.o \
+ arena.o \
+ scheduler.o \
+ observer_proxy.o \
+ tbb_main.o \
+ task_v2.o
endif
@@ -68,6 +77,7 @@ TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \
pipeline.$(OBJ) \
queuing_mutex.$(OBJ) \
queuing_rw_mutex.$(OBJ) \
+ reader_writer_lock.$(OBJ) \
spin_rw_mutex.$(OBJ) \
spin_mutex.$(OBJ) \
critical_section.$(OBJ) \
@@ -75,17 +85,26 @@ TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \
tbb_misc.$(OBJ) \
mutex.$(OBJ) \
recursive_mutex.$(OBJ) \
+ condition_variable.$(OBJ) \
tbb_thread.$(OBJ) \
- itt_notify_proxy.$(OBJ) \
+ concurrent_monitor.$(OBJ) \
private_server.$(OBJ) \
- rml_tbb.$(OBJ)
+ rml_tbb.$(OBJ) \
+ task_group_context.$(OBJ) \
+ governor.$(OBJ) \
+ market.$(OBJ) \
+ arena.$(OBJ) \
+ scheduler.$(OBJ) \
+ observer_proxy.$(OBJ) \
+ tbb_main.$(OBJ)
# OLD/Legacy object files for backward binary compatibility
ifeq (,$(findstring $(DEFINE_KEY)TBB_NO_LEGACY,$(CPLUS_FLAGS)))
TBB_CPLUS_OLD.OBJ = \
concurrent_vector_v2.$(OBJ) \
concurrent_queue_v2.$(OBJ) \
- spin_rw_mutex_v2.$(OBJ)
+ spin_rw_mutex_v2.$(OBJ) \
+ task_v2.$(OBJ)
endif
# Object files that gmake up TBB (TBB_ASM.OBJ is platform-specific)
@@ -94,8 +113,6 @@ TBB.OBJ = $(TBB_CPLUS.OBJ) $(TBB_CPLUS_OLD.OBJ) $(TBB_ASM.OBJ)
# Suppress superfluous warnings for TBB compilation
WARNING_KEY += $(WARNING_SUPPRESS)
-CXX_WARN_SUPPRESS = $(RML_WARNING_SUPPRESS)
-
include $(tbb_root)/build/common_rules.inc
ifneq (,$(TBB.DEF))
diff --git a/build/Makefile.tbbmalloc b/build/Makefile.tbbmalloc
index 6663ae8..b73d980 100644
--- a/build/Makefile.tbbmalloc
+++ b/build/Makefile.tbbmalloc
@@ -27,9 +27,9 @@
# default target
default_malloc: malloc malloc_test
-tbb_root ?= $(TBB22_INSTALL_DIR)
+tbb_root ?= $(TBB30_INSTALL_DIR)
BUILDING_PHASE=1
-TEST_RESOURCE = $(TBB.RES)
+TEST_RESOURCE = $(MALLOC.RES)
include $(tbb_root)/build/common.inc
DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
@@ -55,7 +55,7 @@ MALLOC_CUSTOM.OBJ += tbb_misc_malloc.$(OBJ)
MALLOC_ASM.OBJ = $(TBB_ASM.OBJ)
# MALLOC_CPLUS.OBJ is built in two steps due to Intel Compiler Tracker # C69574
-MALLOC.OBJ := $(MALLOC_CPLUS.OBJ) $(MALLOC_ASM.OBJ) $(MALLOC_CUSTOM.OBJ) MemoryAllocator.$(OBJ) itt_notify_proxy.$(OBJ)
+MALLOC.OBJ := $(MALLOC_CPLUS.OBJ) $(MALLOC_ASM.OBJ) $(MALLOC_CUSTOM.OBJ) MemoryAllocator.$(OBJ) itt_notify.$(OBJ)
MALLOC_CPLUS.OBJ += MemoryAllocator.$(OBJ)
PROXY.OBJ := proxy.$(OBJ) tbb_function_replacement.$(OBJ)
M_CPLUS_FLAGS := $(subst $(WARNING_KEY),,$(M_CPLUS_FLAGS)) $(DEFINE_KEY)__TBB_BUILD=1
@@ -64,7 +64,7 @@ M_INCLUDES = $(INCLUDES) $(INCLUDE_KEY)$(MALLOC_ROOT) $(INCLUDE_KEY)$(MALLOC_SOU
# Suppress superfluous warnings for TBBmalloc compilation
$(MALLOC.OBJ): M_CPLUS_FLAGS += $(WARNING_SUPPRESS)
-itt_notify_proxy.$(OBJ): C_FLAGS += $(PIC_KEY)
+itt_notify.$(OBJ): CPLUS_FLAGS += $(PIC_KEY)
$(PROXY.OBJ): %.$(OBJ): %.cpp
$(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(PIC_KEY) $(M_INCLUDES) $<
@@ -169,16 +169,16 @@ endif
MALLOC_TESTS = $(MALLOC_MAIN_TESTS) $(MALLOC_OVERLOAD_TESTS) $(MALLOC_C_TESTS) test_malloc_whitebox.$(TEST_EXT) test_malloc_lib_unload.$(TEST_EXT)
# run_cmd is usually empty
malloc_test: $(call cross_suffix,$(MALLOC.DLL)) $(TEST_PREREQUISITE) $(MALLOC_TESTS)
- $(run_cmd) ./test_malloc_lib_unload.$(TEST_EXT)
- $(run_cmd) ./test_malloc_whitebox.$(TEST_EXT) 1:4
- $(run_cmd) $(TEST_LAUNCHER) -l $(call cross_suffix,$(MALLOCPROXY.DLL)) test_malloc_overload.$(TEST_EXT)
- $(run_cmd) $(TEST_LAUNCHER) test_malloc_overload_proxy.$(TEST_EXT)
- $(run_cmd) $(TEST_LAUNCHER) test_malloc_compliance.$(TEST_EXT) 1:4
- $(run_cmd) ./test_ScalableAllocator.$(TEST_EXT)
- $(run_cmd) ./test_ScalableAllocator_STL.$(TEST_EXT)
- $(run_cmd) ./test_malloc_regression.$(TEST_EXT)
+ $(run_cmd) ./test_malloc_lib_unload.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_malloc_whitebox.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) $(TEST_LAUNCHER) -l $(call cross_suffix,$(MALLOCPROXY.DLL)) test_malloc_overload.$(TEST_EXT) $(args)
+ $(run_cmd) $(TEST_LAUNCHER) test_malloc_overload_proxy.$(TEST_EXT) $(args)
+ $(run_cmd) $(TEST_LAUNCHER) test_malloc_compliance.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_ScalableAllocator.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_ScalableAllocator_STL.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_malloc_regression.$(TEST_EXT) $(args)
ifeq (,$(NO_C_TESTS))
- $(run_cmd) ./test_malloc_pure_c.$(TEST_EXT)
+ $(run_cmd) ./test_malloc_pure_c.$(TEST_EXT) $(args)
endif
#------------------------------------------------------
diff --git a/build/Makefile.test b/build/Makefile.test
index bef7713..9170272 100644
--- a/build/Makefile.test
+++ b/build/Makefile.test
@@ -31,7 +31,7 @@
default: test_tbb_plain test_tbb_old
-tbb_root ?= $(TBB22_INSTALL_DIR)
+tbb_root ?= $(TBB30_INSTALL_DIR)
BUILDING_PHASE=1
TEST_RESOURCE = $(TBB.RES)
include $(tbb_root)/build/common.inc
@@ -51,23 +51,30 @@ ifeq (1,$(TBB_NOSTRICT))
# The files below need the -strict_ansi flag downgraded to -ansi to compile
KNOWN_NOSTRICT += \
- test_concurrent_hash_map.o \
- test_concurrent_vector.o \
- test_concurrent_queue.o \
+ test_concurrent_hash_map.o \
+ test_concurrent_unordered.o \
+ test_concurrent_vector.o \
+ test_concurrent_queue.o \
test_enumerable_thread_specific.o \
- test_handle_perror.o \
- test_cache_aligned_allocator_STL.o \
- test_task_scheduler_init.o \
- test_model_plugin.o \
- test_parallel_do.o \
- test_lambda.o \
- test_eh_algorithms.o \
- test_parallel_sort.o \
- test_parallel_for_each.o \
- test_task_group.o \
- test_tbb_header.o \
- test_combinable.o \
+ test_handle_perror.o \
+ test_cache_aligned_allocator_STL.o \
+ test_task_scheduler_init.o \
+ test_model_plugin.o \
+ test_parallel_do.o \
+ test_lambda.o \
+ test_eh_algorithms.o \
+ test_eh_tasks.o \
+ test_task_leaks.o \
+ test_task_assertions.o \
+ test_atomic.o \
+ test_parallel_sort.o \
+ test_parallel_for_each.o \
+ test_task_group.o \
+ test_tbb_header.o \
+ test_combinable.o \
test_critical_section.o \
+ test_reader_writer_lock.o \
+ test_tbb_condition_variable.o \
test_tbb_version.o
endif
@@ -89,51 +96,35 @@ include $(tbb_root)/build/common_rules.inc
test_model_plugin.$(TEST_EXT): test_model_plugin.$(OBJ) test_model_plugin_dll.$(DLL)
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LIBDL) $(LIBS) $(LINK_FLAGS)
-TASK_CPP_DEPENDENCIES = $(TBB_ASM.OBJ) \
- cache_aligned_allocator.$(OBJ) \
- dynamic_link.$(OBJ) \
- tbb_misc.$(OBJ) \
- tbb_thread.$(OBJ) \
- itt_notify.$(OBJ) \
- mutex.$(OBJ) \
- spin_rw_mutex.$(OBJ) \
- spin_mutex.$(OBJ) \
- private_server.$(OBJ) \
- rml_tbb.$(OBJ)
-
+# tbb_misc.$(OBJ) has to be specified here (instead of harness_inject_scheduler.h) because it carries dependency on version_string.tmp
+TASK_CPP_DEPENDENCIES = $(TBB_ASM.OBJ) tbb_misc.$(OBJ)
ifeq (,$(codecov))
- TASK_CPP_DEPENDENCIES += itt_notify_proxy.$(OBJ)
+ TASK_CPP_DEPENDENCIES += itt_notify.$(OBJ)
endif
-# These executables don't depend on the TBB library, but include task.cpp directly
+# These executables don't depend on the TBB library, but include core .cpp files directly
TASK_CPP_DIRECTLY_INCLUDED = test_eh_tasks.$(TEST_EXT) \
test_task_leaks.$(TEST_EXT) \
- test_task_assertions.$(TEST_EXT) \
- test_assembly.$(TEST_EXT)
+ test_task_assertions.$(TEST_EXT)
+
+# Necessary to locate version_string.tmp referenced from directly included tbb_misc.cpp
+INCLUDES += $(INCLUDE_KEY).
-$(TASK_CPP_DIRECTLY_INCLUDED): WARNING_KEY += $(WARNING_SUPPRESS) $(RML_WARNING_SUPPRESS)
+$(TASK_CPP_DIRECTLY_INCLUDED): WARNING_KEY += $(WARNING_SUPPRESS)
$(TASK_CPP_DIRECTLY_INCLUDED): %.$(TEST_EXT) : %.$(OBJ) $(TASK_CPP_DEPENDENCIES)
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $^ $(LIBDL) $(LIBS) $(LINK_FLAGS)
-test_handle_perror.$(TEST_EXT): test_handle_perror.$(OBJ) tbb_misc.$(OBJ) $(TBB_ASM.OBJ)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $^ $(LINK_TBB.LIB) $(LIBS) $(LINK_FLAGS)
-
test_tbb_header2.$(OBJ): test_tbb_header.cpp
$(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS_NOSTRICT) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(DEFINE_KEY)__TBB_TEST_SECONDARY=1 $< $(OUTPUTOBJ_KEY)$@
# Detecting "multiple definition" linker error using the test that covers the whole library
test_tbb_header.$(TEST_EXT): test_tbb_header.$(OBJ) test_tbb_header2.$(OBJ) $(TBB.LIB)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $^ $(LINK_TBB.LIB) $(LIBS) $(LINK_FLAGS)
-
-# Rules for the tests, which depend on tbbmalloc
-test_concurrent_hash_map_string.$(TEST_EXT): test_concurrent_hash_map_string.$(OBJ)
- $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_TBB.LIB) $(MALLOC.LIB) $(LIBS) $(LINK_FLAGS)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_tbb_header.$(OBJ) test_tbb_header2.$(OBJ) $(LINK_TBB.LIB) $(LIBS) $(LINK_FLAGS)
# These are in alphabetical order
TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_aligned_space.$(TEST_EXT) \
- test_task_assertions.$(TEST_EXT) \
test_atomic.$(TEST_EXT) \
test_blocked_range.$(TEST_EXT) \
test_blocked_range2d.$(TEST_EXT) \
@@ -141,6 +132,7 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_compiler.$(TEST_EXT) \
test_concurrent_queue.$(TEST_EXT) \
test_concurrent_vector.$(TEST_EXT) \
+ test_concurrent_unordered.$(TEST_EXT) \
test_concurrent_hash_map.$(TEST_EXT) \
test_enumerable_thread_specific.$(TEST_EXT) \
test_handle_perror.$(TEST_EXT) \
@@ -160,15 +152,15 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_parallel_do.$(TEST_EXT) \
test_pipeline.$(TEST_EXT) \
test_pipeline_with_tbf.$(TEST_EXT) \
+ test_parallel_pipeline.$(TEST_EXT) \
test_task_scheduler_init.$(TEST_EXT) \
test_task_scheduler_observer.$(TEST_EXT) \
test_task.$(TEST_EXT) \
- test_task_leaks.$(TEST_EXT) \
test_tbb_thread.$(TEST_EXT) \
+ test_std_thread.$(TEST_EXT) \
test_tick_count.$(TEST_EXT) \
test_inits_loop.$(TEST_EXT) \
test_yield.$(TEST_EXT) \
- test_eh_tasks.$(TEST_EXT) \
test_eh_algorithms.$(TEST_EXT) \
test_parallel_invoke.$(TEST_EXT) \
test_task_group.$(TEST_EXT) \
@@ -177,7 +169,11 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_tbb_header.$(TEST_EXT) \
test_combinable.$(TEST_EXT) \
test_task_auto_init.$(TEST_EXT) \
+ test_concurrent_monitor.$(TEST_EXT) \
test_critical_section.$(TEST_EXT) \
+ test_reader_writer_lock.$(TEST_EXT) \
+ test_tbb_condition_variable.$(TEST_EXT) \
+ test_intrusive_list.$(TEST_EXT) \
test_tbb_version.$(TEST_EXT) # insert new files right above
ifdef OPENMP_FLAG
@@ -190,67 +186,75 @@ test_tbb_openmp: $(TEST_PREREQUISITE) test_openmp.$(TEST_EXT)
endif
-# Run tests that are in TEST_TBB_PLAIN.EXE
+$(TEST_TBB_PLAIN.EXE): WARNING_KEY += $(TEST_WARNING_KEY)
+
+# Run tests that are in TASK_CPP_DIRECTLY_INCLUDED and TEST_TBB_PLAIN.EXE
# The test are ordered so that simpler components are tested first.
# If a component Y uses component X, then tests for Y should come after tests for X.
# Note that usually run_cmd is empty, and tests run directly
-test_tbb_plain: $(TEST_PREREQUISITE) $(TEST_TBB_PLAIN.EXE)
- $(run_cmd) ./test_assembly.$(TEST_EXT)
- $(run_cmd) ./test_compiler.$(TEST_EXT)
+test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PLAIN.EXE)
+ $(run_cmd) ./test_tbb_version.$(TEST_EXT) $(args)
+ # Checking TBB version first to make sure the following testing has anything in it
+ $(run_cmd) ./test_assembly.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_compiler.$(TEST_EXT) $(args)
# Yes, 4:8 is intended on the next line.
- $(run_cmd) ./test_yield.$(TEST_EXT) 4:8
- $(run_cmd) ./test_handle_perror.$(TEST_EXT)
- $(run_cmd) ./test_task_auto_init.$(TEST_EXT)
- $(run_cmd) ./test_task_scheduler_init.$(TEST_EXT) 1:4
- $(run_cmd) ./test_task_scheduler_observer.$(TEST_EXT) 1:4
- $(run_cmd) ./test_task_assertions.$(TEST_EXT)
- $(run_cmd) ./test_task.$(TEST_EXT) 1:4
- $(run_cmd) ./test_task_leaks.$(TEST_EXT)
- $(run_cmd) ./test_atomic.$(TEST_EXT)
- $(run_cmd) ./test_cache_aligned_allocator.$(TEST_EXT)
- $(run_cmd) ./test_cache_aligned_allocator_STL.$(TEST_EXT)
- $(run_cmd) ./test_blocked_range.$(TEST_EXT) 1:4
- $(run_cmd) ./test_blocked_range2d.$(TEST_EXT) 1:4
- $(run_cmd) ./test_blocked_range3d.$(TEST_EXT) 1:4
- $(run_cmd) ./test_parallel_for.$(TEST_EXT) 1:4
- $(run_cmd) ./test_parallel_sort.$(TEST_EXT) 1:4
- $(run_cmd) ./test_aligned_space.$(TEST_EXT)
- $(run_cmd) ./test_parallel_reduce.$(TEST_EXT) 1:4
- $(run_cmd) ./test_parallel_scan.$(TEST_EXT) 1:4
- $(run_cmd) ./test_parallel_while.$(TEST_EXT) 1:4
- $(run_cmd) ./test_parallel_do.$(TEST_EXT) 1:4
- $(run_cmd) ./test_inits_loop.$(TEST_EXT)
- $(run_cmd) ./test_lambda.$(TEST_EXT) 1:4
- $(run_cmd) ./test_mutex.$(TEST_EXT) 1
- $(run_cmd) ./test_mutex.$(TEST_EXT) 2
- $(run_cmd) ./test_mutex.$(TEST_EXT) 4
- $(run_cmd) ./test_mutex_native_threads.$(TEST_EXT) 1:4
- $(run_cmd) ./test_rwm_upgrade_downgrade.$(TEST_EXT) 4
+ $(run_cmd) ./test_yield.$(TEST_EXT) $(args) 4:8
+ $(run_cmd) ./test_handle_perror.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_task_auto_init.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_task_scheduler_init.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_task_scheduler_observer.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_task_assertions.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_task.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_task_leaks.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_atomic.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_cache_aligned_allocator.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_cache_aligned_allocator_STL.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_blocked_range.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_blocked_range2d.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_blocked_range3d.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_parallel_for.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_parallel_sort.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_aligned_space.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_parallel_reduce.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_parallel_scan.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_parallel_while.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_parallel_do.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_inits_loop.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_lambda.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_mutex.$(TEST_EXT) $(args) 1:3
+ $(run_cmd) ./test_mutex_native_threads.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_rwm_upgrade_downgrade.$(TEST_EXT) $(args) 4
# Yes, 4:8 is intended on the next line.
- $(run_cmd) ./test_halt.$(TEST_EXT) 4:8
- $(run_cmd) ./test_pipeline.$(TEST_EXT) 1:4
- $(run_cmd) ./test_pipeline_with_tbf.$(TEST_EXT) 1:4
- $(run_cmd) ./test_tick_count.$(TEST_EXT) 1:4
- $(run_cmd) ./test_concurrent_queue.$(TEST_EXT) 1:4
- $(run_cmd) ./test_concurrent_vector.$(TEST_EXT) 1:4
- $(run_cmd) ./test_concurrent_hash_map.$(TEST_EXT) 1:4
- $(run_cmd) ./test_enumerable_thread_specific.$(TEST_EXT) 0:4
- $(run_cmd) ./test_combinable.$(TEST_EXT) 0:4
- $(run_cmd) ./test_model_plugin.$(TEST_EXT) 4
- $(run_cmd) ./test_eh_tasks.$(TEST_EXT) 2:4
- $(run_cmd) ./test_eh_algorithms.$(TEST_EXT) 2:4
- $(run_cmd) ./test_tbb_thread.$(TEST_EXT)
- $(run_cmd) ./test_parallel_invoke.$(TEST_EXT) 1:4
- $(run_cmd) ./test_task_group.$(TEST_EXT) 1:4
- $(run_cmd) ./test_ittnotify.$(TEST_EXT) 2:2
- $(run_cmd) ./test_parallel_for_each.$(TEST_EXT) 1:4
- $(run_cmd) ./test_tbb_header.$(TEST_EXT)
- $(run_cmd) ./test_critical_section.$(TEST_EXT) 1:4
- $(run_cmd) ./test_tbb_version.$(TEST_EXT)
+ $(run_cmd) ./test_halt.$(TEST_EXT) $(args) 4:8
+ $(run_cmd) ./test_pipeline.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_pipeline_with_tbf.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_parallel_pipeline.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_tick_count.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_queue.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_vector.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_unordered.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_concurrent_hash_map.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_enumerable_thread_specific.$(TEST_EXT) $(args) 0:4
+ $(run_cmd) ./test_combinable.$(TEST_EXT) $(args) 0:4
+ # $(run_cmd) ./test_model_plugin.$(TEST_EXT) $(args) 4
+ $(run_cmd) ./test_eh_tasks.$(TEST_EXT) $(args) 2:4
+ $(run_cmd) ./test_eh_algorithms.$(TEST_EXT) $(args) 2:4
+ $(run_cmd) ./test_tbb_thread.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_std_thread.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_parallel_invoke.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_task_group.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_ittnotify.$(TEST_EXT) $(args) 2:2
+ $(run_cmd) ./test_parallel_for_each.$(TEST_EXT) $(args) 1:4
+ $(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_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)
CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS_NOSTRICT)) $(WARNING_SUPPRESS)
-TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ)
+TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ) test_task_v2.$(OBJ)
TEST_TBB_DEPRECATED.OBJ = test_concurrent_queue_deprecated.$(OBJ) \
test_concurrent_vector_deprecated.$(OBJ) \
@@ -267,13 +271,13 @@ TEST_TBB_OLD.EXE = $(subst .$(OBJ),.$(TEST_EXT),$(TEST_TBB_OLD.OBJ) $(TEST_TBB_D
ifeq (,$(NO_LEGACY_TESTS))
test_tbb_old: $(TEST_PREREQUISITE) $(TEST_TBB_OLD.EXE)
- $(run_cmd) ./test_concurrent_vector_v2.$(TEST_EXT) 1:4
- $(run_cmd) ./test_concurrent_vector_deprecated.$(TEST_EXT) 1:4
- $(run_cmd) ./test_concurrent_queue_v2.$(TEST_EXT) 1:4
- $(run_cmd) ./test_concurrent_queue_deprecated.$(TEST_EXT) 1:4
- $(run_cmd) ./test_mutex_v2.$(TEST_EXT) 1
- $(run_cmd) ./test_mutex_v2.$(TEST_EXT) 2
- $(run_cmd) ./test_mutex_v2.$(TEST_EXT) 4
+ $(run_cmd) ./test_concurrent_vector_v2.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_vector_deprecated.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_queue_v2.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_queue_deprecated.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 1
+ $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 2
+ $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 4
else
test_tbb_old:
@echo Legacy tests skipped
@@ -285,7 +289,7 @@ codecov_gen:
codecov $(if $(findstring -,$(codecov)),$(codecov),) -demang -comp $(tbb_root)/build/codecov.txt
endif
-test_% debug_%: $(TEST_PREREQUISITE) test_%.$(TEST_EXT)
+test_% debug_%: test_%.$(TEST_EXT) $(TEST_PREREQUISITE)
ifeq (,$(repeat))
$(run_cmd) ./$< $(args)
else
@@ -300,7 +304,7 @@ ifneq (,$(codecov))
codecov $(if $(findstring -,$(codecov)),$(codecov),) -demang -comp $(tbb_root)/build/codecov.txt
endif
-time_%: $(TEST_PREREQUISITE) time_%.$(TEST_EXT)
+time_%: time_%.$(TEST_EXT) $(TEST_PREREQUISITE)
$(run_cmd) ./$< $(args)
diff --git a/build/SunOS.inc b/build/SunOS.inc
index c903386..9efb881 100644
--- a/build/SunOS.inc
+++ b/build/SunOS.inc
@@ -64,11 +64,6 @@ SLASH=/
MAKE_VERSIONS=bash $(tbb_root)/build/version_info_sunos.sh $(CPLUS) $(CPLUS_FLAGS) $(INCLUDES) >version_string.tmp
MAKE_TBBVARS=bash $(tbb_root)/build/generate_tbbvars.sh
-ifeq ($(compiler),suncc)
- export TBB_CUSTOM_VARS_SH=CXXFLAGS="-I$(CWD)/../include -library=stlport4 $(CXXFLAGS) -M$(CWD)/../build/suncc.map.pause"
- export TBB_CUSTOM_VARS_CSH=CXXFLAGS "-I$(CWD)/../include -library=stlport4 $(CXXFLAGS) -M$(CWD)/../build/suncc.map.pause"
-endif
-
ifdef LD_LIBRARY_PATH
export LD_LIBRARY_PATH := .:$(LD_LIBRARY_PATH)
else
diff --git a/build/SunOS.suncc.inc b/build/SunOS.suncc.inc
index c5e80bf..dab47f1 100644
--- a/build/SunOS.suncc.inc
+++ b/build/SunOS.suncc.inc
@@ -77,6 +77,9 @@ 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"
+
#------------------------------------------------------------------------------
# Setting assembler data.
#------------------------------------------------------------------------------
diff --git a/build/common_rules.inc b/build/common_rules.inc
index 78e52ca..db7dc31 100644
--- a/build/common_rules.inc
+++ b/build/common_rules.inc
@@ -43,7 +43,7 @@ INCLUDES += $(INCLUDE_KEY)$(tbb_root)/src $(INCLUDE_KEY)$(tbb_root)/src/rml/incl
CPLUS_FLAGS += $(WARNING_KEY) $(CXXFLAGS)
LINK_FLAGS += $(LDFLAGS)
LIB_LINK_FLAGS += $(LDFLAGS)
-CPLUS_FLAGS_NOSTRICT:=$(subst -strict_ansi,-ansi,$(CPLUS_FLAGS))
+CPLUS_FLAGS_NOSTRICT = $(subst -strict_ansi,-ansi,$(CPLUS_FLAGS))
LIB_LINK_CMD ?= $(CPLUS) $(PIC_KEY)
ifeq ($(origin LIB_OUTPUT_KEY), undefined)
@@ -90,7 +90,7 @@ ifeq (1,$(TBB_NOSTRICT))
# The files below need the -strict_ansi flag downgraded to -ansi to compile
$(KNOWN_NOSTRICT): %.$(OBJ): %.cpp
- $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS_NOSTRICT) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
+ $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS_NOSTRICT) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $<
endif
$(KNOWN_WARNINGS): %.$(OBJ): %.cpp
@@ -109,7 +109,7 @@ ifneq (,$(TBB.MANIFEST))
$(TBB.MANIFEST):
cmd /C "echo #include ^<stdio.h^> >tbbmanifest.c"
cmd /C "echo int main(){return 0;} >>tbbmanifest.c"
- cl $(C_FLAGS) tbbmanifest.c
+ cl /nologo $(C_FLAGS) tbbmanifest.c
version_string.tmp: $(TBB.MANIFEST)
$(MAKE_VERSIONS)
diff --git a/build/generate_tbbvars.bat b/build/generate_tbbvars.bat
index 99a26de..9fd3a51 100644
--- a/build/generate_tbbvars.bat
+++ b/build/generate_tbbvars.bat
@@ -26,73 +26,49 @@ REM the GNU General Public License. This exception does not however
REM invalidate any other reasons why the executable file might be covered by
REM the GNU General Public License.
REM
-if exist tbbvars.bat exit
-echo Generating tbbvars.bat
-echo @echo off>tbbvars.bat
setlocal
for %%D in ("%tbb_root%") do set actual_root=%%~fD
-if x%1==x goto without
+set fslash_root=%actual_root:\=/%
+set bin_dir=%CD%
+set fslash_bin_dir=%bin_dir:\=/%
+set _INCLUDE=INCLUDE& set _LIB=LIB
+if not x%UNIXMODE%==x set _INCLUDE=CPATH& set _LIB=LIBRARY_PATH
-echo SET TBB22_INSTALL_DIR=%actual_root%>>tbbvars.bat
+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 TBB_ARCH_PLATFORM=%arch%\%runtime%>>tbbvars.bat
-echo SET INCLUDE=%%TBB22_INSTALL_DIR%%\include;%%INCLUDE%%>>tbbvars.bat
-echo SET LIB=%%TBB22_INSTALL_DIR%%\build\%1;%%LIB%%>>tbbvars.bat
-echo SET PATH=%%TBB22_INSTALL_DIR%%\build\%1;%%PATH%%>>tbbvars.bat
+echo SET TBB_TARGET_ARCH=%arch%>>tbbvars.bat
+echo SET %_INCLUDE%=%%TBB30_INSTALL_DIR%%\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
+:skipbat
if exist tbbvars.sh goto skipsh
-set fslash_root=%actual_root:\=/%
-echo Generating tbbvars.sh
+echo Generating local tbbvars.sh
echo #!/bin/sh>tbbvars.sh
-echo export TBB22_INSTALL_DIR="%fslash_root%">>tbbvars.sh
-echo TBB_ARCH_PLATFORM="%arch%\%runtime%">>tbbvars.sh
-echo if [ -z "${PATH}" ]; then>>tbbvars.sh
-echo export PATH="${TBB22_INSTALL_DIR}/build/%1">>tbbvars.sh
-echo else>>tbbvars.sh
-echo export PATH="${TBB22_INSTALL_DIR}/build/%1;$PATH">>tbbvars.sh
-echo fi>>tbbvars.sh
-echo if [ -z "${LIB}" ]; then>>tbbvars.sh
-echo export LIB="${TBB22_INSTALL_DIR}/build/%1">>tbbvars.sh
-echo else>>tbbvars.sh
-echo export LIB="${TBB22_INSTALL_DIR}/build/%1;$LIB">>tbbvars.sh
-echo fi>>tbbvars.sh
-echo if [ -z "${INCLUDE}" ]; then>>tbbvars.sh
-echo export INCLUDE="${TBB22_INSTALL_DIR}/include">>tbbvars.sh
-echo else>>tbbvars.sh
-echo export INCLUDE="${TBB22_INSTALL_DIR}/include;$INCLUDE">>tbbvars.sh
-echo fi>>tbbvars.sh
+echo export TBB30_INSTALL_DIR="%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 %_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
:skipsh
if exist tbbvars.csh goto skipcsh
-echo Generating tbbvars.csh
+echo Generating local tbbvars.csh
echo #!/bin/csh>tbbvars.csh
-echo setenv TBB22_INSTALL_DIR "%actual_root%">>tbbvars.csh
+echo setenv TBB30_INSTALL_DIR "%actual_root%">>tbbvars.csh
echo setenv TBB_ARCH_PLATFORM "%arch%\%runtime%">>tbbvars.csh
-echo if (! $?PATH) then>>tbbvars.csh
-echo setenv PATH "${TBB22_INSTALL_DIR}\build\%1">>tbbvars.csh
-echo else>>tbbvars.csh
-echo setenv PATH "${TBB22_INSTALL_DIR}\build\%1;$PATH">>tbbvars.csh
-echo endif>>tbbvars.csh
-echo if (! $?LIB) then>>tbbvars.csh
-echo setenv LIB "${TBB22_INSTALL_DIR}\build\%1">>tbbvars.csh
-echo else>>tbbvars.csh
-echo setenv LIB "${TBB22_INSTALL_DIR}\build\%1;$LIB">>tbbvars.csh
-echo endif>>tbbvars.csh
-echo if (! $?INCLUDE) then>>tbbvars.csh
-echo setenv INCLUDE "${TBB22_INSTALL_DIR}\include">>tbbvars.csh
-echo else>>tbbvars.csh
-echo setenv INCLUDE "${TBB22_INSTALL_DIR}\include;$INCLUDE">>tbbvars.csh
-echo endif>>tbbvars.csh
-)
+echo setenv TBB_TARGET_ARCH "%arch%">>tbbvars.csh
+echo setenv %_INCLUDE% "${TBB30_INSTALL_DIR}\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
:skipcsh
-exit
-
-:without
-set bin_dir=%CD%
-echo SET tbb_root=%actual_root%>>tbbvars.bat
-echo SET tbb_bin=%bin_dir%>>tbbvars.bat
-echo SET TBB_ARCH_PLATFORM=%arch%\%runtime%>>tbbvars.bat
-echo SET INCLUDE="%%tbb_root%%\include";%%INCLUDE%%>>tbbvars.bat
-echo SET LIB="%%tbb_bin%%";%%LIB%%>>tbbvars.bat
-echo SET PATH="%%tbb_bin%%";%%PATH%%>>tbbvars.bat
endlocal
+exit
diff --git a/build/generate_tbbvars.sh b/build/generate_tbbvars.sh
index ec0561f..484719f 100644
--- a/build/generate_tbbvars.sh
+++ b/build/generate_tbbvars.sh
@@ -32,26 +32,14 @@ cd "$tbb_root" # keep this comments here
tbb_root="$PWD" # to make it unsensible
cd "$bin_dir" # to EOL encoding
[ "`uname`" = "Darwin" ] && dll_path="DYLD_LIBRARY_PATH" || dll_path="LD_LIBRARY_PATH" #
-custom_exp="$CXXFLAGS" #
-if [ -z "$TBB_CUSTOM_VARS_SH" ]; then #
-custom_exp_sh="" #
-else #
-custom_exp_sh="export $TBB_CUSTOM_VARS_SH" #
-fi #
-if [ -z "$TBB_CUSTOM_VARS_CSH" ]; then #
-custom_exp_csh="" #
-else #
-custom_exp_csh="setenv $TBB_CUSTOM_VARS_CSH" #
-fi #
-if [ -z "$1" ]; then # custom tbb_build_dir, can't make with TBB_INSTALL_DIR
[ -f ./tbbvars.sh ] || cat >./tbbvars.sh <<EOF
#!/bin/bash
-tbb_root="${tbb_root}" #
+export TBB30_INSTALL_DIR="${tbb_root}" #
tbb_bin="${bin_dir}" #
if [ -z "\$CPATH" ]; then #
- export CPATH="\${tbb_root}/include" #
+ export CPATH="\${TBB30_INSTALL_DIR}/include" #
else #
- export CPATH="\${tbb_root}/include:\$CPATH" #
+ export CPATH="\${TBB30_INSTALL_DIR}/include:\$CPATH" #
fi #
if [ -z "\$LIBRARY_PATH" ]; then #
export LIBRARY_PATH="\${tbb_bin}" #
@@ -63,16 +51,16 @@ if [ -z "\$${dll_path}" ]; then #
else #
export ${dll_path}="\${tbb_bin}:\$${dll_path}" #
fi #
-${custom_exp_sh} #
+${TBB_CUSTOM_VARS_SH} #
EOF
[ -f ./tbbvars.csh ] || cat >./tbbvars.csh <<EOF
#!/bin/csh
-setenv tbb_root "${tbb_root}" #
+setenv TBB30_INSTALL_DIR "${tbb_root}" #
setenv tbb_bin "${bin_dir}" #
if (! \$?CPATH) then #
- setenv CPATH "\${tbb_root}/include" #
+ setenv CPATH "\${TBB30_INSTALL_DIR}/include" #
else #
- setenv CPATH "\${tbb_root}/include:\$CPATH" #
+ setenv CPATH "\${TBB30_INSTALL_DIR}/include:\$CPATH" #
endif #
if (! \$?LIBRARY_PATH) then #
setenv LIBRARY_PATH "\${tbb_bin}" #
@@ -84,49 +72,5 @@ if (! \$?${dll_path}) then #
else #
setenv ${dll_path} "\${tbb_bin}:\$${dll_path}" #
endif #
-${custom_exp_csh} #
+${TBB_CUSTOM_VARS_CSH} #
EOF
-else # make with TBB_INSTALL_DIR
-[ -f ./tbbvars.sh ] || cat >./tbbvars.sh <<EOF
-#!/bin/bash
-export TBB22_INSTALL_DIR="${tbb_root}" #
-tbb_bin="\${TBB22_INSTALL_DIR}/build/$1" #
-if [ -z "\$CPATH" ]; then #
- export CPATH="\${TBB22_INSTALL_DIR}/include" #
-else #
- export CPATH="\${TBB22_INSTALL_DIR}/include:\$CPATH" #
-fi #
-if [ -z "\$LIBRARY_PATH" ]; then #
- export LIBRARY_PATH="\${tbb_bin}" #
-else #
- export LIBRARY_PATH="\${tbb_bin}:\$LIBRARY_PATH" #
-fi #
-if [ -z "\$${dll_path}" ]; then #
- export ${dll_path}="\${tbb_bin}" #
-else #
- export ${dll_path}="\${tbb_bin}:\$${dll_path}" #
-fi #
-${custom_exp_sh} #
-EOF
-[ -f ./tbbvars.csh ] || cat >./tbbvars.csh <<EOF
-#!/bin/csh
-setenv TBB22_INSTALL_DIR "${tbb_root}" #
-setenv tbb_bin "\${TBB22_INSTALL_DIR}/build/$1" #
-if (! \$?CPATH) then #
- setenv CPATH "\${TBB22_INSTALL_DIR}/include" #
-else #
- setenv CPATH "\${TBB22_INSTALL_DIR}/include:\$CPATH" #
-endif #
-if (! \$?LIBRARY_PATH) then #
- setenv LIBRARY_PATH "\${tbb_bin}" #
-else #
- setenv LIBRARY_PATH "\${tbb_bin}:\$LIBRARY_PATH" #
-endif #
-if (! \$?${dll_path}) then #
- setenv ${dll_path} "\${tbb_bin}" #
-else #
- setenv ${dll_path} "\${tbb_bin}:\$${dll_path}" #
-endif #
-${custom_exp_csh} #
-EOF
-fi #
diff --git a/build/linux.gcc.inc b/build/linux.gcc.inc
index b57827b..09862a5 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.gcc.inc
@@ -33,8 +33,9 @@ OUTPUTOBJ_KEY = -o #
PIC_KEY = -fPIC
WARNING_AS_ERROR_KEY = -Werror
WARNING_KEY = -Wall
-WARNING_SUPPRESS = -Wno-parentheses
-RML_WARNING_SUPPRESS = -Wno-non-virtual-dtor
+TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor $(if $(findstring cc4., $(runtime)),-Wextra)
+
+WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
DYLIB_KEY = -shared
LIBDL = -ldl
diff --git a/build/lrb.inc b/build/lrb.inc
deleted file mode 100644
index b9ac306..0000000
--- a/build/lrb.inc
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright 2005-2010 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.
-
-ifeq ($(tbb_os),lrb)
- $(error Supported only cross compilation. Specify "target=lrb" instead)
-endif
-
-# execution environment: "no", "native" (+xensim), "netsim", "sde" (no xn)
-ifeq (1,$(XENSIM_ENABLED))
- lrb ?= native
-else
- lrb ?= no
-endif
-
-LRBSDK = $(LARRABEE_CORE_LATEST)
-LRB_LIB_DIR = "$(LRBSDK)lib"
-LRB_INC_DIR = "$(LRBSDK)include"
-ifeq ($(cfg),debug)
- CFG_LETTER = d#
-else
- CFG_LETTER = r#
-endif
-# Function $(wildcard pattern) does not work with paths containing spaces!
-ifndef XN_VER # avoid unnecessary call to shell
- export XN_VER:=$(patsubst libxn%_lrb64d.so,%,$(shell $(CMD) "dir /B "$(LRBSDK)lib$(SLASH)libxn"*_lrb64d.so 2>$(NUL)"))
- ifeq ($(XN_VER),)
- $(error "Wrong environment: LARRABEE_CORE_LATEST=$(LARRABEE_CORE_LATEST)")
- endif
- $(warning LRB cross compilation mode: XN=$(XN_VER) lrb=$(lrb))
-endif
-
-ifeq (netsim,$(lrb)) # compile native binaries linked win XN library
- extra_inc = lrb.host.inc # will be included after host compiler
- BUILD_PREFIX = $(tbb_os)_$(arch)_$(compiler)_$(runtime)_xn$(XN_VER)
- TEST_PREREQUISITE := harness_lrb_host.exe
- TEST_EXT = dll
- export LARRABEE_EMULATION=WIN64
-else # Target binaries are native LRB
- extra_inc = lrb.native.inc # will be included after host compiler
- LRB_ARCH=$(if $(findstring L1OM,$(shell $(CMD) "icpc -V 2>&1")),l1om,x86_64)
- ifneq (sde,$(lrb))
- BUILD_PREFIX = lrb_$(LRB_ARCH)_xn$(XN_VER)
- TEST_PREREQUISITE := host_$(tbb_os)_$(arch)_$(runtime).exe
- else #sde
- BUILD_PREFIX = lrb_$(LRB_ARCH)
- endif # sde
-endif # netsim
-
-ifeq ($(tbb_build_prefix),) # avoid unnecessary call to shell
- export tbb_build_prefix:=$(BUILD_PREFIX)
-endif
-ifneq ($(filter native netsim,$(lrb)),)
- run_cmd=$(TEST_PREREQUISITE)
-else # no, sde
- ifeq ($(run_cmd),)
- run_cmd=@echo skip -
- endif
-endif
-
-# detects whether examples are being built. TODO.
-ifeq ($(BUILDING_PHASE),0)
- export RM
- export LIBS = -shared -lthr -z muldefs -L$(work_dir)_debug -L$(work_dir)_release
- export UI = con
- export x64 = 64
- export CXXFLAGS = -xR -I..\..\..\include
-endif # examples
diff --git a/build/lrb.native.inc b/build/lrb.native.inc
deleted file mode 100644
index b88bbdc..0000000
--- a/build/lrb.native.inc
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright 2005-2010 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.
-
-# detects whether the tests are being built
-ifdef TEST_RESOURCE
- # host compiler is used for host application
- include $(tbb_root)/build/lrb.host.inc
-endif # TEST_RESOURCE
-
-# redefine all necessary variables
-OBJ = o
-DLL = so
-LIBEXT = so
-
-TBB.DEF = $(tbb_root)/src/tbb/lin64-tbb-export.def
-TBB.DLL = libtbb$(DEBUG_SUFFIX).$(DLL)
-TBB.LIB = $(TBB.DLL)
-LINK_TBB.LIB = $(TBB.DLL)
-TBB.RES =
-TBB.MANIFEST=
-
-RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def
-RML.DLL = libirml$(DEBUG_SUFFIX).$(DLL)
-RML.RES =
-
-MALLOC.DEF = $(MALLOC_ROOT)/lin-tbbmalloc-export.def
-MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
-MALLOC.LIB = $(MALLOC.DLL)
-MALLOC.RES =
-
-MALLOCPROXY.DEF = $(MALLOC_ROOT)/lin64-proxy-export.def
-MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
-MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
-
-MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_winlrb.js $(compiler) $(arch) $(subst \,/,"$(CPLUS) $(CPLUS_FLAGS) $(INCLUDES)") > version_string.tmp
-MAKE_TBBVARS = cmd /C "$(subst /,\,$(tbb_root))\build\generate_tbbvars.bat"
-
-TBB_NOSTRICT = 1
-
-CPLUS = icpc
-CONLY = icc
-COMPILE_ONLY = -c -MMD
-PREPROC_ONLY = -E -x c
-INCLUDE_KEY = -I
-DEFINE_KEY = -D
-OUTPUT_KEY = -o #
-OUTPUTOBJ_KEY = -o #
-PIC_KEY = -fPIC
-EXPORT_KEY = -Wl,--version-script,
-WARNING_KEY = -w1
-WARNING_AS_ERROR_KEY = -Werror
-DYLIB_KEY = -shared
-ifeq ($(cfg),release)
- CPLUS_FLAGS = -O0 -DUSE_PTHREAD # TODO: -O2
-endif
-ifeq ($(cfg),debug)
- CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD
-endif
-ASM=
-ASM_FLAGS=
-TBB_ASM.OBJ=
-M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
-#LIBS = -u _read -lcprts -lthr -lc
-#LIBS = -lthr
-LIBS = -u _read -lthr -limf -lc
-CPLUS_FLAGS += -xR $(PIC_KEY) -I$(LRB_INC_DIR) -D__TBB_LRB_NATIVE
-C_FLAGS = $(CPLUS_FLAGS)
-LIB_LINK_FLAGS = $(LINK_FLAGS)
-OPENMP_FLAG =
-ifeq (sde,$(lrb))
-CPLUS_FLAGS += -D__TBB_LRB_NO_XN
-LINK_FLAGS =
-LIB_LINK_FLAGS += $(DYLIB_KEY)
-else
-LINK_FLAGS = -L$(LRB_LIB_DIR) $(DYLIB_KEY) -lxn$(XN_VER)_lrb64$(CFG_LETTER)
-TEST_EXT = so
-endif
diff --git a/build/macos.gcc.inc b/build/macos.gcc.inc
index 2f81e5e..5f34f4a 100644
--- a/build/macos.gcc.inc
+++ b/build/macos.gcc.inc
@@ -35,8 +35,8 @@ OUTPUTOBJ_KEY = -o #
PIC_KEY = -fPIC
WARNING_AS_ERROR_KEY = -Werror
WARNING_KEY = -Wall
-WARNING_SUPPRESS =
-RML_WARNING_SUPPRESS = -Wno-non-virtual-dtor
+TEST_WARNING_KEY = -Wextra -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor
+WARNING_SUPPRESS = -Wno-non-virtual-dtor
DYLIB_KEY = -dynamiclib
EXPORT_KEY = -Wl,-exported_symbols_list,
LIBDL = -ldl
diff --git a/build/vsproject/tbb.vcproj b/build/vsproject/tbb.vcproj
index fcd02e9..ce8b671 100644
--- a/build/vsproject/tbb.vcproj
+++ b/build/vsproject/tbb.vcproj
@@ -1,522 +1,504 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbb" ProjectGUID="{F62787DD-1327-448B-9818-030062BCFAA5}" RootNamespace="tbb" Keyword="Win32Proj">
- <Platforms>
- <Platform Name="Win32"/>
- <Platform Name="x64"/>
- </Platforms>
- <ToolFiles>
- <DefaultToolFile FileName="masm.rules"/>
- </ToolFiles>
- <Configurations>
- <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="4" Detec [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="4" [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /Oy /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" Detect64BitPortabilityProblems="false" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" Detect64BitPortabilityProblems="false" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="4" Detec [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="4" [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /Oy /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" Detect64BitPortabilityProblems="false" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" Detect64BitPortabilityProblems="false" DebugInformationFormat="3"/>
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug-MT\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release-MT\atomic_support.obj"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\ia32-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\itt_notify_proxy.c">
- </File>
- <File RelativePath="..\..\src\tbb\ia32-masm\lock_byte.asm">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\win32-tbb-export.def">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\win64-tbb-export.def">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\concurrent_hash_map.cpp"/><File RelativePath="..\..\src\tbb\concurrent_queue.cpp"/><File RelativePath="..\..\src\tbb\concurrent_vector.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbb\cache_aligned_allocator.cpp"/><File RelativePath="..\..\src\tbb\pipeline.cpp"/><File RelativePath="..\..\src\tbb\queuing_mutex.cpp"/><File RelativePath="..\..\src\tbb\queuing_r [...]
- <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File RelativePath="..\..\include\tbb\_concurrent_queue_internal.h">
- </File>
- <File RelativePath="..\..\include\tbb\_tbb_windef.h">
- </File>
- <File RelativePath="..\..\include\tbb\aligned_space.h">
- </File>
- <File RelativePath="..\..\include\tbb\atomic.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range2d.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range3d.h">
- </File>
- <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\combinable.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_queue.h">
- </File>
- <File RelativePath="..\..\src\old\concurrent_queue_v2.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_vector.h">
- </File>
- <File RelativePath="..\..\src\old\concurrent_vector_v2.h">
- </File>
- <File RelativePath="..\..\include\tbb\critical_section.h">
- </File>
- <File RelativePath="..\..\src\tbb\dynamic_link.h">
- </File>
- <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
- </File>
- <File RelativePath="..\..\src\tbb\gate.h">
- </File>
- <File RelativePath="..\..\src\test\harness.h">
- </File>
- <File RelativePath="..\..\src\test\harness_allocator.h">
- </File>
- <File RelativePath="..\..\src\test\harness_assert.h">
- </File>
- <File RelativePath="..\..\src\test\harness_bad_expr.h">
- </File>
- <File RelativePath="..\..\src\test\harness_barrier.h">
- </File>
- <File RelativePath="..\..\src\test\harness_concurrency_tracker.h">
- </File>
- <File RelativePath="..\..\src\test\harness_cpu.h">
- </File>
- <File RelativePath="..\..\src\test\harness_eh.h">
- </File>
- <File RelativePath="..\..\src\test\harness_iterator.h">
- </File>
- <File RelativePath="..\..\src\test\harness_lrb.h">
- </File>
- <File RelativePath="..\..\src\test\harness_m128.h">
- </File>
- <File RelativePath="..\..\src\test\harness_memory.h">
- </File>
- <File RelativePath="..\..\src\test\harness_report.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\ibm_aix51.h">
- </File>
- <File RelativePath="..\..\src\tbb\itt_notify.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_common.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_ia32.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_ia64.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\linux_intel64.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\mac_ppc.h">
- </File>
- <File RelativePath="..\..\include\tbb\mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_do.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for_each.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_invoke.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_reduce.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_scan.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_sort.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_while.h">
- </File>
- <File RelativePath="..\..\include\tbb\partitioner.h">
- </File>
- <File RelativePath="..\..\include\tbb\pipeline.h">
- </File>
- <File RelativePath="..\..\include\tbb\compat\ppl.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\recursive_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\scalable_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
- </File>
- <File RelativePath="..\..\src\old\spin_rw_mutex_v2.h">
- </File>
- <File RelativePath="..\..\include\tbb\task.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_group.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_allocator.h">
- </File>
- <File RelativePath="..\..\src\tbb\tbb_assert_impl.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_config.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_config_lrb.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_exception.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_machine.h">
- </File>
- <File RelativePath="..\..\src\tbb\tbb_misc.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_profiling.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_stddef.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_thread.h">
- </File>
- <File RelativePath="..\..\src\tbb\tbb_version.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
- </File>
- <File RelativePath="..\..\src\test\test_allocator.h">
- </File>
- <File RelativePath="..\..\src\test\test_allocator_STL.h">
- </File>
- <File RelativePath="..\..\include\tbb\tick_count.h">
- </File>
- <File RelativePath="..\..\src\tbb\tls.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
- </File>
- </Filter>
- <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File RelativePath="..\..\src\tbb\tbb_resource.rc">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbb" ProjectGUID="{F62787DD-1327-448B-9818-030062BCFAA5}" RootNamespace="tbb" Keyword="Win32Proj">
+ <Platforms>
+ <Platform Name="Win32"/>
+ <Platform Name="x64"/>
+ </Platforms>
+ <ToolFiles>
+ <DefaultToolFile FileName="masm.rules"/>
+ </ToolFiles>
+ <Configurations>
+ <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="4" Debug [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" BufferSecurityCheck="false" RuntimeLibrary="3" UsePrecompiled [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" BufferSecurityCheck="false" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" BasicRuntimeChecks="3" BufferSecurityCheck="false" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel=" [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" BufferSecurityCheck="false" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbb.def"" OutputFile="$(OutDir)\tbb.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Debug\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Release\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Debug-MT\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Release-MT\atomic_support.obj"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\ia32-masm\atomic_support.asm">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\ia32-masm\lock_byte.asm">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\win32-tbb-export.def">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\win64-tbb-export.def">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\concurrent_hash_map.cpp"/><File RelativePath="..\..\src\tbb\concurrent_queue.cpp"/><File RelativePath="..\..\src\tbb\concurrent_vector.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbb\cache_aligned_allocator.cpp"/><File RelativePath="..\..\src\tbb\pipeline.cpp"/><File RelativePath="..\..\src\tbb\queuing_mutex.cpp"/><File RelativePath="..\..\src\tbb\queuing_r [...]
+ <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File RelativePath="..\..\include\tbb\_concurrent_queue_internal.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\_tbb_windef.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\aligned_space.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\atomic.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range2d.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range3d.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\combinable.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\concurrent_monitor.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_queue.h">
+ </File>
+ <File RelativePath="..\..\src\old\concurrent_queue_v2.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_vector.h">
+ </File>
+ <File RelativePath="..\..\src\old\concurrent_vector_v2.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\critical_section.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\dynamic_link.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\gate.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_assert.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_bad_expr.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_barrier.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_concurrency_tracker.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_cpu.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_eh.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_iterator.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_lrb.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_m128.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_memory.h">
+ </File>
+ <File RelativePath="..\..\src\test\harness_report.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\ibm_aix51.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\itt_notify.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_common.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_ia32.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_ia64.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\linux_intel64.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\mac_ppc.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\null_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_do.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_for.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_for_each.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_invoke.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_reduce.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_scan.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_sort.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_while.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\partitioner.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\pipeline.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\compat\ppl.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\queuing_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\reader_writer_lock.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\recursive_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\scalable_allocator.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\spin_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\src\old\spin_rw_mutex_v2.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_group.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tbb_assert_impl.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_config.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_config_lrb.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_exception.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_machine.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tbb_misc.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_profiling.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_stddef.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_thread.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tbb_version.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
+ </File>
+ <File RelativePath="..\..\src\test\test_allocator.h">
+ </File>
+ <File RelativePath="..\..\src\test\test_allocator_STL.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tick_count.h">
+ </File>
+ <File RelativePath="..\..\src\tbb\tls.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
+ </File>
+ </Filter>
+ <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File RelativePath="..\..\src\tbb\tbb_resource.rc">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/vsproject/tbbmalloc.vcproj b/build/vsproject/tbbmalloc.vcproj
index 68ed9dd..1fe9818 100644
--- a/build/vsproject/tbbmalloc.vcproj
+++ b/build/vsproject/tbbmalloc.vcproj
@@ -1,474 +1,452 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbbmalloc" ProjectGUID="{B15F131E-328A-4D42-ADC2-9FF4CA6306D8}" RootNamespace="tbbmalloc" Keyword="Win32Proj">
- <Platforms>
- <Platform Name="Win32"/>
- <Platform Name="x64"/>
- </Platforms>
- <ToolFiles>
- <DefaultToolFile FileName="masm.rules"/>
- </ToolFiles>
- <Configurations>
- <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary="3" TreatWChar_tAsBu [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /Oy /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" Det [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" De [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary="1" TreatWChar_tAsBu [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /Oy /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" Det [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" De [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Debug-MT\atomic_support.obj"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
-" Outputs="intel64\Release-MT\atomic_support.obj"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\ia32-masm\atomic_support.asm">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbb\itt_notify_proxy.c">
- </File>
- <File RelativePath="..\..\src\tbb\ia32-masm\lock_byte.asm">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="MASM"/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbbmalloc\win32-tbbmalloc-export.def">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbbmalloc\win64-tbbmalloc-export.def">
- <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
- <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
-" Outputs=""$(IntDir)\tbb.def""/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
-" Outputs=""$(IntDir)\tbbmalloc.def""/>
- </FileConfiguration>
- </File>
- <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\tbb_misc.cpp"/><File RelativePath="..\..\src\tbbmalloc\MemoryAllocator.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>
- <File RelativePath="..\..\include\tbb\_tbb_windef.h">
- </File>
- <File RelativePath="..\..\include\tbb\aligned_space.h">
- </File>
- <File RelativePath="..\..\include\tbb\atomic.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range2d.h">
- </File>
- <File RelativePath="..\..\include\tbb\blocked_range3d.h">
- </File>
- <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\combinable.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_queue.h">
- </File>
- <File RelativePath="..\..\include\tbb\concurrent_vector.h">
- </File>
- <File RelativePath="..\..\include\tbb\critical_section.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\Customize.h">
- </File>
- <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\LifoList.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\MapMemory.h">
- </File>
- <File RelativePath="..\..\include\tbb\mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_do.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_for_each.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_invoke.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_reduce.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_scan.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_sort.h">
- </File>
- <File RelativePath="..\..\include\tbb\parallel_while.h">
- </File>
- <File RelativePath="..\..\include\tbb\partitioner.h">
- </File>
- <File RelativePath="..\..\include\tbb\pipeline.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\proxy.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\recursive_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\scalable_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_mutex.h">
- </File>
- <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\Statistics.h">
- </File>
- <File RelativePath="..\..\include\tbb\task.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_group.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
- </File>
- <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_allocator.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_config.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_config_lrb.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_exception.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_machine.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_profiling.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_stddef.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_thread.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbb_version.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
- </File>
- <File RelativePath="..\..\include\tbb\tick_count.h">
- </File>
- <File RelativePath="..\..\src\tbbmalloc\TypeDefinitions.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
- </File>
- <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
- </File>
- </Filter>
- <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbbmalloc" ProjectGUID="{B15F131E-328A-4D42-ADC2-9FF4CA6306D8}" RootNamespace="tbbmalloc" Keyword="Win32Proj">
+ <Platforms>
+ <Platform Name="Win32"/>
+ <Platform Name="x64"/>
+ </Platforms>
+ <ToolFiles>
+ <DefaultToolFile FileName="masm.rules"/>
+ </ToolFiles>
+ <Configurations>
+ <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" BufferSecurityCheck="false" RuntimeLibrary="3" TreatWChar_tAsBuiltInType="true" U [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary="1" UsePrecompiled [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /I../../src /I../../src/rml/include /I../../include" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BufferSecurityCheck="false" BasicRuntimeChecks="0" RuntimeLibrary="1" TreatWChar_tAsBuiltInType="true" UsePrecompiledHeader="0" W [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHs- /Zc:forScope /Zc:wchar_t /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /I../../src /I../../src/rml/include /I../../include" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File RelativePath="..\..\src\tbb\intel64-masm\atomic_support.asm">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Debug\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Release\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Debug-MT\atomic_support.obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Debug-MT\atomic_support.obj"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="building atomic_support.obj" CommandLine="ml64 /Fo"intel64\Release-MT\atomic_support.obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm
+" Outputs="intel64\Release-MT\atomic_support.obj"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\ia32-masm\atomic_support.asm">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbb\ia32-masm\lock_byte.asm">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM" AdditionalOptions="/coff /Zi"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="MASM"/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\win32-tbbmalloc-export.def">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\win64-tbbmalloc-export.def">
+ <FileConfiguration Name="Debug|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32" ExcludedFromBuild="true">
+ <Tool Name="VCCustomBuildTool" Description="generating tbb.def file" CommandLine="cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbb.def"
+" Outputs=""$(IntDir)\tbb.def""/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCCustomBuildTool" Description="generating tbbmalloc.def file" CommandLine="cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)\tbbmalloc.def"
+" Outputs=""$(IntDir)\tbbmalloc.def""/>
+ </FileConfiguration>
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\tbb_misc.cpp"/><File RelativePath="..\..\src\tbbmalloc\MemoryAllocator.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.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>
+ <File RelativePath="..\..\include\tbb\_tbb_windef.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\aligned_space.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\atomic.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range2d.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\blocked_range3d.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\cache_aligned_allocator.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\combinable.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_hash_map.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_queue.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\concurrent_vector.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\critical_section.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\Customize.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\enumerable_thread_specific.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\LifoList.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\MapMemory.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\null_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\null_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_do.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_for.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_for_each.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_invoke.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_reduce.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_scan.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_sort.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\parallel_while.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\partitioner.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\pipeline.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\proxy.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\queuing_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\queuing_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\recursive_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\scalable_allocator.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\spin_mutex.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\spin_rw_mutex.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\Statistics.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_group.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_scheduler_init.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\task_scheduler_observer.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_allocator.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_config.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_config_lrb.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_exception.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_machine.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_profiling.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_stddef.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_thread.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbb_version.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tick_count.h">
+ </File>
+ <File RelativePath="..\..\src\tbbmalloc\TypeDefinitions.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\windows_ia32.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\machine\windows_intel64.h">
+ </File>
+ </Filter>
+ <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/vsproject/tbbmalloc_proxy.vcproj b/build/vsproject/tbbmalloc_proxy.vcproj
index eee991d..233f247 100644
--- a/build/vsproject/tbbmalloc_proxy.vcproj
+++ b/build/vsproject/tbbmalloc_proxy.vcproj
@@ -1,222 +1,206 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbbmalloc_proxy" ProjectGUID="{02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}" RootNamespace="tbbmalloc_proxy" Keyword="Win32Proj">
- <Platforms>
- <Platform Name="Win32"/>
- <Platform Name="x64"/>
- </Platforms>
- <ToolFiles>
- <DefaultToolFile FileName="masm.rules"/>
- </ToolFiles>
- <Configurations>
- <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" BasicRuntimeChecks="0" RuntimeLibrary=" [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary="3" TreatWChar_tAsBuil [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /Oy /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" Detec [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" Dete [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" BasicRuntimeChecks="0" RuntimeLibrary=" [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" RuntimeLibrary="1" TreatWChar_tAsBuil [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /Oy /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" Detec [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
- <Tool Name="VCPreBuildEventTool"/>
- <Tool Name="VCCustomBuildTool"/>
- <Tool Name="MASM"/>
- <Tool Name="VCXMLDataGeneratorTool"/>
- <Tool Name="VCWebServiceProxyGeneratorTool"/>
- <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
- <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" SuppressStartupBanner="false" Dete [...]
- <Tool Name="VCManagedResourceCompilerTool"/>
- <Tool Name="VCResourceCompilerTool"/>
- <Tool Name="VCPreLinkEventTool"/>
- <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)\tbbmalloc.def"" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
- <Tool Name="VCALinkTool"/>
- <Tool Name="VCManifestTool"/>
- <Tool Name="VCXDCMakeTool"/>
- <Tool Name="VCBscMakeTool"/>
- <Tool Name="VCFxCopTool"/>
- <Tool Name="VCAppVerifierTool"/>
- <Tool Name="VCWebDeploymentTool"/>
- <Tool Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File RelativePath="..\..\src\tbbmalloc\proxy.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.cpp"/></Filter>
- <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
- </File>
- <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
- </File>
- </Filter>
- <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
- <FileConfiguration Name="Debug|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Debug-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|Win32">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- <FileConfiguration Name="Release-MT|x64">
- <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="tbbmalloc_proxy" ProjectGUID="{02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}" RootNamespace="tbbmalloc_proxy" Keyword="Win32Proj">
+ <Platforms>
+ <Platform Name="Win32"/>
+ <Platform Name="x64"/>
+ </Platforms>
+ <ToolFiles>
+ <DefaultToolFile FileName="masm.rules"/>
+ </ToolFiles>
+ <Configurations>
+ <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" BasicRuntimeChecks="0" RuntimeLibrary=" [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" BufferSecurityCheck="false" RuntimeLi [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D_USE_RTM_VERSION /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /Wp64 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="4" DebugI [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." PreprocessorDefinitions="" MinimalRebuild="true" ExceptionHandling="1" BasicRuntimeChecks="0" RuntimeLibrary="1" UsePrecompiledHeader=" [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Debug-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" Optimization="0" AdditionalIncludeDirectories="." MinimalRebuild="false" ExceptionHandling="0" BasicRuntimeChecks="0" BufferSecurityCheck="false" RuntimeLibrary="1" TreatWChar_tAsB [...]
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy_debug.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|Win32" OutputDirectory="$(SolutionDir)ia32\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)ia32\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO " OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ <Configuration Name="Release-MT|x64" OutputDirectory="$(SolutionDir)intel64\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)intel64\$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1">
+ <Tool Name="VCPreBuildEventTool"/>
+ <Tool Name="VCCustomBuildTool"/>
+ <Tool Name="MASM"/>
+ <Tool Name="VCXMLDataGeneratorTool"/>
+ <Tool Name="VCMIDLTool" TargetEnvironment="3"/>
+ <Tool Name="VCCLCompilerTool" AdditionalOptions=" /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /GS- /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /W4 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc" AdditionalIncludeDirectories="." PreprocessorDefinitions="" ExceptionHandling="0" BufferSecurityCheck="false" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" DebugInformationFormat="3"/>
+ <Tool Name="VCManagedResourceCompilerTool"/>
+ <Tool Name="VCResourceCompilerTool"/>
+ <Tool Name="VCPreLinkEventTool"/>
+ <Tool Name="VCLinkerTool" AdditionalOptions="/nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO" OutputFile="$(OutDir)\tbbmalloc_proxy.dll" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="17"/>
+ <Tool Name="VCALinkTool"/>
+ <Tool Name="VCManifestTool"/>
+ <Tool Name="VCXDCMakeTool"/>
+ <Tool Name="VCBscMakeTool"/>
+ <Tool Name="VCFxCopTool"/>
+ <Tool Name="VCAppVerifierTool"/>
+ <Tool Name="VCPostBuildEventTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File RelativePath="..\..\src\tbbmalloc\proxy.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.cpp"/></Filter>
+ <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File RelativePath="..\..\src\tbbmalloc\tbb_function_replacement.h">
+ </File>
+ <File RelativePath="..\..\include\tbb\tbbmalloc_proxy.h">
+ </File>
+ </Filter>
+ <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File RelativePath="..\..\src\tbbmalloc\tbbmalloc.rc">
+ <FileConfiguration Name="Debug|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Debug-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|Win32">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ <FileConfiguration Name="Release-MT|x64">
+ <Tool Name="VCResourceCompilerTool" AdditionalOptions="/I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/windows.cl.inc b/build/windows.cl.inc
index 31cd8fc..39481aa 100644
--- a/build/windows.cl.inc
+++ b/build/windows.cl.inc
@@ -45,9 +45,6 @@ EH_FLAGS = /EHsc /GR
ifeq ($(cfg), release)
CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t
ASM_FLAGS =
-ifeq (ia32,$(arch))
- CPLUS_FLAGS += /Oy
-endif
endif
ifeq ($(cfg), debug)
CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG
@@ -77,21 +74,16 @@ ifeq ($(runtime),vc8)
WARNING_KEY += /Wp64
CPLUS_FLAGS += /D_USE_RTM_VERSION
endif
-ifeq ($(runtime),vc_mt)
+ifeq ($(runtime),vc9)
OPENMP_FLAG = /openmp
- WARNING_KEY += /Wp64
- CPLUS_FLAGS += /D_USE_RTM_VERSION
endif
-ifeq ($(runtime),vc9)
+ifeq ($(runtime),vc_mt)
OPENMP_FLAG = /openmp
endif
-
ifeq (intel64,$(arch))
CPLUS_FLAGS += /GS-
endif
-
-
CPLUS_FLAGS += /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE \
/D_WIN32_WINNT=$(_WIN32_WINNT)
C_FLAGS = $(CPLUS_FLAGS)
@@ -105,11 +97,11 @@ C_FLAGS = $(CPLUS_FLAGS)
#------------------------------------------------------------------------------
ASSEMBLY_SOURCE=$(arch)-masm
ifeq (intel64,$(arch))
- ASM=ml64
+ ASM=ml64 /nologo
ASM_FLAGS += /DEM64T=1 /c /Zi
TBB_ASM.OBJ = atomic_support.obj
else
- ASM=ml
+ ASM=ml /nologo
ASM_FLAGS += /c /coff /Zi
TBB_ASM.OBJ = atomic_support.obj lock_byte.obj
endif
diff --git a/build/windows.gcc.inc b/build/windows.gcc.inc
index 9b4a981..ba88641 100644
--- a/build/windows.gcc.inc
+++ b/build/windows.gcc.inc
@@ -34,12 +34,15 @@ LIBEXT = dll # MinGW allows linking with DLLs directly
TBB.RES =
MALLOC.RES =
+RML.RES =
TBB.MANIFEST =
MALLOC.MANIFEST =
+RML.MANIFEST =
# TODO: do better when/if mingw64 support is added
TBB.DEF = $(tbb_root)/src/tbb/lin32-tbb-export.def
MALLOC.DEF = $(MALLOC_ROOT)/win-gcc-tbbmalloc-export.def
+RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def
LINK_TBB.LIB = $(TBB.LIB)
@@ -98,6 +101,9 @@ ifeq (ia32,$(arch))
LIB_LINK_FLAGS += -m32
endif
+# For examples
+export UNIXMODE = 1
+
#------------------------------------------------------------------------------
# End of command lines
#------------------------------------------------------------------------------
diff --git a/build/windows.icl.inc b/build/windows.icl.inc
index 6f1c21f..d2a12e8 100644
--- a/build/windows.icl.inc
+++ b/build/windows.icl.inc
@@ -54,9 +54,6 @@ EH_FLAGS = /EHsc /GR
ifeq ($(cfg), release)
CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t
ASM_FLAGS =
-ifeq (ia32,$(arch))
- CPLUS_FLAGS += /Oy
-endif
endif
ifeq ($(cfg), debug)
CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG
@@ -93,9 +90,6 @@ ifeq ($(runtime),vc8)
CPLUS_FLAGS += /D_USE_RTM_VERSION
endif
-ifeq ($(runtime),vc_mt)
- CPLUS_FLAGS += /D_USE_RTM_VERSION
-endif
C_FLAGS = $(CPLUS_FLAGS)
@@ -115,6 +109,9 @@ ifeq ($(VCCOMPAT_FLAG),)
VCCOMPAT_FLAG := $(if $(findstring vc9, $(VCVERSION)),/Qvc9)
endif
ifeq ($(VCCOMPAT_FLAG),)
+ VCCOMPAT_FLAG := $(if $(findstring vc10, $(VCVERSION)),/Qvc10)
+endif
+ifeq ($(VCCOMPAT_FLAG),)
$(error VC version not detected correctly: $(VCVERSION) )
endif
export VCCOMPAT_FLAG
@@ -128,11 +125,11 @@ export VCCOMPAT_FLAG
#------------------------------------------------------------------------------
ASSEMBLY_SOURCE=$(arch)-masm
ifeq (intel64,$(arch))
- ASM=ml64
+ ASM=ml64 /nologo
ASM_FLAGS += /DEM64T=1 /c /Zi
TBB_ASM.OBJ = atomic_support.obj
else
- ASM=ml
+ ASM=ml /nologo
ASM_FLAGS += /c /coff /Zi
TBB_ASM.OBJ = atomic_support.obj lock_byte.obj
endif
diff --git a/build/windows.inc b/build/windows.inc
index 7f7a02b..a1f04bf 100644
--- a/build/windows.inc
+++ b/build/windows.inc
@@ -90,7 +90,7 @@ RML.DEF = $(RML_SERVER_ROOT)/$(def_prefix)-rml-export.def
RML.DLL = irml$(DEBUG_SUFFIX).$(DLL)
RML.LIB = irml$(DEBUG_SUFFIX).$(LIBEXT)
RML.RES = irml.res
-ifneq ($(runtime),vc7.1)
+ifneq ($(filter vc8 vc9,$(runtime)),)
RML.MANIFEST = tbbmanifest.exe.manifest
endif
diff --git a/build/windows.cl.inc b/build/xbox360.cl.inc
similarity index 83%
copy from build/windows.cl.inc
copy to build/xbox360.cl.inc
index 31cd8fc..cd04d00 100644
--- a/build/windows.cl.inc
+++ b/build/xbox360.cl.inc
@@ -34,23 +34,17 @@
#------------------------------------------------------------------------------
CPLUS = cl /nologo
LINK_FLAGS = /link /nologo
-LIB_LINK_FLAGS=/link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO
-ifeq ($(runtime), vc_mt)
- MS_CRT_KEY = /MT$(if $(findstring debug,$(cfg)),d)
-else
- MS_CRT_KEY = /MD$(if $(findstring debug,$(cfg)),d)
-endif
+LIB_LINK_FLAGS=/link /nologo /DLL /MAP /DEBUG
+MS_CRT_KEY = /MT$(if $(findstring debug,$(cfg)),d)
EH_FLAGS = /EHsc /GR
-
+
ifeq ($(cfg), release)
- CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t
+ CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /D_XBOX /DTBB_NO_LEGACY=1
ASM_FLAGS =
-ifeq (ia32,$(arch))
- CPLUS_FLAGS += /Oy
-endif
endif
ifeq ($(cfg), debug)
- CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG
+ CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope \
+ /DTBB_DO_ASSERT /D_XBOX /DTBB_NO_LEGACY=1
ASM_FLAGS = /DUSE_FRAME_POINTER
endif
@@ -62,31 +56,19 @@ DEFINE_KEY = /D
OUTPUT_KEY = /Fe
OUTPUTOBJ_KEY = /Fo
WARNING_AS_ERROR_KEY = /WX
-
-ifeq ($(runtime),vc7.1)
- WARNING_KEY = /W3
-else
- WARNING_KEY = /W4
-endif
-
+WARNING_KEY = /W3
DYLIB_KEY = /DLL
EXPORT_KEY = /DEF:
-ifeq ($(runtime),vc8)
OPENMP_FLAG = /openmp
- WARNING_KEY += /Wp64
- CPLUS_FLAGS += /D_USE_RTM_VERSION
-endif
-ifeq ($(runtime),vc_mt)
+ifeq ($(runtime),vc8)
OPENMP_FLAG = /openmp
- WARNING_KEY += /Wp64
- CPLUS_FLAGS += /D_USE_RTM_VERSION
endif
ifeq ($(runtime),vc9)
OPENMP_FLAG = /openmp
endif
-ifeq (intel64,$(arch))
+ifeq (em64t,$(arch))
CPLUS_FLAGS += /GS-
endif
@@ -94,7 +76,7 @@ endif
CPLUS_FLAGS += /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE \
/D_WIN32_WINNT=$(_WIN32_WINNT)
-C_FLAGS = $(CPLUS_FLAGS)
+C_FLAGS = $(CPLUS_FLAGS) /TC
#------------------------------------------------------------------------------
# End of setting compiler flags.
#------------------------------------------------------------------------------
@@ -104,14 +86,20 @@ C_FLAGS = $(CPLUS_FLAGS)
# Setting assembler data.
#------------------------------------------------------------------------------
ASSEMBLY_SOURCE=$(arch)-masm
-ifeq (intel64,$(arch))
+ifeq (XBOX360,$(arch))
+#do nothing for XBOX360
+else
+
+ifeq (em64t,$(arch))
ASM=ml64
ASM_FLAGS += /DEM64T=1 /c /Zi
- TBB_ASM.OBJ = atomic_support.obj
+ TBB_ASM.OBJ =
else
ASM=ml
ASM_FLAGS += /c /coff /Zi
- TBB_ASM.OBJ = atomic_support.obj lock_byte.obj
+ TBB_ASM.OBJ =
+endif
+
endif
#------------------------------------------------------------------------------
# End of setting assembler data.
diff --git a/build/lrb.host.inc b/build/xbox360.inc
similarity index 51%
rename from build/lrb.host.inc
rename to build/xbox360.inc
index 679948e..8852934 100644
--- a/build/lrb.host.inc
+++ b/build/xbox360.inc
@@ -24,31 +24,54 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-ifeq ($(CPLUS),)
- $(error Host compiler should be included, it is used for host application and netsim)
+ifdef tbb_build_dir
+ test_dir:=$(tbb_build_dir)
+else
+ test_dir:=.
endif
-ifeq (ia32,$(arch))
- LRB_HOST_ARCH = 32# TODO: check what is NETSIM_LRB_32_OVERRIDE
- MACHINE_TYPE = x86
-else
- LRB_HOST_ARCH = 64#
- MACHINE_TYPE = x64
+# TODO give an error if archs doesn't match
+ifndef arch
+ export arch:=xbox360
endif
-CPLUS_FLAGS_HOST := $(CPLUS_FLAGS) /I$(LRB_INC_DIR) $(LINK_FLAGS) /LIBPATH:$(LRB_LIB_DIR) xn_host$(LRB_HOST_ARCH)$(CFG_LETTER).lib
-CPLUS_FLAGS += /I$(LRB_INC_DIR) /D__LRB__
-LRB_LINK_FLAGS = /LIBPATH:$(LRB_LIB_DIR) xn_lrb$(LRB_HOST_ARCH)$(CFG_LETTER).lib /NODEFAULTLIB:"LIBCMT"
-LINK_FLAGS += $(DYLIB_KEY) $(LRB_LINK_FLAGS)
-LIB_LINK_FLAGS += $(LRB_LINK_FLAGS)
+ifndef runtime
+ export runtime:=xdk
+endif
-ifdef TEST_RESOURCE
-LINK_FLAGS += $(TEST_RESOURCE) /MACHINE:$(MACHINE_TYPE)
+native_compiler := cl
+export compiler ?= cl
+debugger ?= devenv /debugexe
-$(TEST_PREREQUISITE): harness_lrb_host.cpp
- cl /Fe$@ $< $(CPLUS_FLAGS_HOST)
+CMD=cmd /C
+CWD=$(shell cmd /C echo %CD%)
+RM=cmd /C del /Q /F
+RD=cmd /C rmdir
+MD=cmd /c mkdir
+SLASH=\\
+NUL = nul
-NO_LEGACY_TESTS = 1
-NO_C_TESTS = 1
-TEST_LAUNCHER=# for tbbmalloc
-endif
+OBJ = obj
+DLL = dll
+LIBEXT = lib
+
+def_prefix = $(arch)
+
+# Target Windows version. Do not increase beyond 0x0500 without prior discussion!
+# Used as the value for macro definition opiton in compiler specific inc files.
+_WIN32_WINNT=0x0400
+
+TBB.DEF = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.def
+TBB.DLL = tbb$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = tbb$(DEBUG_SUFFIX).$(LIBEXT)
+TBB.RES =
+#On Windows we specify appropriate tbb library using #pragma comment
+LINK_TBB.LIB =
+
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
+MALLOC.DLL = tbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT)
+MALLOC.RES =
+
+MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(compiler) $(arch) $(subst \,/,"$(CPLUS) $(CPLUS_FLAGS) $(INCLUDES)") > version_string.tmp
+MAKE_TBBVARS = cmd /C "$(subst /,\,$(tbb_root))\build\generate_tbbvars.bat"
diff --git a/doc/Release_Notes.txt b/doc/Release_Notes.txt
index 73b1749..9e4d32b 100644
--- a/doc/Release_Notes.txt
+++ b/doc/Release_Notes.txt
@@ -1,6 +1,6 @@
------------------------------------------------------------------------
Intel(R) Threading Building Blocks - Release Notes
- Version 2.2
+ Version 3.0
------------------------------------------------------------------------
@@ -61,33 +61,31 @@ Software - Supported Operating Systems
Microsoft* Windows* Server 2008
Microsoft* Windows* 7
Linux* Systems
- Red Hat* Enterprise Linux* 3, 4, 5
+ Red Hat* Enterprise Linux* 4, 5
(when using Red Hat* Enterprise Linux* 4 with Intel(R)
Itanium(R) processors, operating system Update 2 or higher
is recommended)
- Fedora* 10, 11
+ Fedora* 10, 11, 12
(not with Intel(R) Itanium(R) processors)
Asianux* 3.0
- Debian* GNU/Linux* 4.0, 5.0
- Ubuntu* 8.04, 8.10, 9.04
- SuSE* Linux* Enterprise Server (SLES) 9, 10, 11
- SGI* Propack* 5.0 (not with IA-32 architecture processors)
- Turbolinux* 11
+ Debian* GNU/Linux* 5.0
+ Ubuntu* 9.04, 9.10
+ SuSE* Linux* Enterprise Server (SLES) 10, 11
Mac OS* X Systems
Mac OS* X 10.5.6 or higher
Software - Supported Compilers
- Microsoft* Visual C++* 7.1 (Microsoft* Visual Studio* .NET 2003,
- Windows* systems only, deprecated)
Microsoft* Visual C++ 8.0 (Microsoft* Visual Studio* 2005,
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 10.1 or higher
For each supported Linux* operating system, the standard gcc
version provided with that operating system is supported,
- including gcc 3.2 through 4.4
+ including gcc 3.4 through 4.4
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.2 or higher)
@@ -101,10 +99,6 @@ Intel(R) Threading Building Blocks.
Library Issues
- - The atomic<long long> and atomic<unsigned long long> templates are
- not supported when using the Microsoft* Visual C++* 7.1
- (Microsoft* Visual Studio* .NET 2003) compiler.
-
- Unhandled exceptions in the user code executed in the context of
TBB algorithms or containers may cause segmentation faults when
Intel(R) C++ Compiler 10.x is used with glibc 2.3.2 to 2.3.4.
@@ -139,16 +133,8 @@ Library Issues
- Intel(R) TBB 2.2 Update 1 fixed known bugs with exception handling
in concurrent_vector. For applications using both exceptions
- and concurrent_vector, recompilation with newer TBB version
- is recommended.
-
- - To use TBB examples with Microsoft Visual Studio* 2010 Beta2,
- first open a solution for a previous version of Visual Studio
- and proceed with automatic conversion of the projects. Then
- open project properties, and for every configuration replace
- vc8 or vc9 with vc_mt in TBB paths used in:
- - Linker -> General -> Additional Library Directories;
- - Build Events -> Post-Build Event -> Command Line.
+ and concurrent_vector, recompilation with TBB 2.2 Update 1
+ or a newer version is recommended.
------------------------------------------------------------------------
Copyright (C) 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00001.html b/doc/html/a00001.html
index 23cd34c..2d89d4d 100644
--- a/doc/html/a00001.html
+++ b/doc/html/a00001.html
@@ -20,12 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00121.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00121.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00121.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00121.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00142.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00002.html b/doc/html/a00002.html
index 3d55d0b..019f327 100644
--- a/doc/html/a00002.html
+++ b/doc/html/a00002.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::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00122.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="a00122.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00122.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="a00122.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00122.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00143.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="a00143.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00143.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="a00143.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00003.html b/doc/html/a00003.html
index 740748b..5fc6de9 100644
--- a/doc/html/a00003.html
+++ b/doc/html/a00003.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::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00123.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="a00123.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00123.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="a00123.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00123.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00144.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="a00144.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00144.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="a00144.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00144.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00004.html b/doc/html/a00004.html
index 3e54bbb..24e961e 100644
--- a/doc/html/a00004.html
+++ b/doc/html/a00004.html
@@ -20,23 +20,23 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00127.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00127.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00127.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="a00127.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00127.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="a00127.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00148.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00148.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="a00148.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00148.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="a00148.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00005.html b/doc/html/a00005.html
index f8b9e82..fda8a82 100644
--- a/doc/html/a00005.html
+++ b/doc/html/a00005.html
@@ -20,19 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00128.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="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00128.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="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00128.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="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00128.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="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00128.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00128.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00128.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00128.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00128.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00149.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="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.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="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.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="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.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="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00006.html b/doc/html/a00006.html
index 1d762fe..c414b3b 100644
--- a/doc/html/a00006.html
+++ b/doc/html/a00006.html
@@ -20,21 +20,21 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00129.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="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00129.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="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00129.html">tbb::blocked_range3d [...]
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00129.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="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00129.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00129.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00129.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00129.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00129.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00129.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="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00129.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00150.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="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.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="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d [...]
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.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="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00150.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="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00007.html b/doc/html/a00007.html
index 3f4767d..fc61e7c 100644
--- a/doc/html/a00007.html
+++ b/doc/html/a00007.html
@@ -20,27 +20,27 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00130.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00130.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00130.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00130.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.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="a00130.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.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="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00009.html b/doc/html/a00009.html
index b5fc196..66833ec 100644
--- a/doc/html/a00009.html
+++ b/doc/html/a00009.html
@@ -20,13 +20,13 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00131.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="a00131.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00131.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="a00131.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00131.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="a00131.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00131.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00152.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="a00152.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00152.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="a00152.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00152.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="a00152.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00011.html b/doc/html/a00011.html
index 898f8b6..16516f6 100644
--- a/doc/html/a00011.html
+++ b/doc/html/a00011.html
@@ -20,20 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00133.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.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="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.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="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.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="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine</b>(FCombine fcombine) (defined in <a class="el" href="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(FCombine fcombine) (defined in <a class="el" href="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.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="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.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="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.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="a00133.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00133.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00133.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00133.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00154.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00012.html b/doc/html/a00012.html
index d6ca7d6..ab8e91d 100644
--- a/doc/html/a00012.html
+++ b/doc/html/a00012.html
@@ -20,73 +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::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#d1c1e23f2a3ba1f943d00d95388d718f">bucket_count</a>() const </td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#36bcd50fd5383f3682032323b2d74333">clear</a>()</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#342582ba05d9fb893ed80875d2b7a42f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#c1bf3c669935aceb1dc0169e3a19e0be">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#bc50f7bca65d0c27cbf5c31d2fa63eac">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#b5132202dff9ee3d619bef6b1d84edea">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#a3e97a1f3cb66e81a2336b013ef1ae7d">count</a>(const Key &key) const </td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#3e5d085375320cd3f34faeedc5bba8f6">empty</a>() const </td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#58df7a1e4373c55eb4c2fa9dc69516b1">erase</a>(const Key &key)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#fc64086f9f518cef8c368c9429d0064e">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#b65abfa291da566617dd58dfb349630a">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#671965989ffb5f6084c776cb0bb6cdab">exclude</a>(const_accessor &item_accessor, bool readonly)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#9fa1ca60af4ef761a100617b27718585">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#4f7cc0aab2d8216c0a6e681f32dd48c8">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#79d1e5c3b975dbd38b43138266fe4c0e">get_allocator</a>() const </td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#67d8c254b1666d89267c8a4a33c864f3">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#8ea81ff7fea044f859273b354c91c185">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#68a46a26bd4308c1780d021ca7e8fc15">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#7bd4dcf6ea74a32299fd57d8d7fc7ed8">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#3034a308bc839695a5714a107380c4b9">insert</a>(const value_type &value)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#7b42dba04d71e1367f0d542087906178">insert</a>(I first, I last)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#7973cd92f57dcb092ab757f8d9e089f9">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#308ec5ad19fdd1be4d345f8013070150">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#f0cdf5930563a49ffe827c520e948e01">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#0f0ba43d9cb783f12dd01bf5677da097">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#6ed260e217fb310050928d7bd03f1b5e">max_size</a>() const </td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#adadeb9d1acb8c3b34517435666cf297">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#9ba53dc3a98d81331ded7c6c2b17f58f">rehash</a>(size_type n=0)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#25b0e3881038877604c5efc1c14c4afd">size</a>() const </td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#dd73f70aa6602021ea2c56bac9715353">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00135.html">tbb::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="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00135.html#5e96649f71f68f3b6bf3b1eee6b441a7">~concurrent_hash_map</a>()</td><td><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00208.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="a00208.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00208.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="a00208.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00208.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00013.html b/doc/html/a00013.html
new file mode 100644
index 0000000..fdac41b
--- /dev/null
+++ b/doc/html/a00013.html
@@ -0,0 +1,95 @@
+<!DOCTYPE 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::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">bucket_count</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#a9f89be8fe28835749529d91081a2511">clear</a>()</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#a4612d5c7233712d455496641e9b31ff">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">count</a>(const Key &key) const </td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">empty</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">erase</a>(const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">exclude</a>(const_accessor &item_accessor, bool readonly)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">get_allocator</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#58c38b27273de6c670568633c0931854">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#a657e61cd2b13164764ca2708875784a">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">insert</a>(const value_type &value)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">insert</a>(I first, I last)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">max_size</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">rehash</a>(size_type n=0)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00156.html">tbb::interface4::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="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">~concurrent_hash_map</a>()</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00014.html b/doc/html/a00014.html
deleted file mode 100644
index a324ed7..0000000
--- a/doc/html/a00014.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00137.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00137.html#7b75959ce5a971b05cfefcbc1d09a022">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00137.html">tbb::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="a00137.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00137.html">tbb::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="a00137.html#adf8e405df5787351fe816c42042b9ec">is_writer</a>()</td><td><a class="el" href="a00137.html">tbb::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="a00137.html#7e98ad1b46ed35fb4a92d65c16c6982d">operator()</a>()</td><td><a class="el" href="a00137.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00137.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00137.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00015.html b/doc/html/a00015.html
index ee0c3ca..e636df4 100644
--- a/doc/html/a00015.html
+++ b/doc/html/a00015.html
@@ -20,19 +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::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00138.html">tbb::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="a00138.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00138.html">tbb::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="a00138.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00138.html">tbb::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="a00138.html#6eedb35a3ca397dd289ed5ca6fb4d95d">const_accessor</a>()</td><td><a class="el" href="a00138.html">tbb::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="a00138.html#e55c7c3f0acd7fd823a07957e71a7462">empty</a>() const </td><td><a class="el" href="a00138.html">tbb::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="a00138.html#d95b7a39a08b7ab256dfff2ca37cdb75">operator *</a>() const </td><td><a class="el" href="a00138.html">tbb::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="a00138.html#6fc0491f6420ffe38c48786e7b9ab042">operator-></a>() const </td><td><a class="el" href="a00138.html">tbb::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="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>()</td><td><a class="el" href="a00138.html">tbb::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="a00138.html#b5de4197079009b1cfd8bdeb594c6428">value_type</a> typedef</td><td><a class="el" href="a00138.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00138.html#e002771760f510e06c03e0a198286172">~const_accessor</a>()</td><td><a class="el" href="a00138.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00158.html">tbb::interface4::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="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00158.html">tbb::interface4::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="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::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="a00158.html#57c6110bd20e95c06de5a199de988941">operator()</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00016.html b/doc/html/a00016.html
index 82453e9..7eaf1a0 100644
--- a/doc/html/a00016.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::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00136.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00138.html#6eedb35a3ca397dd289ed5ca6fb4d95d">const_accessor</a>()</td><td><a class="el" href="a00138.html">tbb::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="a00138.html#e55c7c3f0acd7fd823a07957e71a7462">empty</a>() const </td><td><a class="el" href="a00138.html">tbb::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="a00136.html#03a091f7355a3c0c03f839893695f372">operator *</a>() const </td><td><a class="el" href="a00136.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00136.html#302f02e5deec0a67b872e9cfb08d9e60">operator-></a>() const </td><td><a class="el" href="a00136.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>()</td><td><a class="el" href="a00138.html">tbb::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="a00136.html#34035ddb9e2a27f2f0a1f6a2a16730cf">value_type</a> typedef</td><td><a class="el" href="a00136.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00138.html#e002771760f510e06c03e0a198286172">~const_accessor</a>()</td><td><a class="el" href="a00138.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00159.html">tbb::interface4::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="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#5cce3104cb0a52e08d2131370871c614">empty</a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#30f31106840700a4c3664b9cb1c31ca7">operator *</a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#48647ca0d79c1233b997f5768403c926">value_type</a> typedef</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00017.html b/doc/html/a00017.html
index 46a7b39..bcec9ff 100644
--- a/doc/html/a00017.html
+++ b/doc/html/a00017.html
@@ -20,33 +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::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00139.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="a00139.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.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="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00139.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::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="a00159.html#5cce3104cb0a52e08d2131370871c614">empty</a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::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="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">operator *</a>() const </td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">operator-></a>() const </td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::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="a00157.html#49eec74f272bab187d176c0d9d16a7fe">value_type</a> typedef</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00018.html b/doc/html/a00018.html
index 8fd9152..9fa9d87 100644
--- a/doc/html/a00018.html
+++ b/doc/html/a00018.html
@@ -20,37 +20,33 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">set_capacity</a>(size_type capacity)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00160.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="a00160.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.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="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00018.html b/doc/html/a00019.html
similarity index 56%
copy from doc/html/a00018.html
copy to doc/html/a00019.html
index 8fd9152..d53f314 100644
--- a/doc/html/a00018.html
+++ b/doc/html/a00019.html
@@ -20,37 +20,37 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">set_capacity</a>(size_type capacity)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00134.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00020.html b/doc/html/a00020.html
deleted file mode 100644
index 02a36de..0000000
--- a/doc/html/a00020.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00134.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00140.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00140.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00140.html#383187b910f8c3ca27a39c1638566f15">concurrent_queue</a>(InputIterator begin, InputIterator end, const A &a=A())</td><td><a class="el" href="a00140.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00134.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00134.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.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="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00140.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00140.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">set_capacity</a>(size_type capacity)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.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="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00021.html b/doc/html/a00021.html
index f1918f1..951361b 100644
--- a/doc/html/a00021.html
+++ b/doc/html/a00021.html
@@ -20,80 +20,46 @@
<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="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00141.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="a00141.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00141.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00155.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00161.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00155.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00155.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.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="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00026.html b/doc/html/a00026.html
index 3381949..d8494d8 100644
--- a/doc/html/a00026.html
+++ b/doc/html/a00026.html
@@ -20,44 +20,80 @@
<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::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00143.html#60047d25605a1ef993c49234e9ac5c2d">allocator_type</a> typedef</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>()</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#ba6674c6102a6faf8f96d131497654b3">begin</a>() const </td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">clear</a>()</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#ad23345a722622199deaa4dfd243d9f8">empty</a>() const </td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>()</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#89811890e6a77f1e0cfc6c24ed35d09b">end</a>() const </td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#e5698930b84c098bb6d87175b8b50306">enumerable_thread_specific</a>(Finit _finit)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#0466c43272d8458185e980fc2dc4abe2">enumerable_thread_specific</a>(const T &_exemplar)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>()</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#9505351eace34ed7130257adcae91706">local</a>(bool &exists)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#56f6124f5870e26433a5bb2b71e4b7e9">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#a32dd1d88e42dc1faccceca244b12b6c">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#302a4d6f55f852d5b7a6679e0e00316e">size</a>() const </td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00143.html#41176526161d6fef1bdd19c2db7ded4d">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></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="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00162.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="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00030.html b/doc/html/a00030.html
deleted file mode 100644
index 2d210db..0000000
--- a/doc/html/a00030.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00150.html">tbb::mutex</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00150.html">tbb::mutex</a>)</td><td><a class="el" href="a00150.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="a00150.html">tbb::mutex</a>)</td><td><a class="el" href="a00150.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="a00150.html">tbb::mutex</a>)</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00150.html">tbb::mutex</a>)</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00150.html">tbb::mutex</a>)</td><td><a class="el" href="a00150.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00031.html b/doc/html/a00031.html
index e901e0b..f43057d 100644
--- a/doc/html/a00031.html
+++ b/doc/html/a00031.html
@@ -20,17 +20,44 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00151.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00151.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00151.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="a00151.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">allocator_type</a> typedef</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#efd1e3d008ec5cd69c6b10c6dcac1e2c">begin</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">begin</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">clear</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">empty</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#3156594e622924c094c45faa261dba5a">end</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">end</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#ca9994099ebd88e92be061452687422e">enumerable_thread_specific</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#724ed4c846493da62b4efe032e16eb4a">enumerable_thread_specific</a>(Finit _finit)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">enumerable_thread_specific</a>(const T &_exemplar)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#8bcc55bfecc81937872b13f6db962b16">local</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">local</a>(bool &exists)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#ab3f04b8d355b5d311e955d3bb63562c">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">size</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00032.html b/doc/html/a00032.html
deleted file mode 100644
index e354e85..0000000
--- a/doc/html/a00032.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00152.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="a00152.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00152.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="a00152.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00152.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="a00152.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00152.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="a00152.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00152.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00033.html b/doc/html/a00033.html
deleted file mode 100644
index 84a5da9..0000000
--- a/doc/html/a00033.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00153.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="a00153.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00153.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00034.html b/doc/html/a00034.html
index 0873f0d..898dc6e 100644
--- a/doc/html/a00034.html
+++ b/doc/html/a00034.html
@@ -20,14 +20,27 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00154.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="a00154.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00154.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="a00154.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00154.html">tbb::null_rw_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="a00172.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="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.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="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.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="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00172.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00172.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="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00172.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="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00172.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00172.html">tbb::mutex</a>)</td><td><a class="el" href="a00172.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00035.html b/doc/html/a00035.html
index e3ff5f9..61e86b5 100644
--- a/doc/html/a00035.html
+++ b/doc/html/a00035.html
@@ -20,18 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::null_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.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="a00155.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00155.html">tbb::null_rw_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="a00173.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00173.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00173.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="a00173.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00173.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00173.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00173.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00173.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00173.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00036.html b/doc/html/a00036.html
index 1bdc2e0..2dd8fa8 100644
--- a/doc/html/a00036.html
+++ b/doc/html/a00036.html
@@ -20,12 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00156.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00156.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00156.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="a00156.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00156.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00174.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="a00174.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00174.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00037.html b/doc/html/a00037.html
index 2face09..7a2f0ad 100644
--- a/doc/html/a00037.html
+++ b/doc/html/a00037.html
@@ -20,11 +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::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00159.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="a00159.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00159.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00175.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="a00175.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00175.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00038.html b/doc/html/a00038.html
index 4dc1c2b..23355f6 100644
--- a/doc/html/a00038.html
+++ b/doc/html/a00038.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::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00145.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="a00145.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00145.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00176.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="a00176.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00176.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="a00176.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00176.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="a00176.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00176.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="a00176.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00176.html">tbb::null_rw_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00039.html b/doc/html/a00039.html
index 12508d5..93002c2 100644
--- a/doc/html/a00039.html
+++ b/doc/html/a00039.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::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00157.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00157.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></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="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.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="a00177.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00177.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00040.html b/doc/html/a00040.html
index 7f14a54..8e26dde 100644
--- a/doc/html/a00040.html
+++ b/doc/html/a00040.html
@@ -20,14 +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="a00168.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="a00168.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00168.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="a00168.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00168.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="a00168.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00168.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="a00168.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00168.html">tbb::simple_partitioner</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="a00178.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00178.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00178.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="a00178.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00178.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00037.html b/doc/html/a00041.html
similarity index 85%
copy from doc/html/a00037.html
copy to doc/html/a00041.html
index 2face09..7460015 100644
--- a/doc/html/a00037.html
+++ b/doc/html/a00041.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::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00159.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="a00159.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00159.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00181.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="a00181.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00181.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00042.html b/doc/html/a00042.html
index ec2fa42..34b0448 100644
--- a/doc/html/a00042.html
+++ b/doc/html/a00042.html
@@ -20,14 +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::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00125.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="a00125.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00125.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="a00125.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00125.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="a00125.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00125.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="a00125.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00125.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00167.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="a00167.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00167.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00039.html b/doc/html/a00043.html
similarity index 72%
copy from doc/html/a00039.html
copy to doc/html/a00043.html
index 12508d5..c7d6559 100644
--- a/doc/html/a00039.html
+++ b/doc/html/a00043.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::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00157.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00157.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00157.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00179.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00179.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00044.html b/doc/html/a00044.html
index 9adeab0..6fb7d3c 100644
--- a/doc/html/a00044.html
+++ b/doc/html/a00044.html
@@ -20,16 +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::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00120.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="a00120.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00120.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="a00120.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00120.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="a00120.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00120.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="a00120.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00120.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce_with_affinity</b> (defined in <a class="el" href="a00120.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00120.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="a00120.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00120.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00193.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="a00193.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00193.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="a00193.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00193.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="a00193.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00193.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="a00193.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00193.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00045.html b/doc/html/a00045.html
deleted file mode 100644
index 0553e8e..0000000
--- a/doc/html/a00045.html
+++ /dev/null
@@ -1,49 +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::filter Member List</h1>This is the complete list of members for <a class="el" href="a00144.html">tbb::filter</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>filter</b>(bool is_serial_) (defined in <a class="el" href="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00144.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="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.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="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> enum name</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">parallel</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">serial</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">serial_in_order</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">serial_out_of_order</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00046.html b/doc/html/a00046.html
index 06320be..ca8a641 100644
--- a/doc/html/a00046.html
+++ b/doc/html/a00046.html
@@ -20,32 +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::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00182.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="a00182.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00182.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b>(bool is_serial_) (defined in <a class="el" href="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00144.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="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.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="a00144.html">tbb::filter</a>)</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00144.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="a00182.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00182.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> enum name</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">parallel</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00182.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00182.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="a00182.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00182.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">serial</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">serial_in_order</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">serial_out_of_order</a> enum value</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00182.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00182.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="a00182.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00182.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00182.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00182.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00144.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00144.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00146.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="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.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="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.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="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.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="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00047.html b/doc/html/a00047.html
deleted file mode 100644
index e40d826..0000000
--- a/doc/html/a00047.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::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00158.html">tbb::pipeline</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00158.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00158.html">tbb::pipeline</a>)</td><td><a class="el" href="a00158.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="a00158.html">tbb::pipeline</a>)</td><td><a class="el" href="a00158.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="a00158.html">tbb::pipeline</a>)</td><td><a class="el" href="a00158.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="a00158.html">tbb::pipeline</a>)</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00158.html">tbb::pipeline</a>)</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00158.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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 432d1c9..7fa0f2a 100644
--- a/doc/html/a00048.html
+++ b/doc/html/a00048.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::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00160.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="a00160.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00160.html">tbb::queuing_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00160.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00160.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="a00160.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00160.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="a00160.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00160.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00160.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="a00160.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00160.html">tbb::queuing_mutex</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="a00141.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="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce_with_affinity</b> (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.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="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00049.html b/doc/html/a00049.html
index 4efe5c2..1467f4a 100644
--- a/doc/html/a00049.html
+++ b/doc/html/a00049.html
@@ -20,16 +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::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00161.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00165.html">tbb::filter</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00165.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="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.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="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00165.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="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00050.html b/doc/html/a00050.html
index 0076995..5c0d41e 100644
--- a/doc/html/a00050.html
+++ b/doc/html/a00050.html
@@ -20,17 +20,25 @@
<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="a00162.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="a00162.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00162.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="a00162.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00162.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00162.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="a00162.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00162.html">tbb::queuing_rw_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00162.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00209.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="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00165.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="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.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="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00165.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="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00209.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="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.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="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00051.html b/doc/html/a00051.html
index 21bdab1..add893f 100644
--- a/doc/html/a00051.html
+++ b/doc/html/a00051.html
@@ -20,18 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00163.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00180.html">tbb::pipeline</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00180.html">tbb::pipeline</a>)</td><td><a class="el" href="a00180.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="a00180.html">tbb::pipeline</a>)</td><td><a class="el" href="a00180.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="a00180.html">tbb::pipeline</a>)</td><td><a class="el" href="a00180.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="a00180.html">tbb::pipeline</a>)</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00180.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00180.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb::interface5::internal::pipeline_proxy</b> (defined in <a class="el" href="a00180.html">tbb::pipeline</a>)</td><td><a class="el" href="a00180.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="a00180.html">tbb::pipeline</a>)</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00180.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00052.html b/doc/html/a00052.html
deleted file mode 100644
index 6731749..0000000
--- a/doc/html/a00052.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00164.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="a00164.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00164.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="a00164.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00164.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="a00164.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00164.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00164.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00164.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="a00164.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00164.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00164.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00164.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="a00164.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00164.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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
index 6ac3b43..174dc97 100644
--- a/doc/html/a00053.html
+++ b/doc/html/a00053.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::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00165.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="a00165.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>make_filter</b> (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::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="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00054.html b/doc/html/a00054.html
index d21159d..d54d76b 100644
--- a/doc/html/a00054.html
+++ b/doc/html/a00054.html
@@ -20,27 +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::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00166.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00166.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+<h1>tbb::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00182.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="a00182.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00182.html">tbb::queuing_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00182.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00182.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="a00182.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00182.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="a00182.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00182.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00182.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="a00182.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00182.html">tbb::queuing_mutex</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00049.html b/doc/html/a00055.html
similarity index 69%
copy from doc/html/a00049.html
copy to doc/html/a00055.html
index 4efe5c2..b18bf24 100644
--- a/doc/html/a00049.html
+++ b/doc/html/a00055.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::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00161.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00183.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00183.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00056.html b/doc/html/a00056.html
index 52087f3..6ba9fb1 100644
--- a/doc/html/a00056.html
+++ b/doc/html/a00056.html
@@ -20,13 +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::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00167.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="a00167.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00167.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00167.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00167.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="a00167.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00167.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+<h1>tbb::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00184.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="a00184.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00184.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="a00184.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00184.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="a00184.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00184.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="a00184.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00184.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00184.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="a00184.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00184.html">tbb::queuing_rw_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00184.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00051.html b/doc/html/a00057.html
similarity index 66%
copy from doc/html/a00051.html
copy to doc/html/a00057.html
index 21bdab1..707ca91 100644
--- a/doc/html/a00051.html
+++ b/doc/html/a00057.html
@@ -20,18 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00163.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00163.html">tbb::queuing_rw_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="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00058.html b/doc/html/a00058.html
index 79fd16a..23cbb1a 100644
--- a/doc/html/a00058.html
+++ b/doc/html/a00058.html
@@ -20,19 +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::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00169.html">tbb::spin_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="a00186.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="a00186.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00186.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="a00186.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00186.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="a00186.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00186.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00059.html b/doc/html/a00059.html
index d45a002..6e36491 100644
--- a/doc/html/a00059.html
+++ b/doc/html/a00059.html
@@ -20,17 +20,15 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00170.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00170.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="a00170.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00170.html">tbb::spin_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="a00187.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="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00187.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="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00187.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="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00187.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00187.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00060.html b/doc/html/a00060.html
index 868d80e..3b8570d 100644
--- a/doc/html/a00060.html
+++ b/doc/html/a00060.html
@@ -20,20 +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::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00171.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="a00171.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00171.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="a00171.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00171.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="a00171.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</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="a00188.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="a00188.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00188.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="a00188.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00188.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="a00188.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00188.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="a00188.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00188.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="a00188.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00188.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00061.html b/doc/html/a00061.html
index 102ec80..31bb962 100644
--- a/doc/html/a00061.html
+++ b/doc/html/a00061.html
@@ -20,18 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00172.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::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="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.html">tbb::recursive_mutex</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00189.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00189.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00189.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="a00189.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00189.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00062.html b/doc/html/a00062.html
index 1fa1e3f..29d3140 100644
--- a/doc/html/a00062.html
+++ b/doc/html/a00062.html
@@ -20,27 +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::task_group_context Member List</h1>This is the complete list of members for <a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00175.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a>()</td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00175.html#49a55352084fd44b8863d182e839e6dc">init</a>()</td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00175.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a>() const </td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>no_cancellation</b> enum value (defined in <a class="el" href="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00175.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a>()</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00175.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a>()</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a>(kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>traits_type</b> enum name (defined in <a class="el" href="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.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="a00175.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00175.html">tbb::task_group_context</a></td><td></td></tr>
+<h1>tbb::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00190.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="a00190.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00190.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00190.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00190.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00054.html b/doc/html/a00063.html
similarity index 61%
copy from doc/html/a00054.html
copy to doc/html/a00063.html
index d21159d..9dc36fd 100644
--- a/doc/html/a00054.html
+++ b/doc/html/a00063.html
@@ -20,27 +20,27 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00166.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00166.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00166.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00166.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="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.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="a00191.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00064.html b/doc/html/a00064.html
deleted file mode 100644
index a509fd2..0000000
--- a/doc/html/a00064.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>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">allocate_additional_child_of</a>(task &t)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#a57def00c8e9d932dbea0b3ee23991b9">destroy</a>(task &victim)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::task_group_base</b> (defined in <a class="el" href="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#f7737143d458f1ed1c0d7da3971d9e6b">spawn</a>(task &child)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">spawn</a>(task_list &list)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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
index 41ab68c..7ac1702 100644
--- a/doc/html/a00065.html
+++ b/doc/html/a00065.html
@@ -20,62 +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::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00142.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">allocate_additional_child_of</a>(task &t)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#a57def00c8e9d932dbea0b3ee23991b9">destroy</a>(task &victim)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::task_group_base</b> (defined in <a class="el" href="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00174.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="a00174.html">tbb::task</a>)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#f7737143d458f1ed1c0d7da3971d9e6b">spawn</a>(task &child)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">spawn</a>(task_list &list)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00174.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00174.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00174.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00192.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="a00192.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00192.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00192.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00192.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="a00192.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00192.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00066.html b/doc/html/a00066.html
deleted file mode 100644
index dd062eb..0000000
--- a/doc/html/a00066.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::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00176.html">tbb::task_list</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00176.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00176.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00176.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00176.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00176.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00176.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00176.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00176.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="a00176.html">tbb::task_list</a>)</td><td><a class="el" href="a00176.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00176.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00176.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00176.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00176.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00067.html
similarity index 63%
copy from doc/html/a00058.html
copy to doc/html/a00067.html
index 79fd16a..d0f95f3 100644
--- a/doc/html/a00058.html
+++ b/doc/html/a00067.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::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00169.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="a00169.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00169.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00169.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00169.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="a00194.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="a00194.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00194.html">tbb::spin_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00194.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00194.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="a00194.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00194.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="a00194.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00194.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00194.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="a00194.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00194.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00194.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00194.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00194.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00194.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00059.html b/doc/html/a00068.html
similarity index 68%
copy from doc/html/a00059.html
copy to doc/html/a00068.html
index d45a002..ae5a08e 100644
--- a/doc/html/a00059.html
+++ b/doc/html/a00068.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_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00170.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00170.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="a00170.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00170.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="a00195.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00195.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00195.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00195.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="a00195.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00195.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00060.html b/doc/html/a00069.html
similarity index 62%
copy from doc/html/a00060.html
copy to doc/html/a00069.html
index 868d80e..bf73f96 100644
--- a/doc/html/a00060.html
+++ b/doc/html/a00069.html
@@ -20,20 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00171.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="a00171.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00171.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="a00171.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00171.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="a00171.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00171.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00171.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="a00196.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="a00196.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00196.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="a00196.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00196.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="a00196.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00196.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00061.html b/doc/html/a00070.html
similarity index 67%
copy from doc/html/a00061.html
copy to doc/html/a00070.html
index 102ec80..c7bc843 100644
--- a/doc/html/a00061.html
+++ b/doc/html/a00070.html
@@ -20,18 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00172.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00172.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="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00197.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00085.html b/doc/html/a00072.html
similarity index 75%
copy from doc/html/a00085.html
copy to doc/html/a00072.html
index 62f6b45..aaaa32b 100644
--- a/doc/html/a00085.html
+++ b/doc/html/a00072.html
@@ -20,11 +20,10 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00148.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="a00148.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00148.html">tbb::missing_wait</a></td><td></td></tr>
+<h1>tbb::interface5::internal::task_base Member List</h1>This is the complete list of members for <a class="el" href="a00200.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00073.html b/doc/html/a00073.html
index 62a2e4f..935c2af 100644
--- a/doc/html/a00073.html
+++ b/doc/html/a00073.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::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00177.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00177.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::task_group_context Member List</h1>This is the complete list of members for <a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a>()</td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00201.html#49a55352084fd44b8863d182e839e6dc">init</a>()</td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a>() const </td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a>()</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a>()</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a>(kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>traits_type</b> enum name (defined in <a class="el" href="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.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="a00201.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00201.html">tbb::task_group_context</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00075.html b/doc/html/a00075.html
index 31cdddd..6a8540a 100644
--- a/doc/html/a00075.html
+++ b/doc/html/a00075.html
@@ -20,31 +20,62 @@
<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="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>()</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#ef133522bf55f05a605bee0763208281">destroy</a>(pointer p)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.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="a00178.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00076.html b/doc/html/a00076.html
new file mode 100644
index 0000000..bc06f8f
--- /dev/null
+++ b/doc/html/a00076.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class Members</span></a></li>
+ </ul></div>
+<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00163.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00199.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="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00077.html b/doc/html/a00077.html
index fd3b02b..5175d70 100644
--- a/doc/html/a00077.html
+++ b/doc/html/a00077.html
@@ -20,13 +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::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00179.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="a00179.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00179.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00179.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00179.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="a00179.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00179.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+<h1>tbb::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00202.html">tbb::task_list</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00202.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00202.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="a00202.html">tbb::task_list</a>)</td><td><a class="el" href="a00202.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00202.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00202.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00202.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="a00202.html">tbb::task_list</a>)</td><td><a class="el" href="a00202.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00202.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00202.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00202.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00079.html b/doc/html/a00079.html
deleted file mode 100644
index 01fbaad..0000000
--- a/doc/html/a00079.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::zero_allocator< T, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.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="a00186.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00186.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00084.html b/doc/html/a00084.html
index d7d7024..5bbf2bb 100644
--- a/doc/html/a00084.html
+++ b/doc/html/a00084.html
@@ -20,11 +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::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00146.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="a00146.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00146.html">tbb::improper_lock</a></td><td></td></tr>
+<h1>tbb::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00203.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00203.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00086.html b/doc/html/a00086.html
index 39f67d9..a278cc4 100644
--- a/doc/html/a00086.html
+++ b/doc/html/a00086.html
@@ -20,11 +20,31 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00147.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="a00147.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00147.html">tbb::invalid_multiple_scheduling</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="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>()</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">destroy</a>(pointer p)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.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="a00204.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00087.html b/doc/html/a00087.html
deleted file mode 100644
index 08fc70c..0000000
--- a/doc/html/a00087.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00180.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00180.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00180.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00180.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00180.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00180.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00180.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00180.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00088.html b/doc/html/a00088.html
index b47e8d8..7667290 100644
--- a/doc/html/a00088.html
+++ b/doc/html/a00088.html
@@ -20,22 +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::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00180.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00205.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="a00205.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00205.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00205.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00205.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="a00205.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00205.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00090.html b/doc/html/a00090.html
index 6d4c5ac..54a3406 100644
--- a/doc/html/a00090.html
+++ b/doc/html/a00090.html
@@ -20,15 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00181.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="a00181.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00181.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="a00181.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00181.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00181.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00181.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00181.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00181.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00181.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00181.html">tbb::internal::tbb_exception_ptr</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="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.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="a00213.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00213.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00091.html b/doc/html/a00091.html
deleted file mode 100644
index 0403260..0000000
--- a/doc/html/a00091.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class List</span></a></li>
- <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
- <li><a href="functions.html"><span>Class Members</span></a></li>
- </ul></div>
-<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00124.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="a00124.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00124.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="a00124.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00124.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00124.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="a00124.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00124.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00081.html b/doc/html/a00092.html
similarity index 75%
rename from doc/html/a00081.html
rename to doc/html/a00092.html
index 86b34c1..bb94cb0 100644
--- a/doc/html/a00081.html
+++ b/doc/html/a00092.html
@@ -20,14 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::zero_allocator< void, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00187.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="a00187.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00187.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="a00187.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00187.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="a00187.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00187.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="a00187.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00187.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="a00214.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="a00214.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00214.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="a00214.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00214.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="a00214.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00214.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="a00214.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00214.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00083.html b/doc/html/a00094.html
similarity index 75%
rename from doc/html/a00083.html
rename to doc/html/a00094.html
index 14335e3..9467fd5 100644
--- a/doc/html/a00083.html
+++ b/doc/html/a00094.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::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00126.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="a00126.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00126.html">tbb::bad_last_alloc</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00126.html#af817b8268cabc44ecd9c9ef986f6192">~bad_last_alloc</a>()</td><td><a class="el" href="a00126.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="a00147.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="a00147.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00147.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="a00147.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00147.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00084.html b/doc/html/a00095.html
similarity index 85%
copy from doc/html/a00084.html
copy to doc/html/a00095.html
index d7d7024..e88dc70 100644
--- a/doc/html/a00084.html
+++ b/doc/html/a00095.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::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00146.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="a00146.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00146.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="a00168.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="a00168.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00168.html">tbb::improper_lock</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00085.html b/doc/html/a00096.html
similarity index 85%
rename from doc/html/a00085.html
rename to doc/html/a00096.html
index 62f6b45..897643b 100644
--- a/doc/html/a00085.html
+++ b/doc/html/a00096.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::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00148.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="a00148.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00148.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="a00170.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="a00170.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00170.html">tbb::missing_wait</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00086.html b/doc/html/a00097.html
similarity index 86%
copy from doc/html/a00086.html
copy to doc/html/a00097.html
index 39f67d9..421ef7b 100644
--- a/doc/html/a00086.html
+++ b/doc/html/a00097.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::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00147.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="a00147.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00147.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="a00169.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="a00169.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00169.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00098.html b/doc/html/a00098.html
index b72d4b4..fbf5186 100644
--- a/doc/html/a00098.html
+++ b/doc/html/a00098.html
@@ -20,11 +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::internal::work_around_alignment_bug< Size, T > Member List</h1>This is the complete list of members for <a class="el" href="a00185.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="a00185.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00185.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
+<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00206.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00088.html b/doc/html/a00099.html
similarity index 60%
copy from doc/html/a00088.html
copy to doc/html/a00099.html
index b47e8d8..b28297d 100644
--- a/doc/html/a00088.html
+++ b/doc/html/a00099.html
@@ -20,22 +20,22 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00180.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00132.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00132.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="a00132.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00132.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00153.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="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00206.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="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.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="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00153.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="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00089.html b/doc/html/a00100.html
similarity index 62%
rename from doc/html/a00089.html
rename to doc/html/a00100.html
index 8a0dfc2..2f0b123 100644
--- a/doc/html/a00089.html
+++ b/doc/html/a00100.html
@@ -20,23 +20,23 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00149.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="a00149.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00149.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="a00149.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00149.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="a00149.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00149.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="a00149.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00180.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="a00149.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00149.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="a00149.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00149.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="a00171.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="a00171.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00171.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="a00171.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00171.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="a00171.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00171.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="a00171.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00206.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="a00171.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00171.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="a00171.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00101.html b/doc/html/a00101.html
index f0cda6a..cdab383 100644
--- a/doc/html/a00101.html
+++ b/doc/html/a00101.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::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00183.html">tbb::tick_count</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00183.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00183.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00183.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00183.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00183.html">tbb::tick_count</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="a00207.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="a00207.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00207.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="a00207.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00207.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00207.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00207.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00207.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00102.html b/doc/html/a00102.html
index 0d4d791..5e570ae 100644
--- a/doc/html/a00102.html
+++ b/doc/html/a00102.html
@@ -20,19 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00184.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00184.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="a00184.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00145.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="a00145.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00145.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="a00145.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00145.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="a00145.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00098.html b/doc/html/a00109.html
similarity index 86%
copy from doc/html/a00098.html
copy to doc/html/a00109.html
index b72d4b4..529beb0 100644
--- a/doc/html/a00098.html
+++ b/doc/html/a00109.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::work_around_alignment_bug< Size, T > Member List</h1>This is the complete list of members for <a class="el" href="a00185.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="a00185.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00185.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="a00212.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="a00212.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00212.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00101.html b/doc/html/a00113.html
similarity index 77%
copy from doc/html/a00101.html
copy to doc/html/a00113.html
index f0cda6a..bf208c4 100644
--- a/doc/html/a00101.html
+++ b/doc/html/a00113.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::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00183.html">tbb::tick_count</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00183.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00183.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00183.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00183.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00183.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="a00210.html">tbb::tick_count</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00210.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00210.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00210.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00210.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00210.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00210.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00102.html b/doc/html/a00114.html
similarity index 66%
copy from doc/html/a00102.html
copy to doc/html/a00114.html
index 0d4d791..23751c8 100644
--- a/doc/html/a00102.html
+++ b/doc/html/a00114.html
@@ -20,19 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00184.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00184.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="a00184.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00184.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="a00211.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00211.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00211.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00211.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="a00211.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00120.html b/doc/html/a00120.html
deleted file mode 100644
index eb413ec..0000000
--- a/doc/html/a00120.html
+++ /dev/null
@@ -1,62 +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="a00237.html">tbb</a>::<a class="el" href="a00120.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="a00355.html">partitioner.h</a>></code>
-<p>
-<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>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="181db51277e9b15dd0ec4a0617ab1f92"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_reduce_with_affinity" ref="181db51277e9b15dd0ec4a0617ab1f92" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce_with_affinity</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="a00355.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00121.html b/doc/html/a00121.html
deleted file mode 100644
index cc2ab32..0000000
--- a/doc/html/a00121.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="a00237.html">tbb</a>::<a class="el" href="a00121.html">aligned_space</a></div>
-<h1>tbb::aligned_space< T, N > Class Template Reference<br>
-<small>
-[<a class="el" href="a00243.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="a00265.html">aligned_space.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 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="a00121.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="a00121.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="a00265.html">aligned_space.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00123.html b/doc/html/a00123.html
deleted file mode 100644
index cf9a83d..0000000
--- a/doc/html/a00123.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="a00237.html">tbb</a>::<a class="el" href="a00123.html">atomic< void * ></a></div>
-<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00123.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00266.html">atomic.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="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="a00122.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00122.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="a00123.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="a00266.html">atomic.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00124.html b/doc/html/a00124.html
deleted file mode 100644
index 316d74a..0000000
--- a/doc/html/a00124.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="a00237.html">tbb</a>::<b>internal</b>::<a class="el" href="a00124.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="a00394.html">tbb_machine.h</a>></code>
-<p>
-<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="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00124.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="a00394.html">tbb_machine.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00126.html b/doc/html/a00126.html
deleted file mode 100644
index bd623a0..0000000
--- a/doc/html/a00126.html
+++ /dev/null
@@ -1,72 +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="a00237.html">tbb</a>::<a class="el" href="a00126.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="a00393.html">tbb_exception.h</a>></code>
-<p>
-<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 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>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00126.html#af817b8268cabc44ecd9c9ef986f6192">~bad_last_alloc</a> () throw ()</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for concurrent containers.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="af817b8268cabc44ecd9c9ef986f6192"></a><!-- doxytag: member="tbb::bad_last_alloc::~bad_last_alloc" ref="af817b8268cabc44ecd9c9ef986f6192" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::bad_last_alloc::~bad_last_alloc </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Necessary to avoid ICL error: "exception specification for implicitly declared virtual is incompatible with that of overridden function".
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00393.html">tbb_exception.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00127.html b/doc/html/a00127.html
deleted file mode 100644
index 81c9ca1..0000000
--- a/doc/html/a00127.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="a00237.html">tbb</a>::<a class="el" href="a00127.html">blocked_range</a></div>
-<h1>tbb::blocked_range< Value > Class Template Reference<br>
-<small>
-[<a class="el" href="a00241.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="a00274.html">blocked_range.h</a>></code>
-<p>
-<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="a00127.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="a00127.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="a00127.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="a00127.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00127.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="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.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="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.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="a00127.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="a00127.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="a00127.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00127.html">blocked_range</a> &r, <a class="el" href="a00173.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="a00127.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00127.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="a00127.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="a00127.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00127.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="a00127.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00127.html">blocked_range</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00127.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="a00173.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="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00127.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="a00127.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="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00127.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="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00127.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="a00274.html">blocked_range.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00128.html b/doc/html/a00128.html
deleted file mode 100644
index dc68ab8..0000000
--- a/doc/html/a00128.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="a00237.html">tbb</a>::<a class="el" href="a00128.html">blocked_range2d</a></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00241.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="a00275.html">blocked_range2d.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 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="a00127.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00128.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="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00127.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="a00128.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="a00128.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="a00128.html">blocked_range2d</a> &r, <a class="el" href="a00173.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="a00127.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00128.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="a00127.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00128.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="a00275.html">blocked_range2d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00129.html b/doc/html/a00129.html
deleted file mode 100644
index 9af5159..0000000
--- a/doc/html/a00129.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="a00237.html">tbb</a>::<a class="el" href="a00129.html">blocked_range3d</a></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00241.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="a00276.html">blocked_range3d.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"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
-typedef <a class="el" href="a00127.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00129.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="a00127.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="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00127.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="a00129.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="a00129.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="a00129.html">blocked_range3d</a> &r, <a class="el" href="a00173.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="a00127.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00129.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="a00127.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00129.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="a00127.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00129.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="a00276.html">blocked_range3d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00130.html b/doc/html/a00130.html
deleted file mode 100644
index 1b85bc3..0000000
--- a/doc/html/a00130.html
+++ /dev/null
@@ -1,114 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00130.html">cache_aligned_allocator</a></div>
-<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00243.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="a00277.html">cache_aligned_allocator.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="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00130.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="a00130.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="a00130.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="a00130.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="a00130.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="a00130.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="a00130.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>
-
-</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.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00277.html">cache_aligned_allocator.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00132.html b/doc/html/a00132.html
deleted file mode 100644
index 75e80c8..0000000
--- a/doc/html/a00132.html
+++ /dev/null
@@ -1,157 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00132.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="a00393.html">tbb_exception.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::captured_exception:
-<p><center><img src="a00132.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
-<map name="tbb::captured_exception_map">
-<area href="a00180.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
-</map>
-<a href="a00088.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00132.html">captured_exception</a> &src)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ac89d457be837a19a3d505050f3a4e8"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="2ac89d457be837a19a3d505050f3a4e8" 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="a00132.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00132.html">captured_exception</a> &src)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00132.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00132.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="a00132.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00132.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="a00132.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="a00132.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="a00132.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="a00132.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>
-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="a00180.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="a00132.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="a00180.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="a00132.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="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::captured_exception::throw_self </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Throws this exception object.
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
-<p>
-Implements <a class="el" href="a00180.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="a00393.html">tbb_exception.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00133.html b/doc/html/a00133.html
deleted file mode 100644
index e89ce7b..0000000
--- a/doc/html/a00133.html
+++ /dev/null
@@ -1,84 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00133.html">combinable</a></div>
-<h1>tbb::combinable< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00242.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="a00279.html">combinable.h</a>></code>
-<p>
-<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public 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="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00133.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="a00133.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="a00133.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00133.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="fb0ebff0036225d81917591355c0e5b6"></a><!-- doxytag: member="tbb::combinable::combine" ref="fb0ebff0036225d81917591355c0e5b6" args="(FCombine fcombine)" -->
-template<typename FCombine> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (FCombine fcombine)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2b76467e3c6657878e681b916aa40f86"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="2b76467e3c6657878e681b916aa40f86" args="(FCombine fcombine)" -->
-template<typename FCombine> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (FCombine fcombine)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::combinable< T ></h3>
-
-Thread-local storage with optional reduction.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00279.html">combinable.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00134.html b/doc/html/a00134.html
deleted file mode 100644
index ff33e63..0000000
--- a/doc/html/a00134.html
+++ /dev/null
@@ -1,306 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00134.html">concurrent_bounded_queue</a></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00242.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="a00292.html">concurrent_queue.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
-<p><center><img src="a00134.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::concurrent_bounded_queue< T, A >_map">
-<area href="a00140.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
-</map>
-<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public 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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00134.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="a00134.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00134.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00134.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="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00134.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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.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="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00134.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="a00134.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00134.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="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00134.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="a00134.html#089f33dfd504e30a95f40ed2a5799367">set_capacity</a> (<a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> capacity)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity. <a href="#089f33dfd504e30a95f40ed2a5799367"></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="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00134.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="a00134.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>
-<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="a00134.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Integral type for representing size of the queue.
-<p>
-Notice 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="a00134.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="089f33dfd504e30a95f40ed2a5799367"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="089f33dfd504e30a95f40ed2a5799367" args="(size_type 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="a00134.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
- <td class="paramname"> <em>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="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00134.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="a00134.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="a00134.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="a00134.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="a00292.html">concurrent_queue.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00135.html b/doc/html/a00135.html
deleted file mode 100644
index 72cab35..0000000
--- a/doc/html/a00135.html
+++ /dev/null
@@ -1,646 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00135.html">concurrent_hash_map</a></div>
-<h1>tbb::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
-<small>
-[<a class="el" href="a00242.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_hash_map" -->Unordered map from Key to T.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00280.html">concurrent_hash_map.h</a>></code>
-<p>
-<a href="a00012.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a59325d5213bdbb32e66525364d9ca6e"></a><!-- doxytag: member="tbb::concurrent_hash_map::key_type" ref="a59325d5213bdbb32e66525364d9ca6e" 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="d30555ca958fcf4401d8c46e32b35832"></a><!-- doxytag: member="tbb::concurrent_hash_map::mapped_type" ref="d30555ca958fcf4401d8c46e32b35832" 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="ba7dfe412706706fc77eeb9ca106dd77"></a><!-- doxytag: member="tbb::concurrent_hash_map::value_type" ref="ba7dfe412706706fc77eeb9ca106dd77" 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="9536f0726d303e50e0bb89c6e252dcc9"></a><!-- doxytag: member="tbb::concurrent_hash_map::size_type" ref="9536f0726d303e50e0bb89c6e252dcc9" 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="156eff4cfda20255ab61594772322632"></a><!-- doxytag: member="tbb::concurrent_hash_map::difference_type" ref="156eff4cfda20255ab61594772322632" 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="9efc6155cc67220afe493d5ba86da474"></a><!-- doxytag: member="tbb::concurrent_hash_map::pointer" ref="9efc6155cc67220afe493d5ba86da474" 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="1de4baea4800c9422497160c2dc6ee88"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_pointer" ref="1de4baea4800c9422497160c2dc6ee88" 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="7f4e03ecea778f011ab7c3c0b61d2521"></a><!-- doxytag: member="tbb::concurrent_hash_map::reference" ref="7f4e03ecea778f011ab7c3c0b61d2521" 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="9fa6589f474a5b2f770ee12ab9965b35"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_reference" ref="9fa6589f474a5b2f770ee12ab9965b35" 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="e0a1323016e3475bf8a5ed8952f84b53"></a><!-- doxytag: member="tbb::concurrent_hash_map::iterator" ref="e0a1323016e3475bf8a5ed8952f84b53" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00135.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="2380701b85fb373abfe1c20d4044cc47"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_iterator" ref="2380701b85fb373abfe1c20d4044cc47" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00135.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="0f251ff63b9ee8ef88bac1452de92618"></a><!-- doxytag: member="tbb::concurrent_hash_map::range_type" ref="0f251ff63b9ee8ef88bac1452de92618" 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="e91c41ef86638719f1e4fb44cc936ed2"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_range_type" ref="e91c41ef86638719f1e4fb44cc936ed2" 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="dd223032ecd376e846b6724e168bdc56"></a><!-- doxytag: member="tbb::concurrent_hash_map::allocator_type" ref="dd223032ecd376e846b6724e168bdc56" 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="342582ba05d9fb893ed80875d2b7a42f"></a><!-- doxytag: member="tbb::concurrent_hash_map::concurrent_hash_map" ref="342582ba05d9fb893ed80875d2b7a42f" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#342582ba05d9fb893ed80875d2b7a42f">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="c1bf3c669935aceb1dc0169e3a19e0be"></a><!-- doxytag: member="tbb::concurrent_hash_map::concurrent_hash_map" ref="c1bf3c669935aceb1dc0169e3a19e0be" args="(size_type n, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#c1bf3c669935aceb1dc0169e3a19e0be">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="bc50f7bca65d0c27cbf5c31d2fa63eac"></a><!-- doxytag: member="tbb::concurrent_hash_map::concurrent_hash_map" ref="bc50f7bca65d0c27cbf5c31d2fa63eac" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#bc50f7bca65d0c27cbf5c31d2fa63eac">concurrent_hash_map</a> (const <a class="el" href="a00135.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="b5132202dff9ee3d619bef6b1d84edea"></a><!-- doxytag: member="tbb::concurrent_hash_map::concurrent_hash_map" ref="b5132202dff9ee3d619bef6b1d84edea" 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="a00135.html#b5132202dff9ee3d619bef6b1d84edea">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="adadeb9d1acb8c3b34517435666cf297"></a><!-- doxytag: member="tbb::concurrent_hash_map::operator=" ref="adadeb9d1acb8c3b34517435666cf297" args="(const concurrent_hash_map &table)" -->
-<a class="el" href="a00135.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#adadeb9d1acb8c3b34517435666cf297">operator=</a> (const <a class="el" href="a00135.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="a00135.html#9ba53dc3a98d81331ded7c6c2b17f58f">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="#9ba53dc3a98d81331ded7c6c2b17f58f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36bcd50fd5383f3682032323b2d74333"></a><!-- doxytag: member="tbb::concurrent_hash_map::clear" ref="36bcd50fd5383f3682032323b2d74333" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#36bcd50fd5383f3682032323b2d74333">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="5e96649f71f68f3b6bf3b1eee6b441a7"></a><!-- doxytag: member="tbb::concurrent_hash_map::~concurrent_hash_map" ref="5e96649f71f68f3b6bf3b1eee6b441a7" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#5e96649f71f68f3b6bf3b1eee6b441a7">~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="e0f51b807e124c2bee274c5f86a2a817"></a><!-- doxytag: member="tbb::concurrent_hash_map::range" ref="e0f51b807e124c2bee274c5f86a2a817" 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="78989fb98b211ab5f8437798d490e004"></a><!-- doxytag: member="tbb::concurrent_hash_map::range" ref="78989fb98b211ab5f8437798d490e004" 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="dfb7ab010b46fc194673256479c2ea48"></a><!-- doxytag: member="tbb::concurrent_hash_map::begin" ref="dfb7ab010b46fc194673256479c2ea48" 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="7e2dd7c8b3d37a93ba551e4de33bb73d"></a><!-- doxytag: member="tbb::concurrent_hash_map::end" ref="7e2dd7c8b3d37a93ba551e4de33bb73d" 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="be53487f364b5744187af9f7627c3190"></a><!-- doxytag: member="tbb::concurrent_hash_map::begin" ref="be53487f364b5744187af9f7627c3190" 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="6b947898d1a60b680d8c4f915442e1a8"></a><!-- doxytag: member="tbb::concurrent_hash_map::end" ref="6b947898d1a60b680d8c4f915442e1a8" 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="3b6f066f9b1e51eaefa67c37928a6d5f"></a><!-- doxytag: member="tbb::concurrent_hash_map::equal_range" ref="3b6f066f9b1e51eaefa67c37928a6d5f" 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="9d1d5f33f2babb6780794c9ed6193174"></a><!-- doxytag: member="tbb::concurrent_hash_map::equal_range" ref="9d1d5f33f2babb6780794c9ed6193174" 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="25b0e3881038877604c5efc1c14c4afd"></a><!-- doxytag: member="tbb::concurrent_hash_map::size" ref="25b0e3881038877604c5efc1c14c4afd" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#25b0e3881038877604c5efc1c14c4afd">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="3e5d085375320cd3f34faeedc5bba8f6"></a><!-- doxytag: member="tbb::concurrent_hash_map::empty" ref="3e5d085375320cd3f34faeedc5bba8f6" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#3e5d085375320cd3f34faeedc5bba8f6">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00135.html#25b0e3881038877604c5efc1c14c4afd">size()</a>==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ed260e217fb310050928d7bd03f1b5e"></a><!-- doxytag: member="tbb::concurrent_hash_map::max_size" ref="6ed260e217fb310050928d7bd03f1b5e" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#6ed260e217fb310050928d7bd03f1b5e">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="d1c1e23f2a3ba1f943d00d95388d718f"></a><!-- doxytag: member="tbb::concurrent_hash_map::bucket_count" ref="d1c1e23f2a3ba1f943d00d95388d718f" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#d1c1e23f2a3ba1f943d00d95388d718f">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="79d1e5c3b975dbd38b43138266fe4c0e"></a><!-- doxytag: member="tbb::concurrent_hash_map::get_allocator" ref="79d1e5c3b975dbd38b43138266fe4c0e" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#79d1e5c3b975dbd38b43138266fe4c0e">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="dd73f70aa6602021ea2c56bac9715353"></a><!-- doxytag: member="tbb::concurrent_hash_map::swap" ref="dd73f70aa6602021ea2c56bac9715353" args="(concurrent_hash_map &table)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#dd73f70aa6602021ea2c56bac9715353">swap</a> (<a class="el" href="a00135.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="a3e97a1f3cb66e81a2336b013ef1ae7d"></a><!-- doxytag: member="tbb::concurrent_hash_map::count" ref="a3e97a1f3cb66e81a2336b013ef1ae7d" args="(const Key &key) const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#a3e97a1f3cb66e81a2336b013ef1ae7d">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="a00135.html#9fa1ca60af4ef761a100617b27718585">find</a> (<a class="el" href="a00138.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="#9fa1ca60af4ef761a100617b27718585"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#4f7cc0aab2d8216c0a6e681f32dd48c8">find</a> (<a class="el" href="a00136.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="#4f7cc0aab2d8216c0a6e681f32dd48c8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#67d8c254b1666d89267c8a4a33c864f3">insert</a> (<a class="el" href="a00138.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="#67d8c254b1666d89267c8a4a33c864f3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#8ea81ff7fea044f859273b354c91c185">insert</a> (<a class="el" href="a00136.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="#8ea81ff7fea044f859273b354c91c185"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#68a46a26bd4308c1780d021ca7e8fc15">insert</a> (<a class="el" href="a00138.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="#68a46a26bd4308c1780d021ca7e8fc15"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#7bd4dcf6ea74a32299fd57d8d7fc7ed8">insert</a> (<a class="el" href="a00136.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="#7bd4dcf6ea74a32299fd57d8d7fc7ed8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#3034a308bc839695a5714a107380c4b9">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="#3034a308bc839695a5714a107380c4b9"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7b42dba04d71e1367f0d542087906178"></a><!-- doxytag: member="tbb::concurrent_hash_map::insert" ref="7b42dba04d71e1367f0d542087906178" 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="a00135.html#7b42dba04d71e1367f0d542087906178">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="a00135.html#58df7a1e4373c55eb4c2fa9dc69516b1">erase</a> (const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item. <a href="#58df7a1e4373c55eb4c2fa9dc69516b1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#fc64086f9f518cef8c368c9429d0064e">erase</a> (<a class="el" href="a00138.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00138.html">const_accessor</a>. <a href="#fc64086f9f518cef8c368c9429d0064e"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#b65abfa291da566617dd58dfb349630a">erase</a> (<a class="el" href="a00136.html">accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor. <a href="#b65abfa291da566617dd58dfb349630a"></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="4a66e22918752bb0d7c22333bec7e0d6"></a><!-- doxytag: member="tbb::concurrent_hash_map::node_allocator_type" ref="4a66e22918752bb0d7c22333bec7e0d6" 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="572fec6cb2b0d70b8a3a12c5be4df6d4"></a><!-- doxytag: member="tbb::concurrent_hash_map::delete_node" ref="572fec6cb2b0d70b8a3a12c5be4df6d4" 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="058f1d5e2075d11c9b2ac00f1f0ae60e"></a><!-- doxytag: member="tbb::concurrent_hash_map::search_bucket" ref="058f1d5e2075d11c9b2ac00f1f0ae60e" 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="f2fe44bde2158a2f2a315c6457ebd030"></a><!-- doxytag: member="tbb::concurrent_hash_map::rehash_bucket" ref="f2fe44bde2158a2f2a315c6457ebd030" 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="0f0ba43d9cb783f12dd01bf5677da097"></a><!-- doxytag: member="tbb::concurrent_hash_map::lookup" ref="0f0ba43d9cb783f12dd01bf5677da097" 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="a00135.html#0f0ba43d9cb783f12dd01bf5677da097">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00138.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="671965989ffb5f6084c776cb0bb6cdab"></a><!-- doxytag: member="tbb::concurrent_hash_map::exclude" ref="671965989ffb5f6084c776cb0bb6cdab" args="(const_accessor &item_accessor, bool readonly)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#671965989ffb5f6084c776cb0bb6cdab">exclude</a> (<a class="el" href="a00138.html">const_accessor</a> &item_accessor, bool readonly)</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="308ec5ad19fdd1be4d345f8013070150"></a><!-- doxytag: member="tbb::concurrent_hash_map::internal_equal_range" ref="308ec5ad19fdd1be4d345f8013070150" 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="a00135.html#308ec5ad19fdd1be4d345f8013070150">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="7973cd92f57dcb092ab757f8d9e089f9"></a><!-- doxytag: member="tbb::concurrent_hash_map::internal_copy" ref="7973cd92f57dcb092ab757f8d9e089f9" args="(const concurrent_hash_map &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html#7973cd92f57dcb092ab757f8d9e089f9">internal_copy</a> (const <a class="el" href="a00135.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="35372431aedfcc88b890d895933cebc2"></a><!-- doxytag: member="tbb::concurrent_hash_map::internal_copy" ref="35372431aedfcc88b890d895933cebc2" 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="a00135.html#f0cdf5930563a49ffe827c520e948e01">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="#f0cdf5930563a49ffe827c520e948e01"></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="964dbe9bfcb2ac0157f8b77f252f951b"></a><!-- doxytag: member="tbb::concurrent_hash_map::my_allocator" ref="964dbe9bfcb2ac0157f8b77f252f951b" 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="1d13c1f34b3826f9235b82ea90818169"></a><!-- doxytag: member="tbb::concurrent_hash_map::my_hash_compare" ref="1d13c1f34b3826f9235b82ea90818169" 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::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::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::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"><a class="el" href="a00136.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="a00136.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00137.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="a00137.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html">const_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00138.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>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
-
-Unordered map from Key to T.
-<p>
-<a class="el" href="a00135.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="a00135.html#67d8c254b1666d89267c8a4a33c864f3">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="a00135.html#adadeb9d1acb8c3b34517435666cf297">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="a00135.html#67d8c254b1666d89267c8a4a33c864f3">insert()</a> methods</li><li>Added <a class="el" href="a00135.html#79d1e5c3b975dbd38b43138266fe4c0e">get_allocator()</a></li><li>Added <a class="el" href="a00135.html#dd73f70aa6602021ea2c56bac9715353">swap()</a></li [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="b65abfa291da566617dd58dfb349630a"></a><!-- doxytag: member="tbb::concurrent_hash_map::erase" ref="b65abfa291da566617dd58dfb349630a" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00136.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="fc64086f9f518cef8c368c9429d0064e"></a><!-- doxytag: member="tbb::concurrent_hash_map::erase" ref="fc64086f9f518cef8c368c9429d0064e" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00138.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="a00138.html">const_accessor</a>.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="58df7a1e4373c55eb4c2fa9dc69516b1"></a><!-- doxytag: member="tbb::concurrent_hash_map::erase" ref="58df7a1e4373c55eb4c2fa9dc69516b1" 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="a00135.html">tbb::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="4f7cc0aab2d8216c0a6e681f32dd48c8"></a><!-- doxytag: member="tbb::concurrent_hash_map::find" ref="4f7cc0aab2d8216c0a6e681f32dd48c8" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00136.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="9fa1ca60af4ef761a100617b27718585"></a><!-- doxytag: member="tbb::concurrent_hash_map::find" ref="9fa1ca60af4ef761a100617b27718585" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00138.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="3034a308bc839695a5714a107380c4b9"></a><!-- doxytag: member="tbb::concurrent_hash_map::insert" ref="3034a308bc839695a5714a107380c4b9" 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="a00135.html">tbb::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="7bd4dcf6ea74a32299fd57d8d7fc7ed8"></a><!-- doxytag: member="tbb::concurrent_hash_map::insert" ref="7bd4dcf6ea74a32299fd57d8d7fc7ed8" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00136.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="68a46a26bd4308c1780d021ca7e8fc15"></a><!-- doxytag: member="tbb::concurrent_hash_map::insert" ref="68a46a26bd4308c1780d021ca7e8fc15" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00138.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="8ea81ff7fea044f859273b354c91c185"></a><!-- doxytag: member="tbb::concurrent_hash_map::insert" ref="8ea81ff7fea044f859273b354c91c185" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00136.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="67d8c254b1666d89267c8a4a33c864f3"></a><!-- doxytag: member="tbb::concurrent_hash_map::insert" ref="67d8c254b1666d89267c8a4a33c864f3" 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="a00135.html">tbb::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00138.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="f0cdf5930563a49ffe827c520e948e01"></a><!-- doxytag: member="tbb::concurrent_hash_map::internal_fast_find" ref="f0cdf5930563a49ffe827c520e948e01" 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="a00135.html">tbb::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="9ba53dc3a98d81331ded7c6c2b17f58f"></a><!-- doxytag: member="tbb::concurrent_hash_map::rehash" ref="9ba53dc3a98d81331ded7c6c2b17f58f" 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="a00135.html">tbb::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="a00135.html#9fa1ca60af4ef761a100617b27718585">find()</a> and <a class="el" href="a00135.html#a3e97a1f3cb66e81a2336b013ef1ae7d">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="a00280.html">concurrent_hash_map.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00136.html b/doc/html/a00136.html
deleted file mode 100644
index 1da6494..0000000
--- a/doc/html/a00136.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>tbb::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00135.html">concurrent_hash_map</a>::<a class="el" href="a00136.html">accessor</a></div>
-<h1>tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::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="a00280.html">concurrent_hash_map.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
-<p><center><img src="a00136.png" usemap="#tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
-<map name="tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
-<area href="a00138.html" alt="tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,467,24">
-</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="34035ddb9e2a27f2f0a1f6a2a16730cf"></a><!-- doxytag: member="tbb::concurrent_hash_map::accessor::value_type" ref="34035ddb9e2a27f2f0a1f6a2a16730cf" args="" -->
-typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00136.html#34035ddb9e2a27f2f0a1f6a2a16730cf">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="03a091f7355a3c0c03f839893695f372"></a><!-- doxytag: member="tbb::concurrent_hash_map::accessor::operator *" ref="03a091f7355a3c0c03f839893695f372" args="() const " -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00136.html#03a091f7355a3c0c03f839893695f372">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="302f02e5deec0a67b872e9cfb08d9e60"></a><!-- doxytag: member="tbb::concurrent_hash_map::accessor::operator->" ref="302f02e5deec0a67b872e9cfb08d9e60" args="() const " -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00136.html#302f02e5deec0a67b872e9cfb08d9e60">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 Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
-
-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="a00280.html">concurrent_hash_map.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00136.png b/doc/html/a00136.png
deleted file mode 100644
index 1faefb1..0000000
Binary files a/doc/html/a00136.png and /dev/null differ
diff --git a/doc/html/a00137.html b/doc/html/a00137.html
deleted file mode 100644
index c7b7f91..0000000
--- a/doc/html/a00137.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>tbb::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00135.html">concurrent_hash_map</a>::<a class="el" href="a00137.html">bucket_accessor</a></div>
-<h1>tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::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="a00280.html">concurrent_hash_map.h</a>></code>
-<p>
-<a href="a00014.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="53584e6b0cf6cda95f31fcbfabb311fe"></a><!-- doxytag: member="tbb::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="53584e6b0cf6cda95f31fcbfabb311fe" 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="a00135.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b75959ce5a971b05cfefcbc1d09a022"></a><!-- doxytag: member="tbb::concurrent_hash_map::bucket_accessor::acquire" ref="7b75959ce5a971b05cfefcbc1d09a022" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00137.html#7b75959ce5a971b05cfefcbc1d09a022">acquire</a> (<a class="el" href="a00135.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</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="adf8e405df5787351fe816c42042b9ec"></a><!-- doxytag: member="tbb::concurrent_hash_map::bucket_accessor::is_writer" ref="adf8e405df5787351fe816c42042b9ec" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00137.html#adf8e405df5787351fe816c42042b9ec">is_writer</a> ()</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="7e98ad1b46ed35fb4a92d65c16c6982d"></a><!-- doxytag: member="tbb::concurrent_hash_map::bucket_accessor::operator()" ref="7e98ad1b46ed35fb4a92d65c16c6982d" args="()" -->
-bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00137.html#7e98ad1b46ed35fb4a92d65c16c6982d">operator()</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32b2b1c83ca85859bc5276022821152d"></a><!-- doxytag: member="tbb::concurrent_hash_map::bucket_accessor::upgrade_to_writer" ref="32b2b1c83ca85859bc5276022821152d" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</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::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
-
-bucket accessor is to find, rehash, acquire a lock, and access a bucket
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00280.html">concurrent_hash_map.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00138.html b/doc/html/a00138.html
deleted file mode 100644
index 5b37e1c..0000000
--- a/doc/html/a00138.html
+++ /dev/null
@@ -1,91 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00135.html">concurrent_hash_map</a>::<a class="el" href="a00138.html">const_accessor</a></div>
-<h1>tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00280.html">concurrent_hash_map.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
-<p><center><img src="a00138.png" usemap="#tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
-<map name="tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
-<area href="a00136.html" alt="tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,467,80">
-</map>
-<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b5de4197079009b1cfd8bdeb594c6428"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::value_type" ref="b5de4197079009b1cfd8bdeb594c6428" args="" -->
-typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#b5de4197079009b1cfd8bdeb594c6428">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="e55c7c3f0acd7fd823a07957e71a7462"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::empty" ref="e55c7c3f0acd7fd823a07957e71a7462" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#e55c7c3f0acd7fd823a07957e71a7462">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="09575d1a2dfeb8cd896c27cdd3770517"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::release" ref="09575d1a2dfeb8cd896c27cdd3770517" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">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="d95b7a39a08b7ab256dfff2ca37cdb75"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::operator *" ref="d95b7a39a08b7ab256dfff2ca37cdb75" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#d95b7a39a08b7ab256dfff2ca37cdb75">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="6fc0491f6420ffe38c48786e7b9ab042"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::operator->" ref="6fc0491f6420ffe38c48786e7b9ab042" args="() const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#6fc0491f6420ffe38c48786e7b9ab042">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="6eedb35a3ca397dd289ed5ca6fb4d95d"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::const_accessor" ref="6eedb35a3ca397dd289ed5ca6fb4d95d" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#6eedb35a3ca397dd289ed5ca6fb4d95d">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="e002771760f510e06c03e0a198286172"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::~const_accessor" ref="e002771760f510e06c03e0a198286172" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00138.html#e002771760f510e06c03e0a198286172">~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>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::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 Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
-
-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="a00280.html">concurrent_hash_map.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00138.png b/doc/html/a00138.png
deleted file mode 100644
index 2282f69..0000000
Binary files a/doc/html/a00138.png and /dev/null differ
diff --git a/doc/html/a00139.html b/doc/html/a00139.html
deleted file mode 100644
index 9c0b372..0000000
--- a/doc/html/a00139.html
+++ /dev/null
@@ -1,169 +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::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>
-<!-- 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="a00237.html">tbb</a>::<a class="el" href="a00240.html">strict_ppl</a>::<a class="el" href="a00139.html">concurrent_queue</a></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00242.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="a00292.html">concurrent_queue.h</a>></code>
-<p>
-<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="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="a00139.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="a00139.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="a00139.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="a00139.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="a00139.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="a00139.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="a00139.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="a00139.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="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="a00139.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00139.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="a00139.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00139.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="a00139.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00139.html">concurrent_queue</a> &src, const <a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00139.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="a00139.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="a00139.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="a00139.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="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00139.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="a00139.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="a00139.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="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00139.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>
-
-</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>
-
-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="a00139.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="a00292.html">concurrent_queue.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00140.html b/doc/html/a00140.html
deleted file mode 100644
index b9f5643..0000000
--- a/doc/html/a00140.html
+++ /dev/null
@@ -1,154 +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::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>
-<!-- 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="a00237.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00140.html">concurrent_queue</a></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00242.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="a00292.html">concurrent_queue.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
-<p><center><img src="a00140.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::deprecated::concurrent_queue< T, A >_map">
-<area href="a00134.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
-</map>
-<a href="a00020.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="a00134.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="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
-typedef <a class="el" href="a00134.html">concurrent_bounded_queue</a><<br>
- T, A >::const_iterator </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="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="a00140.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=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="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="a00140.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00140.html">concurrent_queue</a> &src, const A &a=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="383187b910f8c3ca27a39c1638566f15"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="383187b910f8c3ca27a39c1638566f15" args="(InputIterator begin, InputIterator end, 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="a00140.html#383187b910f8c3ca27a39c1638566f15">concurrent_queue</a> (InputIterator begin, InputIterator end, 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="a00140.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="a00140.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</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="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 T, class A = cache_aligned_allocator<T>><br>
- class tbb::deprecated::concurrent_queue< 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.
-<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="a00140.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="a00134.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="a00140.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="a00292.html">concurrent_queue.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00141.html b/doc/html/a00141.html
index ef947bc..169a65e 100644
--- a/doc/html/a00141.html
+++ b/doc/html/a00141.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::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,573 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00141.html">concurrent_vector</a></div>
-<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00242.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00141.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="a00293.html">concurrent_vector.h</a>></code>
+<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
<p>
-<a href="a00021.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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>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="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
-typedef internal::allocator_base<<br>
- T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00141.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="a00141.html">concurrent_vector</a>, const <br>
-T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
-typedef std::reverse_iterator<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
-typedef std::reverse_iterator<<br>
- iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator, T, const <br>
-T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
-typedef generic_range_type<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
-typedef generic_range_type<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00141.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="a00141.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00141.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="a00141.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00141.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="a00141.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="a00141.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="a00141.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="a00141.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00141.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="a00141.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00141.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00141.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="a00141.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="a00141.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</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="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="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 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 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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="181db51277e9b15dd0ec4a0617ab1f92"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_reduce_with_affinity" ref="181db51277e9b15dd0ec4a0617ab1f92" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce_with_affinity</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"><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">class </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</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>
-<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="a00141.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="a00141.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="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00141.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00141.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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="a00141.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">
-
-<p>
-Allocate enough space to grow to size n without having to allocate more memory later.
+An affinity partitioner.
<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="a00293.html">concurrent_vector.h</a></ul>
+<li><a class="el" href="a00404.html">partitioner.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00142.html b/doc/html/a00142.html
index ee63611..b7c81a3 100644
--- a/doc/html/a00142.html
+++ b/doc/html/a00142.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::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,31 +21,40 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00142.html">empty_task</a></div>
-<h1>tbb::empty_task Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00142.html">aligned_space</a></div>
+<h1>tbb::aligned_space< T, N > Class Template Reference<br>
<small>
-[<a class="el" href="a00246.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="a00276.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="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00310.html">aligned_space.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::empty_task:
-<p><center><img src="a00142.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
-<map name="tbb::empty_task_map">
-<area href="a00174.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
-</map>
-<a href="a00065.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 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="a00142.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="a00142.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>
-task that does nothing. Useful for synchronization.
+<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="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00310.html">aligned_space.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00143.html b/doc/html/a00143.html
index 8c242fe..b40de9e 100644
--- a/doc/html/a00143.html
+++ b/doc/html/a00143.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::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template 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,165 +21,38 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00143.html">enumerable_thread_specific</a></div>
-<h1>tbb::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</h1><!-- doxytag: class="tbb::enumerable_thread_specific" -->The thread local class template.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00143.html">atomic</a></div>
+<h1>tbb::atomic< T > Struct Template Reference<br>
+<small>
+[<a class="el" href="a00277.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="a00305.html">enumerable_thread_specific.h</a>></code>
+<code>#include <<a class="el" href="a00311.html">atomic.h</a>></code>
<p>
-<a href="a00026.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 Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="60047d25605a1ef993c49234e9ac5c2d"></a><!-- doxytag: member="tbb::enumerable_thread_specific::allocator_type" ref="60047d25605a1ef993c49234e9ac5c2d" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#60047d25605a1ef993c49234e9ac5c2d">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14b5967a627853440608619a07c9281a"></a><!-- doxytag: member="tbb::enumerable_thread_specific::value_type" ref="14b5967a627853440608619a07c9281a" 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="06ff8c90338e3f76201e56ac2e8bd566"></a><!-- doxytag: member="tbb::enumerable_thread_specific::reference" ref="06ff8c90338e3f76201e56ac2e8bd566" 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="cc538a9b0919cba06e9807984a840710"></a><!-- doxytag: member="tbb::enumerable_thread_specific::const_reference" ref="cc538a9b0919cba06e9807984a840710" 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="de58e04a639ecadf5e021b27c430cd32"></a><!-- doxytag: member="tbb::enumerable_thread_specific::pointer" ref="de58e04a639ecadf5e021b27c430cd32" 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="3ee05b7e9b137913fc2f946d7edb6325"></a><!-- doxytag: member="tbb::enumerable_thread_specific::const_pointer" ref="3ee05b7e9b137913fc2f946d7edb6325" 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="f7104b09f6dc1f8035ea978f56f9a090"></a><!-- doxytag: member="tbb::enumerable_thread_specific::size_type" ref="f7104b09f6dc1f8035ea978f56f9a090" 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="631ed3389c35ba4b90b7d1be0e291d86"></a><!-- doxytag: member="tbb::enumerable_thread_specific::difference_type" ref="631ed3389c35ba4b90b7d1be0e291d86" 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="006bd5182f81d6d01cbb558c0b500a29"></a><!-- doxytag: member="tbb::enumerable_thread_specific::iterator" ref="006bd5182f81d6d01cbb558c0b500a29" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00141.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="a59d5bae106a5e631fe164be9a261b72"></a><!-- doxytag: member="tbb::enumerable_thread_specific::const_iterator" ref="a59d5bae106a5e631fe164be9a261b72" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00141.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="8d695d7c22817587116f27089cd190d8"></a><!-- doxytag: member="tbb::enumerable_thread_specific::range_type" ref="8d695d7c22817587116f27089cd190d8" 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="73dc6b3dd06c14942c641a5ae924e355"></a><!-- doxytag: member="tbb::enumerable_thread_specific::const_range_type" ref="73dc6b3dd06c14942c641a5ae924e355" args="" -->
-typedef generic_range_type<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="632e351d5269ac609b08dba19282f3a3"></a><!-- doxytag: member="tbb::enumerable_thread_specific::enumerable_thread_specific" ref="632e351d5269ac609b08dba19282f3a3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor, which leads to default construction of local copies. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="e5698930b84c098bb6d87175b8b50306"></a><!-- doxytag: member="tbb::enumerable_thread_specific::enumerable_thread_specific" ref="e5698930b84c098bb6d87175b8b50306" 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="a00143.html#e5698930b84c098bb6d87175b8b50306">enumerable_thread_specific</a> (Finit _finit)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">construction with initializer method <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0466c43272d8458185e980fc2dc4abe2"></a><!-- doxytag: member="tbb::enumerable_thread_specific::enumerable_thread_specific" ref="0466c43272d8458185e980fc2dc4abe2" args="(const T &_exemplar)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#0466c43272d8458185e980fc2dc4abe2">enumerable_thread_specific</a> (const T &_exemplar)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuction with exemplar, which leads to copy construction of local copies. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41176526161d6fef1bdd19c2db7ded4d"></a><!-- doxytag: member="tbb::enumerable_thread_specific::~enumerable_thread_specific" ref="41176526161d6fef1bdd19c2db7ded4d" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#41176526161d6fef1bdd19c2db7ded4d">~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="ceb691814a0001241c43595d309cf615"></a><!-- doxytag: member="tbb::enumerable_thread_specific::local" ref="ceb691814a0001241c43595d309cf615" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9505351eace34ed7130257adcae91706"></a><!-- doxytag: member="tbb::enumerable_thread_specific::local" ref="9505351eace34ed7130257adcae91706" args="(bool &exists)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#9505351eace34ed7130257adcae91706">local</a> (bool &exists)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="302a4d6f55f852d5b7a6679e0e00316e"></a><!-- doxytag: member="tbb::enumerable_thread_specific::size" ref="302a4d6f55f852d5b7a6679e0e00316e" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#302a4d6f55f852d5b7a6679e0e00316e">size</a> () const </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="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="ad23345a722622199deaa4dfd243d9f8"></a><!-- doxytag: member="tbb::enumerable_thread_specific::empty" ref="ad23345a722622199deaa4dfd243d9f8" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#ad23345a722622199deaa4dfd243d9f8">empty</a> () const </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="a00143.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00143.html">atomic</a>< T > &rhs)</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="225f945c810397c6a54d5b8317dc5843"></a><!-- doxytag: member="tbb::enumerable_thread_specific::begin" ref="225f945c810397c6a54d5b8317dc5843" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="44c0b67ebb56b2ae1fa260d9e2bd1e99"></a><!-- doxytag: member="tbb::enumerable_thread_specific::end" ref="44c0b67ebb56b2ae1fa260d9e2bd1e99" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">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="ba6674c6102a6faf8f96d131497654b3"></a><!-- doxytag: member="tbb::enumerable_thread_specific::begin" ref="ba6674c6102a6faf8f96d131497654b3" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#ba6674c6102a6faf8f96d131497654b3">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="89811890e6a77f1e0cfc6c24ed35d09b"></a><!-- doxytag: member="tbb::enumerable_thread_specific::end" ref="89811890e6a77f1e0cfc6c24ed35d09b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#89811890e6a77f1e0cfc6c24ed35d09b">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="56f6124f5870e26433a5bb2b71e4b7e9"></a><!-- doxytag: member="tbb::enumerable_thread_specific::range" ref="56f6124f5870e26433a5bb2b71e4b7e9" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#56f6124f5870e26433a5bb2b71e4b7e9">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="a32dd1d88e42dc1faccceca244b12b6c"></a><!-- doxytag: member="tbb::enumerable_thread_specific::range" ref="a32dd1d88e42dc1faccceca244b12b6c" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#a32dd1d88e42dc1faccceca244b12b6c">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="c890601a45273ef759e64ac2fe75cb6a"></a><!-- doxytag: member="tbb::enumerable_thread_specific::clear" ref="c890601a45273ef759e64ac2fe75cb6a" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">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="f109a2bbe9ce390f78363a2d17a88ed5"></a><!-- doxytag: member="tbb::enumerable_thread_specific::enumerable_thread_specific" ref="f109a2bbe9ce390f78363a2d17a88ed5" 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="a00143.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c3be03082943460305b8022693c04b4a"></a><!-- doxytag: member="tbb::enumerable_thread_specific::enumerable_thread_specific" ref="c3be03082943460305b8022693c04b4a" args="(const enumerable_thread_specific &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00143.html">enumerable_thread_specific</a> &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8226b10dbb71cfe467eb85ac37b91ff0"></a><!-- doxytag: member="tbb::enumerable_thread_specific::operator=" ref="8226b10dbb71cfe467eb85ac37b91ff0" args="(const enumerable_thread_specific &other)" -->
-<a class="el" href="a00143.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00143.html">enumerable_thread_specific</a> &other)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b124465416967c23b12841170a7f0263"></a><!-- doxytag: member="tbb::enumerable_thread_specific::operator=" ref="b124465416967c23b12841170a7f0263" 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="a00143.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00143.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dd6b27d9c98297220b08732d9087a5a8"></a><!-- doxytag: member="tbb::enumerable_thread_specific::combine" ref="dd6b27d9c98297220b08732d9087a5a8" 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="4abce9638ef2693d813d820af59bb6e2"></a><!-- doxytag: member="tbb::enumerable_thread_specific::combine_each" ref="4abce9638ef2693d813d820af59bb6e2" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>padded_element</b></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The padded elements; padded to avoid false sharing. <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::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+<h3>template<typename T><br>
+ struct tbb::atomic< T ></h3>
-The thread local class template.
+Primary template for atomic.
+<p>
+See the Reference for details.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00305.html">enumerable_thread_specific.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00311.html">atomic.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00144.html b/doc/html/a00144.html
index 202af17..de22ed9 100644
--- a/doc/html/a00144.html
+++ b/doc/html/a00144.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::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,187 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00144.html">filter</a></div>
-<h1>tbb::filter Class Reference<br>
-<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00144.html">atomic< void * ></a></div>
+<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00360.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00311.html">atomic.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::filter:
-<p><center><img src="a00144.png" usemap="#tbb::filter_map" border="0" alt=""></center>
-<map name="tbb::filter_map">
-<area href="a00182.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
-</map>
-<a href="a00045.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 Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">parallel</a> = current_version | filter_is_out_of_order</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">processes multiple items in parallel and in no particular order <a href="#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">serial_in_order</a> = current_version | filter_is_serial</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">processes items one at a time; all such filters process items in the same order <a href="#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">serial_out_of_order</a> = current_version | filter_is_serial | filter_is_out_of_order</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">processes items one at a time and in no particular order <a href="#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">serial</a> = serial_in_order</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> { <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">parallel</a> = current_version | filter_is_out_of_order,
-<a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">serial_in_order</a> = current_version | filter_is_serial,
-<a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">serial_out_of_order</a> = current_version | filter_is_serial | filter_is_out_of_order,
-<a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">serial</a> = serial_in_order
- }</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="a00144.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="a00144.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="a00144.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">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.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="a00144.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="a00144.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="f1111979b4afbde1a6c1873577a005ae"></a><!-- doxytag: member="tbb::filter::filter" ref="f1111979b4afbde1a6c1873577a005ae" args="(bool is_serial_)" -->
- </td><td class="memItemRight" valign="bottom"><b>filter</b> (bool is_serial_)</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> (<a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> filter_mode)</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="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="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="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="a00143.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00143.html">atomic</a>< void * > &rhs)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A stage in a pipeline.
-<p>
-<hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="d3b6ed2c517144199d0c39c62ddfd8cf"></a><!-- doxytag: member="tbb::filter::mode" ref="d3b6ed2c517144199d0c39c62ddfd8cf" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">tbb::filter::mode</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<><br>
+ struct tbb::atomic< void * ></h3>
+Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<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="d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe"></a><!-- doxytag: member="parallel" ref="d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe" args="" -->parallel</em> </td><td>
-processes multiple items in parallel and in no particular order </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93"></a><!-- doxytag: member="serial_in_order" ref="d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93" args="" -->serial_in_order</em> </td><td>
-processes items one at a time; all such filters process items in the same order </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9"></a><!-- doxytag: member="serial_out_of_order" ref="d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9" args="" -->serial_out_of_order</em> </td><td>
-processes items one at a time and in no particular order </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237"></a><!-- doxytag: member="serial" ref="d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237" args="" -->serial</em> </td><td>
-<dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>use serial_in_order instead </dd></dl>
-</td></tr>
-</table>
-</dl>
-
-</div>
-</div><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>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00360.html">pipeline.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00311.html">atomic.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00145.html b/doc/html/a00145.html
index b689045..a20082b 100644
--- a/doc/html/a00145.html
+++ b/doc/html/a00145.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::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,30 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00145.html">final_scan_tag</a></div>
-<h1>tbb::final_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00241.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="a00267.html">tbb</a>::<b>internal</b>::<a class="el" href="a00145.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="a00342.html">parallel_scan.h</a>></code>
+<code>#include <<a class="el" href="a00454.html">tbb_machine.h</a>></code>
<p>
-<a href="a00038.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>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 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="a00145.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>
-Used to indicate that the final scan is being performed.
+Class that implements exponential backoff.
+<p>
+See implementation of spin_wait_while_eq for an example.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00342.html">parallel_scan.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00454.html">tbb_machine.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00146.html b/doc/html/a00146.html
index f9b4abf..0904347 100644
--- a/doc/html/a00146.html
+++ b/doc/html/a00146.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::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,27 +21,41 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00146.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="a00267.html">tbb</a>::<a class="el" href="a00146.html">auto_partitioner</a></div>
+<h1>tbb::auto_partitioner Class Reference<br>
+<small>
+[<a class="el" href="a00274.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="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
<p>
-<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00046.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public 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 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>
-Exception for PPL locks.
+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="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00404.html">partitioner.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00147.html b/doc/html/a00147.html
index 4d9d431..82143f1 100644
--- a/doc/html/a00147.html
+++ b/doc/html/a00147.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::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,27 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00147.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="a00267.html">tbb</a>::<a class="el" href="a00147.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="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00086.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="57082ccac880db17144db76c0f94701e"></a><!-- doxytag: member="tbb::invalid_multiple_scheduling::what" ref="57082ccac880db17144db76c0f94701e" args="() const " -->
+<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 repeated scheduling of the same task_handle.
+Exception for concurrent containers.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00148.html b/doc/html/a00148.html
index 2e150b9..c2baa07 100644
--- a/doc/html/a00148.html
+++ b/doc/html/a00148.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::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,27 +21,201 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00148.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="a00267.html">tbb</a>::<a class="el" href="a00148.html">blocked_range</a></div>
+<h1>tbb::blocked_range< Value > Class Template Reference<br>
+<small>
+[<a class="el" href="a00274.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="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00319.html">blocked_range.h</a>></code>
<p>
-<a href="a00085.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="a00148.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="a00148.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="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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.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="a00148.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00148.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="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.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="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.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="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.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="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.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="a00148.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="a00148.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="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00148.html">blocked_range</a> &r, <a class="el" href="a00198.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>
-Exception for missing wait on structured_task_group.
+<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="a00148.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00148.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="a00148.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="a00148.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00148.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="a00148.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00148.html">blocked_range</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00148.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="a00198.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="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00148.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="a00148.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="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00148.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="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00148.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="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00148.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="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00319.html">blocked_range.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00149.html b/doc/html/a00149.html
index 86a0877..e1bfa81 100644
--- a/doc/html/a00149.html
+++ b/doc/html/a00149.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::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,148 +21,63 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00149.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="a00267.html">tbb</a>::<a class="el" href="a00149.html">blocked_range2d</a></div>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00274.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="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00320.html">blocked_range2d.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
-<p><center><img src="a00149.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
-<map name="tbb::movable_exception< ExceptionData >_map">
-<area href="a00180.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
-</map>
-<a href="a00089.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 Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd3a1f2580e18cad8453a429a52d04b2"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="bd3a1f2580e18cad8453a429a52d04b2" args="(const ExceptionData &data)" -->
- </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const ExceptionData &data)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48f97fbf1e5d66c5977891f4375ee4d9"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="48f97fbf1e5d66c5977891f4375ee4d9" args="(const movable_exception &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const <a class="el" href="a00149.html">movable_exception</a> &src) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dfafefe27f2afaa7c7894ca9c71cc568"></a><!-- doxytag: member="tbb::movable_exception::operator=" ref="dfafefe27f2afaa7c7894ca9c71cc568" args="(const movable_exception &src)" -->
-const <a class="el" href="a00149.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00149.html">movable_exception</a> &src)</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="a00148.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></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">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="a00148.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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>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="a00148.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00148.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="bc5f5c4739b17ac5211ac58226c2f5a5"></a><!-- doxytag: member="tbb::movable_exception::name" ref="bc5f5c4739b17ac5211ac58226c2f5a5" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw ()</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">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="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw ()</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="a00149.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00149.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw ()</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="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </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="a00149.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw ()</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="a00149.html">blocked_range2d</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00149.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="a00149.html#17cffba35811c92b7e65d63506b69602">throw_self</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="a00148.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">rows</a> () const </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="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></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="a00148.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">User data. <br></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 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="a00180.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="a00149.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="a00149.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="a00180.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="a00149.html">movable_exception</a>* <a class="el" href="a00149.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 RowValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range2d< RowValue, ColValue ></h3>
+A 2-dimensional range that models the Range concept.
<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implements <a class="el" href="a00180.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="a00149.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="a00180.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="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00320.html">blocked_range2d.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00150.html b/doc/html/a00150.html
index a1ff08a..e2f0df2 100644
--- a/doc/html/a00150.html
+++ b/doc/html/a00150.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::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,84 +21,70 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00150.html">mutex</a></div>
-<h1>tbb::mutex Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00150.html">blocked_range3d</a></div>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.
+[<a class="el" href="a00274.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="a00313.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00321.html">blocked_range3d.h</a>></code>
<p>
-<a href="a00030.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 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="a00150.html#05313cb77d4f85213103d4dab74ed454">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="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
+typedef <a class="el" href="a00148.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.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="a00148.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">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="a00150.html#4470e61c24c129a0299ca6c17240adbb">lock</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="a00148.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="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="a00150.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</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="a00148.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00148.html#f5707bffea38eee [...]
-<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="a00150.html#5fc9ef443ae75d966695546be399cc6b">unlock</a> ()</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="a00150.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </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="17b78176054e2bac1ff35b9535d1ea0c"></a><!-- doxytag: member="tbb::mutex::is_rw_mutex" ref="17b78176054e2bac1ff35b9535d1ea0c" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00150.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </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="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="a00150.html">blocked_range3d</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f023a29c61451d02359095cbff0f3d45"></a><!-- doxytag: member="tbb::mutex::is_fair_mutex" ref="f023a29c61451d02359095cbff0f3d45" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
+const <a class="el" href="a00148.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">pages</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="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="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="a00148.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </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="a00151.html">scoped_lock</a></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="a00148.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00151.html#_details">More...</a><br></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>
-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">
+<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>
-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="a00313.html">mutex.h</a></ul>
+<li><a class="el" href="a00321.html">blocked_range3d.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00151.html b/doc/html/a00151.html
index f2ccb46..f72039d 100644
--- a/doc/html/a00151.html
+++ b/doc/html/a00151.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::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,76 +21,91 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00150.html">mutex</a>::<a class="el" href="a00151.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="a00267.html">tbb</a>::<a class="el" href="a00151.html">cache_aligned_allocator</a></div>
+<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00276.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="a00313.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00322.html">cache_aligned_allocator.h</a>></code>
<p>
-<a href="a00031.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="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
+typedef internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d403ae51b484df5d86d85ae38f11e6e"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="1d403ae51b484df5d86d85ae38f11e6e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</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="a00151.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="a00151.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="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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00150.html">mutex</a> &<a class="el" href="a00150.html">mutex</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <a href="#605a6b9af0f8cdabdf81825e0de99600"></a><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="a00151.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</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="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</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="a00151.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00150.html">mutex</a> &<a class="el" href="a00150.html">mutex</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="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</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="a00151.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00150.html">mutex</a> &<a class="el" href="a00150.html">mutex</a>)</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="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () 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="0d51d18cd99df3b2e93bf07378d0992c"></a><!-- doxytag: member="tbb::mutex::scoped_lock::release" ref="0d51d18cd99df3b2e93bf07378d0992c" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#0d51d18cd99df3b2e93bf07378d0992c">release</a> ()</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="a00151.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93062a14ad2e50e2b7b485b913170779"></a><!-- doxytag: member="tbb::mutex::scoped_lock::mutex" ref="93062a14ad2e50e2b7b485b913170779" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>mutex</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00151.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>
</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="605a6b9af0f8cdabdf81825e0de99600"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="605a6b9af0f8cdabdf81825e0de99600" args="(mutex &mutex)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::mutex::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00150.html">mutex</a> & </td>
- <td class="paramname"> <em>mutex</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>
-Acquire lock on given mutex.
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
-Upon entry, *this should not be in the "have acquired a mutex" state.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00313.html">mutex.h</a></ul>
+<li><a class="el" href="a00322.html">cache_aligned_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00152.html b/doc/html/a00152.html
index 2f7a702..366b8f3 100644
--- a/doc/html/a00152.html
+++ b/doc/html/a00152.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::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,42 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00152.html">null_mutex</a></div>
-<h1>tbb::null_mutex Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00152.html">cache_aligned_allocator< void ></a></div>
+<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.
+[<a class="el" href="a00276.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="a00315.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00322.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="a00009.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="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="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="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="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="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">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.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">Represents acquisition of a mutex. <a href="a00153.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="a00152.html">null_mutex</a> does no operation and simulates success.
+<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="a00315.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00322.html">cache_aligned_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00153.html b/doc/html/a00153.html
index 6227534..eecc2d0 100644
--- a/doc/html/a00153.html
+++ b/doc/html/a00153.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::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,36 +21,134 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00152.html">null_mutex</a>::<a class="el" href="a00153.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="a00267.html">tbb</a>::<a class="el" href="a00153.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="a00315.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00033.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::captured_exception:
+<p><center><img src="a00153.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
+<map name="tbb::captured_exception_map">
+<area href="a00206.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
+</map>
+<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>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="a00152.html">null_mutex</a> &)</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="a00153.html">captured_exception</a> &src)</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="a00152.html">null_mutex</a> &)</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="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="a00152.html">null_mutex</a> &)</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="a00153.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00153.html">captured_exception</a> &src)</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="el" href="a00153.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.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="a00153.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00153.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="a00153.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="a00153.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="a00153.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="a00153.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>
-Represents acquisition of a mutex.
+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="a00206.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="a00153.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="a00206.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="a00153.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="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::captured_exception::throw_self </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Throws this exception object.
+<p>
+Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
<p>
+Implements <a class="el" href="a00206.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="a00315.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00132.png b/doc/html/a00153.png
similarity index 100%
rename from doc/html/a00132.png
rename to doc/html/a00153.png
diff --git a/doc/html/a00154.html b/doc/html/a00154.html
index bf63719..40015d5 100644
--- a/doc/html/a00154.html
+++ b/doc/html/a00154.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::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,42 +21,61 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00154.html">null_rw_mutex</a></div>
-<h1>tbb::null_rw_mutex Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00154.html">combinable</a></div>
+<h1>tbb::combinable< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.
+[<a class="el" href="a00275.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="a00316.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00324.html">combinable.h</a>></code>
<p>
-<a href="a00034.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>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="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="e33ac3b047901e69e7997a16e221a330"></a><!-- doxytag: member="tbb::null_rw_mutex::is_recursive_mutex" ref="e33ac3b047901e69e7997a16e221a330" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">~combinable</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">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="a00154.html">combinable</a> &other)</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="a00155.html">scoped_lock</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="a00154.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00154.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="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00155.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A rw mutex which does nothing.
-<p>
-A <a class="el" href="a00154.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation.
+<h3>template<typename T><br>
+ class tbb::combinable< T ></h3>
+
+Thread-local storage with optional reduction.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00316.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00324.html">combinable.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00155.html b/doc/html/a00155.html
index 521d189..d3eae09 100644
--- a/doc/html/a00155.html
+++ b/doc/html/a00155.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::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,42 +21,283 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00154.html">null_rw_mutex</a>::<a class="el" href="a00155.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="a00267.html">tbb</a>::<a class="el" href="a00155.html">concurrent_bounded_queue</a></div>
+<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00275.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="a00316.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00335.html">concurrent_queue.h</a>></code>
<p>
-<a href="a00035.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
+<p><center><img src="a00155.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::concurrent_bounded_queue< T, A >_map">
+<area href="a00161.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
+</map>
+<a href="a00019.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00155.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="a00155.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="a00155.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="a00155.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="a00155.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="a00155.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="a00155.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="a00155.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="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="a00154.html">null_rw_mutex</a> &, bool=true)</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="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00155.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="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00155.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00155.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="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00155.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="a00155.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="a00155.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="a00155.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="a00155.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="a00155.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="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.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="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00155.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="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.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="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00155.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="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.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="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c4c302fdfc20187a650348e432b0a7"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::acquire" ref="72c4c302fdfc20187a650348e432b0a7" args="(null_rw_mutex &, bool=true)" -->
-void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00154.html">null_rw_mutex</a> &, bool=true)</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="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="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="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="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="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="a00154.html">null_rw_mutex</a> &, bool=true)</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 class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6146c803a4ad2f14263fdc019a72b5a9"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::release" ref="6146c803a4ad2f14263fdc019a72b5a9" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
+<tr><td 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>
-Represents acquisition of a mutex.
+<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="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Integral type for representing size of the queue.
+<p>
+Notice 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="a00155.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="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00155.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="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00155.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="a00155.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="a00155.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="a00155.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="a00316.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00335.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00134.png b/doc/html/a00155.png
similarity index 100%
rename from doc/html/a00134.png
rename to doc/html/a00155.png
diff --git a/doc/html/a00156.html b/doc/html/a00156.html
index 9778fed..93a71f2 100644
--- a/doc/html/a00156.html
+++ b/doc/html/a00156.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::interface4::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,42 +21,623 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00156.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="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
+<small>
+[<a class="el" href="a00275.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map" -->Unordered map from Key to T.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00317.html">parallel_do.h</a>></code>
+<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00036.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="33b3b94e17dab45c97b246bca3625655"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::key_type" ref="33b3b94e17dab45c97b246bca3625655" 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="a5d75ef053d5e69de88ae7e941a743ec"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::mapped_type" ref="a5d75ef053d5e69de88ae7e941a743ec" 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="01ebd1df398d3823ca6ea8fcb6b068ae"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::value_type" ref="01ebd1df398d3823ca6ea8fcb6b068ae" 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="ae6bb63bc9cf97d63e78d208ae0e479d"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::size_type" ref="ae6bb63bc9cf97d63e78d208ae0e479d" 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="2f5093a93592b0a30fda935711f9f788"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::difference_type" ref="2f5093a93592b0a30fda935711f9f788" 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="1d1ffb83cae339007dc8d5b2e4e3cea8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::pointer" ref="1d1ffb83cae339007dc8d5b2e4e3cea8" 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="ecf3dc1d6d8290a71639967ffa933343"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_pointer" ref="ecf3dc1d6d8290a71639967ffa933343" 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="14a3d74308b04a355b0689eb019ee683"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::reference" ref="14a3d74308b04a355b0689eb019ee683" 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="1f6fcb68889829bca708d57f7b9e2da4"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_reference" ref="1f6fcb68889829bca708d57f7b9e2da4" 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="118b95ebef79ac195fb99babbf335e8c"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::iterator" ref="118b95ebef79ac195fb99babbf335e8c" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00156.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="5fec1af5576448740eb5c6119a30c6a9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_iterator" ref="5fec1af5576448740eb5c6119a30c6a9" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00156.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="aa3d1bdabd5e9a15174624946048a2c8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range_type" ref="aa3d1bdabd5e9a15174624946048a2c8" 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="20981e8295ff79f4e3d8b76a16c42851"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_range_type" ref="20981e8295ff79f4e3d8b76a16c42851" 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="f8d6e7e809e96f48fd039a54fc4df630"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::allocator_type" ref="f8d6e7e809e96f48fd039a54fc4df630" 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="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="a00156.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d827bb5e4f61de1916ab67d51c7c6e60"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="d827bb5e4f61de1916ab67d51c7c6e60" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">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="a4612d5c7233712d455496641e9b31ff"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="a4612d5c7233712d455496641e9b31ff" args="(size_type n, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a4612d5c7233712d455496641e9b31ff">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="df0cd14eaddb17f10929c91519e65be9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="df0cd14eaddb17f10929c91519e65be9" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">concurrent_hash_map</a> (const <a class="el" href="a00156.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="3bfe75fcb350ce39cf610c164f233edc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="3bfe75fcb350ce39cf610c164f233edc" 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="a00156.html#3bfe75fcb350ce39cf610c164f233edc">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="2c0c42a2e1b5282b6739157df9ce2304"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::operator=" ref="2c0c42a2e1b5282b6739157df9ce2304" args="(const concurrent_hash_map &table)" -->
+<a class="el" href="a00156.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">operator=</a> (const <a class="el" href="a00156.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="a00156.html#13f3f2e8de7564be03882c31559493c9">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="#13f3f2e8de7564be03882c31559493c9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9f89be8fe28835749529d91081a2511"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::clear" ref="a9f89be8fe28835749529d91081a2511" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a9f89be8fe28835749529d91081a2511">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="a1ac58997d8fbf242b266e3691573481"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::~concurrent_hash_map" ref="a1ac58997d8fbf242b266e3691573481" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">~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="1d279026ce93bbef47a5b8a028cd387b"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range" ref="1d279026ce93bbef47a5b8a028cd387b" 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="728c7aef8f1326f3f9ca6b4a6d1155cf"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range" ref="728c7aef8f1326f3f9ca6b4a6d1155cf" 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="4a3c58cf1234b74ca796dcf555d32f53"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::begin" ref="4a3c58cf1234b74ca796dcf555d32f53" 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="28c690486d8db5783475f5b1a59d21bc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::end" ref="28c690486d8db5783475f5b1a59d21bc" 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="aa51c059c92aaf259916be74b928adb2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::begin" ref="aa51c059c92aaf259916be74b928adb2" 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="d2610bf00a3f631719308bdb59876f08"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::end" ref="d2610bf00a3f631719308bdb59876f08" 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="5faacd9a290b122947a21f72c676a0b9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::equal_range" ref="5faacd9a290b122947a21f72c676a0b9" 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="4abad08a1788b57a78698f16fab92838"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::equal_range" ref="4abad08a1788b57a78698f16fab92838" 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="17fd8c5fe8c6a86075f34aa4e8412ba3"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::size" ref="17fd8c5fe8c6a86075f34aa4e8412ba3" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">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="6cab7d029a3e73a653ef0faeac4d1586"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::empty" ref="6cab7d029a3e73a653ef0faeac4d1586" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size()</a>==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e45d3cbd1e2ae06f365f1b48e0df0b5"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::max_size" ref="1e45d3cbd1e2ae06f365f1b48e0df0b5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">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="414d15033d36c63aa3a40666dc4d6f5e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_count" ref="414d15033d36c63aa3a40666dc4d6f5e" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">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="199208eed6f09e200cda364f906be0fe"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::get_allocator" ref="199208eed6f09e200cda364f906be0fe" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">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="eddb0d2efe0b4f25a85c059e1c3dac15"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::swap" ref="eddb0d2efe0b4f25a85c059e1c3dac15" args="(concurrent_hash_map &table)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap</a> (<a class="el" href="a00156.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="74f5ef06a06c5e619f156a1c76c04969"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::count" ref="74f5ef06a06c5e619f156a1c76c04969" args="(const Key &key) const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">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="a00156.html#64338d7f2e35df586af4cb0145cd910f">find</a> (<a class="el" href="a00159.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="#64338d7f2e35df586af4cb0145cd910f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">find</a> (<a class="el" href="a00157.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="#bce7bdf46435115a95cca2aa73c5da83"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#58c38b27273de6c670568633c0931854">insert</a> (<a class="el" href="a00159.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="#58c38b27273de6c670568633c0931854"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">insert</a> (<a class="el" href="a00157.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="#ccfecaa3e71d92be61fb3d811dd264eb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">insert</a> (<a class="el" href="a00159.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="#d4a2816129e38c53128c6d0c7b6b7370"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a657e61cd2b13164764ca2708875784a">insert</a> (<a class="el" href="a00157.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="#a657e61cd2b13164764ca2708875784a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">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="#52bffd1066b3d7b793945bc6fa1a71a1"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="cfe172677e5987004ef4a03e22fa338a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="cfe172677e5987004ef4a03e22fa338a" 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="a00156.html#cfe172677e5987004ef4a03e22fa338a">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="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">erase</a> (const Key &key)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item. <a href="#034c3b3ee419edee78e0f2f2b1f0d7ca"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">erase</a> (<a class="el" href="a00159.html">const_accessor</a> &item_accessor)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00159.html">const_accessor</a>. <a href="#da7e4a50f6bb06191817425ec85fe760"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">erase</a> (<a class="el" href="a00157.html">accessor</a> &item_accessor)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor. <a href="#0f500842d0cf791f8fa61662edb1b311"></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="6bea55a4e94be2ab299de06dc266f3a3"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::node_allocator_type" ref="6bea55a4e94be2ab299de06dc266f3a3" 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="53a98a10a2adb33d91a286a487d0cd78"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::delete_node" ref="53a98a10a2adb33d91a286a487d0cd78" 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="6d30c4c2698ea07ed6dd0e9eaf774b11"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::search_bucket" ref="6d30c4c2698ea07ed6dd0e9eaf774b11" 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="571d635fd206d9985cf20a1a659ea476"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::rehash_bucket" ref="571d635fd206d9985cf20a1a659ea476" 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="1f22480a290ddc6c145888d8f985531a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::lookup" ref="1f22480a290ddc6c145888d8f985531a" 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="a00156.html#1f22480a290ddc6c145888d8f985531a">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00159.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="faad2108bd2be75e52293486af59f11e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::exclude" ref="faad2108bd2be75e52293486af59f11e" args="(const_accessor &item_accessor, bool readonly)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">exclude</a> (<a class="el" href="a00159.html">const_accessor</a> &item_accessor, bool readonly)</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="976c57edfb7f22b9f91a2e11f141eb4a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_equal_range" ref="976c57edfb7f22b9f91a2e11f141eb4a" 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="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">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="3c27779fe66b79505390d084310d997e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_copy" ref="3c27779fe66b79505390d084310d997e" args="(const concurrent_hash_map &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a> (const <a class="el" href="a00156.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="cf43170691e36146a1bff61e3cf895ce"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_copy" ref="cf43170691e36146a1bff61e3cf895ce" 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="a00156.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="252e91d8029f6308db7179557e3b1436"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::my_allocator" ref="252e91d8029f6308db7179557e3b1436" 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="f738f241c8500ce3dbf0f9028ca8b602"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::my_hash_compare" ref="f738f241c8500ce3dbf0f9028ca8b602" args="" -->
+HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</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>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface4::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::interface4::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::interface4::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"><a class="el" href="a00157.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="a00157.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.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="a00158.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html">const_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00159.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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Item><br>
- class tbb::parallel_do_feeder< Item ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
+
+Unordered map from Key to T.
+<p>
+<a class="el" href="a00156.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="a00156.html#58c38b27273de6c670568633c0931854">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="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">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="a00156.html#58c38b27273de6c670568633c0931854">insert()</a> methods</li><li>Added <a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">get_allocator()</a></li><li>Added <a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap()</a></li [...]
+</dd></dl>
+
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="0f500842d0cf791f8fa61662edb1b311"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="0f500842d0cf791f8fa61662edb1b311" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00157.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="da7e4a50f6bb06191817425ec85fe760"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="da7e4a50f6bb06191817425ec85fe760" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00159.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="a00159.html">const_accessor</a>.
+<p>
+Return true if item was erased by particularly this call.
+</div>
+</div><p>
+<a class="anchor" name="034c3b3ee419edee78e0f2f2b1f0d7ca"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="034c3b3ee419edee78e0f2f2b1f0d7ca" 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="a00156.html">tbb::interface4::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="bce7bdf46435115a95cca2aa73c5da83"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::find" ref="bce7bdf46435115a95cca2aa73c5da83" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00157.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">
-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>
+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="64338d7f2e35df586af4cb0145cd910f"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::find" ref="64338d7f2e35df586af4cb0145cd910f" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00159.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="52bffd1066b3d7b793945bc6fa1a71a1"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="52bffd1066b3d7b793945bc6fa1a71a1" 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="a00156.html">tbb::interface4::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="a657e61cd2b13164764ca2708875784a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="a657e61cd2b13164764ca2708875784a" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00157.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="d4a2816129e38c53128c6d0c7b6b7370"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="d4a2816129e38c53128c6d0c7b6b7370" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00159.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="ccfecaa3e71d92be61fb3d811dd264eb"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="ccfecaa3e71d92be61fb3d811dd264eb" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00157.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="58c38b27273de6c670568633c0931854"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="58c38b27273de6c670568633c0931854" 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="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00159.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::interface4::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="a00156.html">tbb::interface4::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="13f3f2e8de7564be03882c31559493c9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::rehash" ref="13f3f2e8de7564be03882c31559493c9" 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="a00156.html">tbb::interface4::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="a00156.html#64338d7f2e35df586af4cb0145cd910f">find()</a> and <a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">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="a00317.html">parallel_do.h</a></ul>
+<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00157.html b/doc/html/a00157.html
index a680b45..ca7109f 100644
--- a/doc/html/a00157.html
+++ b/doc/html/a00157.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::interface4::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,117 +21,45 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00157.html">parallel_while</a></div>
-<h1>tbb::parallel_while< Body > Class Template Reference<br>
-<small>
-[<a class="el" href="a00241.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="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a>::<a class="el" href="a00157.html">accessor</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface4::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="a00351.html">parallel_while.h</a>></code>
+<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00039.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
+<p><center><img src="a00157.png" usemap="#tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
+<map name="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
+<area href="a00159.html" alt="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
+</map>
+<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="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="a00157.html#fa297e53d3af2a101e712bc200233e9c">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="49eec74f272bab187d176c0d9d16a7fe"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::value_type" ref="49eec74f272bab187d176c0d9d16a7fe" args="" -->
+typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">value_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of items. <br></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="36e26ba3880c7bcf804a97ba0cbe133f"></a><!-- doxytag: member="tbb::parallel_while::parallel_while" ref="36e26ba3880c7bcf804a97ba0cbe133f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8938f0cd1211e88a1d73527ed3636c4"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::operator *" ref="e8938f0cd1211e88a1d73527ed3636c4" args="() const " -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">operator *</a> () const </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="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</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="fcebc32c020202cc37e60eadef157569"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::operator->" ref="fcebc32c020202cc37e60eadef157569" args="() const " -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">operator-></a> () const </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="a00157.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</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="a00157.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00157.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>
+<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 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="a00157.html">tbb::parallel_while</a>< Body >::add </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00157.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">
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
+Allows write access to elements and combines data access, locking, and garbage collection.
<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="a00157.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="a00351.html">parallel_while.h</a></ul>
+<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00157.png b/doc/html/a00157.png
new file mode 100644
index 0000000..a40bd94
Binary files /dev/null and b/doc/html/a00157.png differ
diff --git a/doc/html/a00158.html b/doc/html/a00158.html
index 88c77b2..30be5c2 100644
--- a/doc/html/a00158.html
+++ b/doc/html/a00158.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::interface4::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,85 +21,45 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00158.html">pipeline</a></div>
-<h1>tbb::pipeline Class Reference<br>
-<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeling that applies filters to items.
+<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a>::<a class="el" href="a00158.html">bucket_accessor</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::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="a00360.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00047.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="596dc3beba27099c4c8581cb419e1a59"></a><!-- doxytag: member="tbb::pipeline::pipeline" ref="596dc3beba27099c4c8581cb419e1a59" args="()" -->
-__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5aa0b492fb4260a940ea7bda2ef486e2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="5aa0b492fb4260a940ea7bda2ef486e2" 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="a00156.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</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="a00158.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26b4fe0ca87a7ad4852cb787db880119"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::acquire" ref="26b4fe0ca87a7ad4852cb787db880119" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">acquire</a> (<a class="el" href="a00156.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00158.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00144.html">filter</a> &filter_)</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="fc194e3a186dc935a5fb513cc9f8e898"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::is_writer" ref="fc194e3a186dc935a5fb513cc9f8e898" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</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="a00158.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</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="57c6110bd20e95c06de5a199de988941"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::operator()" ref="57c6110bd20e95c06de5a199de988941" args="()" -->
+bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">operator()</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="a00158.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00175.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="a00158.html#2c84aef5b834b555ee220b176e25931e">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove all filters from the pipeline. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::pipeline::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c991e50853b0cac7da039550344d3ef"></a><!-- doxytag: member="tbb::pipeline::filter" ref="4c991e50853b0cac7da039550344d3ef" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>filter</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::pipeline::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9d033d41ff53a0ae6ef824aceee7ecbc"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_cleaner" ref="9d033d41ff53a0ae6ef824aceee7ecbc" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_cleaner</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7f0dc61f528de29d06e6054b4a9835"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::upgrade_to_writer" ref="8f7f0dc61f528de29d06e6054b4a9835" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A processing pipeling that applies filters to items.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
+bucket accessor is to find, rehash, acquire a lock, and access a bucket
<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="a00360.html">pipeline.h</a></ul>
+<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00159.html b/doc/html/a00159.html
index 586c7b3..1a98f62 100644
--- a/doc/html/a00159.html
+++ b/doc/html/a00159.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::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,30 +21,68 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00159.html">pre_scan_tag</a></div>
-<h1>tbb::pre_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pre_scan_tag" -->Used to indicate that the initial scan is being performed.
+<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a>::<a class="el" href="a00159.html">const_accessor</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00342.html">parallel_scan.h</a>></code>
+<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00037.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
+<p><center><img src="a00159.png" usemap="#tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
+<map name="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
+<area href="a00157.html" alt="tbb::interface4::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>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d45d2cf548e51140ad6faafbea8ca6b5"></a><!-- doxytag: member="tbb::pre_scan_tag::is_final_scan" ref="d45d2cf548e51140ad6faafbea8ca6b5" args="()" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48647ca0d79c1233b997f5768403c926"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::value_type" ref="48647ca0d79c1233b997f5768403c926" args="" -->
+typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#48647ca0d79c1233b997f5768403c926">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="5cce3104cb0a52e08d2131370871c614"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::empty" ref="5cce3104cb0a52e08d2131370871c614" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#5cce3104cb0a52e08d2131370871c614">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="d5ce4f88d8870290238a8ad621e6f270"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::release" ref="d5ce4f88d8870290238a8ad621e6f270" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">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="30f31106840700a4c3664b9cb1c31ca7"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::operator *" ref="30f31106840700a4c3664b9cb1c31ca7" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">operator *</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.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="a9ead65cca68d4c49c7ef64d7899a4c8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::const_accessor" ref="a9ead65cca68d4c49c7ef64d7899a4c8" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">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="752b0c1ec74b94786403a75e42917d01"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::~const_accessor" ref="752b0c1ec74b94786403a75e42917d01" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">~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>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the initial scan is being performed.
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
+
+Combines data access, locking, and garbage collection.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00342.html">parallel_scan.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00159.png b/doc/html/a00159.png
new file mode 100644
index 0000000..f39e102
Binary files /dev/null and b/doc/html/a00159.png differ
diff --git a/doc/html/a00160.html b/doc/html/a00160.html
index e7634f9..52f1f8a 100644
--- a/doc/html/a00160.html
+++ b/doc/html/a00160.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::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,52 +21,146 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00160.html">queuing_mutex</a></div>
-<h1>tbb::queuing_mutex Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00273.html">strict_ppl</a>::<a class="el" href="a00160.html">concurrent_queue</a></div>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing lock with local-only spinning.
+[<a class="el" href="a00275.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="a00361.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00335.html">concurrent_queue.h</a>></code>
<p>
-<a href="a00048.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public 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="a00160.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="a00160.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="a00160.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="a00160.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="a00160.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="a00160.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="a00160.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="a00160.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="b389ad9c4db7293e4bdb5b8cda69ec04"></a><!-- doxytag: member="tbb::queuing_mutex::queuing_mutex" ref="b389ad9c4db7293e4bdb5b8cda69ec04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a> ()</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="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c1fe92760dcd1c5a7ed52c6599a72f"></a><!-- doxytag: member="tbb::queuing_mutex::internal_construct" ref="96c1fe92760dcd1c5a7ed52c6599a72f" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct 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="a00160.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_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="420932f70ff3b85f7280ff11a133938d"></a><!-- doxytag: member="tbb::queuing_mutex::is_rw_mutex" ref="420932f70ff3b85f7280ff11a133938d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[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="a00160.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00160.html">concurrent_queue</a> &src, const <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc0c749f3a4e6ea75418677cb8f9205f"></a><!-- doxytag: member="tbb::queuing_mutex::is_recursive_mutex" ref="dc0c749f3a4e6ea75418677cb8f9205f" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55d5339e4ca04b759f90c0c1ef966539"></a><!-- doxytag: member="tbb::queuing_mutex::is_fair_mutex" ref="55d5339e4ca04b759f90c0c1ef966539" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</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="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="a00160.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="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.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="a00160.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="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</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="a00161.html">scoped_lock</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="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.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">The scoped locking pattern. <a href="a00161.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 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="a00160.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="a00361.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00335.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00161.html b/doc/html/a00161.html
index 8087704..1d9434f 100644
--- a/doc/html/a00161.html
+++ b/doc/html/a00161.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::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,52 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00160.html">queuing_mutex</a>::<a class="el" href="a00161.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="a00267.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00161.html">concurrent_queue</a></div>
+<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00275.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="a00361.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00335.html">concurrent_queue.h</a>></code>
<p>
-<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
+<p><center><img src="a00161.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::deprecated::concurrent_queue< T, A >_map">
+<area href="a00155.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
+</map>
+<a href="a00021.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public 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="a00155.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="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
+typedef <a class="el" href="a00155.html">concurrent_bounded_queue</a><<br>
+ T, A >::const_iterator </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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a> ()</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="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=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="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="a00161.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00161.html">concurrent_queue</a> &src, const A &a=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="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="a00161.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00160.html">queuing_mutex</a> &m)</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="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <a href="#9b51ef972f5618ac17caadb58841ab6d"></a><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="a00161.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a> ()</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="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</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="a00161.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00160.html">queuing_mutex</a> &m)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00161.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00160.html">queuing_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</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>
-<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.
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::deprecated::concurrent_queue< T, A ></h3>
+
+A high-performance thread-safe blocking concurrent bounded queue.
<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+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>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="db0fa3967491014572e24d6607bdc971"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="db0fa3967491014572e24d6607bdc971" args="()" -->
+<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">tbb::queuing_mutex::scoped_lock::scoped_lock </td>
+ <td class="memname">bool <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present </td>
<td>(</td>
- <td class="paramname"> </td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>destination</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -75,20 +111,23 @@ It helps to avoid the common problem of forgetting to release lock. It also nice
<div class="memdoc">
<p>
-Construct lock that has not acquired a mutex.
+Attempt to dequeue an item from head of queue.
<p>
-Equivalent to zero-initialization of *this.
+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="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+
</div>
</div><p>
-<a class="anchor" name="9b51ef972f5618ac17caadb58841ab6d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="9b51ef972f5618ac17caadb58841ab6d" args="(queuing_mutex &m)" -->
+<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">tbb::queuing_mutex::scoped_lock::scoped_lock </td>
+ <td class="memname">bool <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00160.html">queuing_mutex</a> & </td>
- <td class="paramname"> <em>m</em> </td>
+ <td class="paramtype">const T & </td>
+ <td class="paramname"> <em>source</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -97,16 +136,16 @@ Equivalent to zero-initialization of *this.
<div class="memdoc">
<p>
-Acquire lock on given mutex.
+Enqueue an item at tail of queue if queue is not already full.
<p>
-Upon entry, *this should not be in the "have acquired a mutex" state.
+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="a00361.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00335.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00140.png b/doc/html/a00161.png
similarity index 100%
rename from doc/html/a00140.png
rename to doc/html/a00161.png
diff --git a/doc/html/a00162.html b/doc/html/a00162.html
index 8077a71..feece1c 100644
--- a/doc/html/a00162.html
+++ b/doc/html/a00162.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::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,58 +21,573 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00162.html">queuing_rw_mutex</a></div>
-<h1>tbb::queuing_rw_mutex Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00162.html">concurrent_vector</a></div>
+<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Reader-writer lock with local-only spinning.
+[<a class="el" href="a00275.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="a00362.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00341.html">concurrent_vector.h</a>></code>
<p>
-<a href="a00050.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00026.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="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
+typedef internal::allocator_base<<br>
+ T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00162.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="a00162.html">concurrent_vector</a>, const <br>
+T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator, T, const <br>
+T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85c90877c3447690ac4e2ac4ff8dea5e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::queuing_rw_mutex" ref="85c90877c3447690ac4e2ac4ff8dea5e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</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="a00162.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="a00162.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00162.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="a00162.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00162.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="a00162.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="a00162.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="a00162.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="a00162.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00162.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="a00162.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00162.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="a00162.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="a00162.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="a00162.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="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end</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="a00162.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</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="a00162.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb88522d145ad7bcf5bebfa7d2a6122b"></a><!-- doxytag: member="tbb::queuing_rw_mutex::internal_construct" ref="eb88522d145ad7bcf5bebfa7d2a6122b" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () 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="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="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="a00162.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </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="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="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="147b34120505e419f6ea8d631ec4375d"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_fair_mutex" ref="147b34120505e419f6ea8d631ec4375d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td class="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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00162.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="a00162.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="a00162.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="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 class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html">scoped_lock</a></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="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00163.html#_details">More...</a><br></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>
-Reader-writer lock with local-only spinning.
+<h3>template<typename T, class A><br>
+ class tbb::concurrent_vector< T, A ></h3>
+
+Concurrent vector container.
+<p>
+<a class="el" href="a00162.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="a00162.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="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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="a00162.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">
+
<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>
+Allocate enough space to grow to size n without having to allocate more memory later.
<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="a00362.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00341.html">concurrent_vector.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00163.html b/doc/html/a00163.html
index 7d37da7..2a662f0 100644
--- a/doc/html/a00163.html
+++ b/doc/html/a00163.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::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,130 +21,31 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00162.html">queuing_rw_mutex</a>::<a class="el" href="a00163.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="a00267.html">tbb</a>::<a class="el" href="a00163.html">empty_task</a></div>
+<h1>tbb::empty_task Class Reference<br>
+<small>
+[<a class="el" href="a00279.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="a00362.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
<p>
-<a href="a00051.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::empty_task:
+<p><center><img src="a00163.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
+<map name="tbb::empty_task_map">
+<area href="a00199.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
+</map>
+<a href="a00076.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00162.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <a href="#fbb8798792d3aebb136c46fc63d2529e"></a><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="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">~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="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="a00163.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00162.html">queuing_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="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="a00163.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00162.html">queuing_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 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="a00163.html#67ae221109ddc69510ab593874e435d4">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#11ba1da4a722c9e6f73339a52c487e82"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2f93edf7b15ec4bcee138823220c52"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::downgrade_to_reader" ref="0d2f93edf7b15ec4bcee138823220c52" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.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>
-The scoped locking pattern.
+task that does nothing. Useful for synchronization.
<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="c62e365be7bcbba091c9ea7454a4d22c"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="c62e365be7bcbba091c9ea7454a4d22c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct lock that has not acquired a mutex.
-<p>
-Equivalent to zero-initialization of *this.
-</div>
-</div><p>
-<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)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00162.html">queuing_rw_mutex</a> & </td>
- <td class="paramname"> <em>m</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">bool </td>
- <td class="paramname"> <em>write</em> = <code>true</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>
-Acquire lock on given mutex.
-<p>
-Upon entry, *this should not be in the "have acquired a mutex" state.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="11ba1da4a722c9e6f73339a52c487e82"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer" ref="11ba1da4a722c9e6f73339a52c487e82" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-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>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00362.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00427.html">task.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00142.png b/doc/html/a00163.png
similarity index 100%
rename from doc/html/a00142.png
rename to doc/html/a00163.png
diff --git a/doc/html/a00164.html b/doc/html/a00164.html
index ad8ebb4..76cc614 100644
--- a/doc/html/a00164.html
+++ b/doc/html/a00164.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::interface5::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,84 +21,174 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00164.html">recursive_mutex</a></div>
-<h1>tbb::recursive_mutex Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00164.html">enumerable_thread_specific</a></div>
+<h1>tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.
+[<a class="el" href="a00275.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface5::enumerable_thread_specific" -->The <a class="el" href="a00164.html">enumerable_thread_specific</a> container.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00363.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00353.html">enumerable_thread_specific.h</a>></code>
<p>
-<a href="a00052.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="da7721b6c35d333ec89a37b63d0d82d3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::allocator_type" ref="da7721b6c35d333ec89a37b63d0d82d3" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="976852701d9d4018bca74907c80422af"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::value_type" ref="976852701d9d4018bca74907c80422af" 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="ca057d1cd23e99fb9d391d4af32ea3c3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::reference" ref="ca057d1cd23e99fb9d391d4af32ea3c3" 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="518d24e759a14ed3d4b5ad13abc54b4c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_reference" ref="518d24e759a14ed3d4b5ad13abc54b4c" 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="68d25e2e57106ce3805f8f14b9c13d8c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::pointer" ref="68d25e2e57106ce3805f8f14b9c13d8c" 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="dc48472e808339c40eb55c3fa4e68dc5"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_pointer" ref="dc48472e808339c40eb55c3fa4e68dc5" 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="5c822bff644fb5245386486cc1ddaf7c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::size_type" ref="5c822bff644fb5245386486cc1ddaf7c" 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="5e3fa161ff14516769519d3a555ccfb3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::difference_type" ref="5e3fa161ff14516769519d3a555ccfb3" 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="00c3c2708bf7618b80060c2703aaf261"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::iterator" ref="00c3c2708bf7618b80060c2703aaf261" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00162.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="c575f3574d5d82b98e6a07314dcdc17f"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_iterator" ref="c575f3574d5d82b98e6a07314dcdc17f" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00162.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="b914933105a8b56b961dd87c35908077"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::range_type" ref="b914933105a8b56b961dd87c35908077" 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="c914d5e2d64af34ae7399010057999c9"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_range_type" ref="c914d5e2d64af34ae7399010057999c9" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2fceb7f95c24a8cd1457d4527e4b8c6"></a><!-- doxytag: member="tbb::recursive_mutex::recursive_mutex" ref="d2fceb7f95c24a8cd1457d4527e4b8c6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca9994099ebd88e92be061452687422e"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="ca9994099ebd88e92be061452687422e" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#ca9994099ebd88e92be061452687422e">enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor, which leads to default construction of local copies. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="724ed4c846493da62b4efe032e16eb4a"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="724ed4c846493da62b4efe032e16eb4a" 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="a00164.html#724ed4c846493da62b4efe032e16eb4a">enumerable_thread_specific</a> (Finit _finit)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">construction with initializer method <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="105a6487c8c4113ba89891b75243780c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="105a6487c8c4113ba89891b75243780c" args="(const T &_exemplar)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">enumerable_thread_specific</a> (const T &_exemplar)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00164.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="a00164.html#4c342c69d47f4bb0b393535dee4015d6">lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuction with exemplar, which leads to copy construction of local copies. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7f6e5b3654712ea003cbb7ebaffa8dd9"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::~enumerable_thread_specific" ref="7f6e5b3654712ea003cbb7ebaffa8dd9" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">~enumerable_thread_specific</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="a00164.html#86e719b0afee25704af11ab97694d240">try_lock</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="8bcc55bfecc81937872b13f6db962b16"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::local" ref="8bcc55bfecc81937872b13f6db962b16" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#8bcc55bfecc81937872b13f6db962b16">local</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="a00164.html#f0a96e26b7f074588dc31e32524856ae">unlock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34423652c3add42563b1d5d44ca78158"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::local" ref="34423652c3add42563b1d5d44ca78158" args="(bool &exists)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">local</a> (bool &exists)</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="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">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="101ecd32efae3ce1331c3d8a791c645b"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::size" ref="101ecd32efae3ce1331c3d8a791c645b" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">size</a> () const </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">Get the number of local copies. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af91306d8e10e093226788a733ee59b4"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::empty" ref="af91306d8e10e093226788a733ee59b4" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">empty</a> () const </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">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="efd1e3d008ec5cd69c6b10c6dcac1e2c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::begin" ref="efd1e3d008ec5cd69c6b10c6dcac1e2c" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#efd1e3d008ec5cd69c6b10c6dcac1e2c">begin</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3156594e622924c094c45faa261dba5a"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::end" ref="3156594e622924c094c45faa261dba5a" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#3156594e622924c094c45faa261dba5a">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="5f94cdb3a743e8b57c70dcb1041cfdf9"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::begin" ref="5f94cdb3a743e8b57c70dcb1041cfdf9" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">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="9909c01ec91ef10908c5155d6350db2d"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::end" ref="9909c01ec91ef10908c5155d6350db2d" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">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="ab3f04b8d355b5d311e955d3bb63562c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::range" ref="ab3f04b8d355b5d311e955d3bb63562c" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#ab3f04b8d355b5d311e955d3bb63562c">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="48f5ab20db3c77faa7219deb28076e6c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::range" ref="48f5ab20db3c77faa7219deb28076e6c" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">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="e7be0d504ba71ae6c7479eb373a361ab"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::clear" ref="e7be0d504ba71ae6c7479eb373a361ab" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">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="a2f7ac9445823125ad1df2aaa06b5b92"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="a2f7ac9445823125ad1df2aaa06b5b92" 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="a00164.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8efb1e66e999d19e293964876da6414c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="8efb1e66e999d19e293964876da6414c" args="(const enumerable_thread_specific &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9b097f10dc5f035c73a0393b1820f4d"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::operator=" ref="a9b097f10dc5f035c73a0393b1820f4d" args="(const enumerable_thread_specific &other)" -->
+<a class="el" href="a00164.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f96ff60333760809cbf29850ed31cae3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::operator=" ref="f96ff60333760809cbf29850ed31cae3" 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="a00164.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8203013705240cba76052ec7b828aaa8"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::combine" ref="8203013705240cba76052ec7b828aaa8" 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="665463cc7bb56143d9cdbb35fc3616b0"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::combine_each" ref="665463cc7bb56143d9cdbb35fc3616b0" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html">scoped_lock</a></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">The scoped locking pattern. <a href="a00165.html#_details">More...</a><br></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>
-Mutex that allows recursive mutex acquisition.
+<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
+ class tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+
+The <a class="el" href="a00164.html">enumerable_thread_specific</a> container.
<p>
-Mutex that allows recursive mutex acquisition.
+<a class="el" href="a00164.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="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">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="a00164.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
<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">
+<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="a00164.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>
-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="a00363.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00353.html">enumerable_thread_specific.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00165.html b/doc/html/a00165.html
index 0922378..d7bac4c 100644
--- a/doc/html/a00165.html
+++ b/doc/html/a00165.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::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,54 +21,133 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00164.html">recursive_mutex</a>::<a class="el" href="a00165.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="a00267.html">tbb</a>::<a class="el" href="a00165.html">filter</a></div>
+<h1>tbb::filter Class Reference<br>
+<small>
+[<a class="el" href="a00274.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="a00363.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
<p>
-<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::filter:
+<p><center><img src="a00165.png" usemap="#tbb::filter_map" border="0" alt=""></center>
+<map name="tbb::filter_map">
+<area href="a00209.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
+</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="d82d4d36fbf9727a493d26ae50855fe7"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="d82d4d36fbf9727a493d26ae50855fe7" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</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="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00164.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="a00165.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00164.html">recursive_mutex</a> &<a class="el" href="a00150.html">mutex</a>)</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="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </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="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</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="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</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="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="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00164.html">recursive_mutex</a> &<a class="el" href="a00150.html">mutex</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">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</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="a00165.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00164.html">recursive_mutex</a> &<a class="el" href="a00150.html">mutex</a>)</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="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00164.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="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">release</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="a00165.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></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>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 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>
-The scoped locking pattern.
+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>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+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>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00363.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00409.html">pipeline.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00144.png b/doc/html/a00165.png
similarity index 100%
rename from doc/html/a00144.png
rename to doc/html/a00165.png
diff --git a/doc/html/a00166.html b/doc/html/a00166.html
index 79c379f..c74d628 100644
--- a/doc/html/a00166.html
+++ b/doc/html/a00166.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::interface5::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,89 +21,52 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00166.html">scalable_allocator</a></div>
-<h1>tbb::scalable_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00243.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="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00166.html">filter_t</a></div>
+<h1>tbb::interface5::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::filter_t" -->Class representing a chain of type-safe pipeline filters.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00364.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
<p>
-<a href="a00054.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00053.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="a00166.html">scalable_allocator</a> &) throw ()</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="a00166.html">scalable_allocator</a>< U > &) throw ()</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="e03acdfacd859b954ee45c41fad09992"></a><!-- doxytag: member="tbb::interface5::filter_t::filter_t" ref="e03acdfacd859b954ee45c41fad09992" args="(const filter_t< T, U > &rhs)" -->
+ </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00166.html">filter_t</a>< T, U > &rhs)</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="memTemplParams" nowrap colspan="2"><a class="anchor" name="08960002b559318d985ab1c90344ed06"></a><!-- doxytag: member="tbb::interface5::filter_t::filter_t" ref="08960002b559318d985ab1c90344ed06" 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="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="a00166.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="a022e50a3f46111e385d8859699d5b33"></a><!-- doxytag: member="tbb::interface5::filter_t::operator=" ref="a022e50a3f46111e385d8859699d5b33" args="(const filter_t< T, U > &rhs)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00166.html">filter_t</a>< T, U > &rhs)</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="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a> (pointer p, size_type)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9785b1fbc87683bcfe0383b117b41a69"></a><!-- doxytag: member="tbb::interface5::filter_t::clear" ref="9785b1fbc87683bcfe0383b117b41a69" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</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="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="a00166.html#880e766f1d913988c21973dbdd874fd5">max_size</a> () 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::interface5::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">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="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface5::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="a00166.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>make_filter</b> (tbb::filter::mode, const Body &)</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="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface5::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="a00166.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00166.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00166.html">filter_t</a>< V_, U_ > &)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::scalable_allocator< T ></h3>
+<h3>template<typename T, typename U><br>
+ class tbb::interface5::filter_t< T, U ></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.
+Class representing a chain of type-safe pipeline filters.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00364.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00409.html">pipeline.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00167.html b/doc/html/a00167.html
index 8522e82..a523e47 100644
--- a/doc/html/a00167.html
+++ b/doc/html/a00167.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::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,42 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00167.html">scalable_allocator< void ></a></div>
-<h1>tbb::scalable_allocator< void > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00167.html">final_scan_tag</a></div>
+<h1>tbb::final_scan_tag Struct Reference<br>
<small>
-[<a class="el" href="a00243.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="a00274.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="a00364.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00391.html">parallel_scan.h</a>></code>
<p>
-<a href="a00056.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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 Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2046816029c2c7856f7684aed2af9cff"></a><!-- doxytag: member="tbb::scalable_allocator< void >::pointer" ref="2046816029c2c7856f7684aed2af9cff" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591c568d23f8aadf6ea8d1dc939c4e75"></a><!-- doxytag: member="tbb::scalable_allocator< void >::const_pointer" ref="591c568d23f8aadf6ea8d1dc939c4e75" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="64dbab666af0740c30b77edac9f157ce"></a><!-- doxytag: member="tbb::scalable_allocator< void >::value_type" ref="64dbab666af0740c30b77edac9f157ce" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::scalable_allocator< void ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+Used to indicate that the final scan is being performed.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00364.html">scalable_allocator.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00391.html">parallel_scan.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00168.html b/doc/html/a00168.html
index cff0ef7..8b85fc9 100644
--- a/doc/html/a00168.html
+++ b/doc/html/a00168.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::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,41 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00168.html">simple_partitioner</a></div>
-<h1>tbb::simple_partitioner Class Reference<br>
-<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00168.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="a00355.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00040.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>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="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="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 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 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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A simple partitioner.
-<p>
-Divides the range until the range is not divisible.
+Exception for PPL locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00355.html">partitioner.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00169.html b/doc/html/a00169.html
index 1b2209a..7e94816 100644
--- a/doc/html/a00169.html
+++ b/doc/html/a00169.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::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,108 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00169.html">spin_mutex</a></div>
-<h1>tbb::spin_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00169.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="a00365.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00058.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="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</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">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="a00169.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="a00169.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="a00169.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7c93ca9e7ab656037a43984f24c051"></a><!-- doxytag: member="tbb::spin_mutex::is_rw_mutex" ref="5a7c93ca9e7ab656037a43984f24c051" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a967c455d0d80c9bbe030905201391b6"></a><!-- doxytag: member="tbb::spin_mutex::is_recursive_mutex" ref="a967c455d0d80c9bbe030905201391b6" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec12e4036073fb684b6d2d33493ed0aa"></a><!-- doxytag: member="tbb::spin_mutex::is_fair_mutex" ref="ec12e4036073fb684b6d2d33493ed0aa" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
-
-<tr><td 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="a00170.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00170.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="a00169.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 <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">
-
-<p>
-Try acquiring lock (non-blocking).
+Exception for repeated scheduling of the same task_handle.
<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="a00365.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00170.html b/doc/html/a00170.html
index c2075d3..9122906 100644
--- a/doc/html/a00170.html
+++ b/doc/html/a00170.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::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,74 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00169.html">spin_mutex</a>::<a class="el" href="a00170.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="a00267.html">tbb</a>::<a class="el" href="a00170.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="a00365.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00059.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="29ae680ae7f5e685c2e15535b9c855b3"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="29ae680ae7f5e685c2e15535b9c855b3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</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="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00169.html">spin_mutex</a> &m)</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="a00170.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00169.html">spin_mutex</a> &m)</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="a00170.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00169.html">spin_mutex</a> &m)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#9297ec188534b45dc0ca48f2f39a0501"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eeb615e68e963e6bf8d9c11402d0ce8e"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::release" ref="eeb615e68e963e6bf8d9c11402d0ce8e" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy lock. If holding a lock, releases the lock first. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ee2a2cdaf6a2128849e7d7723d9174f"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::spin_mutex" ref="6ee2a2cdaf6a2128849e7d7723d9174f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>spin_mutex</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe3f8527f9013266dc845a4ff22dd2cf"></a><!-- doxytag: member="tbb::missing_wait::what" ref="fe3f8527f9013266dc845a4ff22dd2cf" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-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="a00169.html">spin_mutex</a> & </td>
- <td class="paramname"> <em>m</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring lock (non-blocking).
+Exception for missing wait on structured_task_group.
<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="a00365.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00171.html b/doc/html/a00171.html
index 9116dee..ca54bca 100644
--- a/doc/html/a00171.html
+++ b/doc/html/a00171.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::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,110 +21,148 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00171.html">spin_rw_mutex_v3</a></div>
-<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
-<small>
-[<a class="el" href="a00244.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="a00267.html">tbb</a>::<a class="el" href="a00171.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="a00366.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00060.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="a00171.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
+<map name="tbb::movable_exception< ExceptionData >_map">
+<area href="a00206.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
+</map>
+<a href="a00100.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00171.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</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 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="a00171.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</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="a00171.html">movable_exception</a> &src) throw ()</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="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">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="a00171.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00171.html">movable_exception</a> &src)</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="a00171.html#088bb256be794cc47d3b83791632fdfc">try_lock</a> ()</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">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="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a> ()</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">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="a00171.html#13f799708ac4ca437a16be202e263e18">lock_read</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="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw ()</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="a00171.html#b8667415869013f840d976aa406d385a">try_lock_read</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="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw ()</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="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00171.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="681a816fe76d6ca7752303f9dcc3c4b2"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_recursive_mutex" ref="681a816fe76d6ca7752303f9dcc3c4b2" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00171.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw ()</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="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00171.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="a00171.html#17cffba35811c92b7e65d63506b69602">throw_self</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="a00172.html">scoped_lock</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="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00172.html#_details">More...</a><br></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>
-Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
+<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="a00206.html">tbb::tbb_exception</a> </dd></dl>
+
<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="()" -->
+<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="a00171.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="a00171.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="a00206.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">bool tbb::spin_rw_mutex_v3::try_lock </td>
+ <td class="memname"><a class="el" href="a00171.html">movable_exception</a>* <a class="el" href="a00171.html">tbb::movable_exception</a>< ExceptionData >::move </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>
-Try acquiring writer lock (non-blocking).
+Creates and returns pointer to the deep copy of this exception object.
<p>
-Return true if lock acquired; false otherwise.
+Move semantics is allowed.
+<p>
+Implements <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
</div>
</div><p>
-<a class="anchor" name="b8667415869013f840d976aa406d385a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock_read" ref="b8667415869013f840d976aa406d385a" args="()" -->
+<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::spin_rw_mutex_v3::try_lock_read </td>
+ <td class="memname">void <a class="el" href="a00171.html">tbb::movable_exception</a>< ExceptionData >::throw_self </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>
-Try acquiring reader lock (non-blocking).
+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>
-Return true if reader lock acquired; false otherwise.
+Implements <a class="el" href="a00206.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="a00366.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00149.png b/doc/html/a00171.png
similarity index 100%
rename from doc/html/a00149.png
rename to doc/html/a00171.png
diff --git a/doc/html/a00172.html b/doc/html/a00172.html
index b4c98ba..65621cf 100644
--- a/doc/html/a00172.html
+++ b/doc/html/a00172.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::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,110 +21,93 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00171.html">spin_rw_mutex_v3</a>::<a class="el" href="a00172.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="a00267.html">tbb</a>::<a class="el" href="a00172.html">mutex</a></div>
+<h1>tbb::mutex Class Reference<br>
+<small>
+[<a class="el" href="a00277.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="a00366.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00362.html">mutex.h</a>></code>
<p>
-<a href="a00061.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00034.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="a00172.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00172.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="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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00171.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd"></a><!-- doxytag: member="tbb::mutex::DESTROYED" ref="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>DESTROYED</b> = 0x789A</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <a href="#42a92d4f8fdde425b111cfa8a9228071"></a><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="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</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="a00172.html#05313cb77d4f85213103d4dab74ed454">mutex</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b646ec5be02a127d159bbb7ca65353"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::acquire" ref="b0b646ec5be02a127d159bbb7ca65353" args="(spin_rw_mutex &m, bool write=true)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00171.html">spin_rw_mutex</a> &m, bool write=true)</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="a00172.html#4470e61c24c129a0299ca6c17240adbb">lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#3f0b1e3f2efab63336400348bd070226"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61b14d00a78185c9b2d206ebfc379124"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::release" ref="61b14d00a78185c9b2d206ebfc379124" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">release</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="a00172.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="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="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</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="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</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="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00171.html">spin_rw_mutex</a> &m, bool write=true)</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="a00172.html#795649a185b0d6af6dc81c5f378616dd">set_state</a> (state_t to)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="d6ea60dee5563f702379bf5e51aa8806"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="d6ea60dee5563f702379bf5e51aa8806" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<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>
-<p>
-Construct lock that has not acquired a mutex.
-<p>
-Equivalent to zero-initialization of *this.
-</div>
-</div><p>
-<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)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00171.html">spin_rw_mutex</a> & </td>
- <td class="paramname"> <em>m</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">bool </td>
- <td class="paramname"> <em>write</em> = <code>true</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">
+<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="a00173.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00173.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>
-Acquire lock on given mutex.
+For testing purposes only.
<p>
-Upon entry, *this should not be in the "have acquired a mutex" state.
-</div>
-</div><p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="3f0b1e3f2efab63336400348bd070226"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer" ref="3f0b1e3f2efab63336400348bd070226" args="()" -->
+<a class="anchor" name="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::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer </td>
+ <td class="memname">bool tbb::mutex::try_lock </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -135,16 +118,16 @@ Upon entry, *this should not be in the "have acquired a mutex" state.
<div class="memdoc">
<p>
-Upgrade reader to become a writer.
+Try acquiring lock (non-blocking).
<p>
-Returns true if the upgrade happened without re-acquiring the lock and false if opposite
+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="a00366.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00362.html">mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00173.html b/doc/html/a00173.html
index 7d632d9..609542c 100644
--- a/doc/html/a00173.html
+++ b/doc/html/a00173.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::mutex::scoped_lock Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,28 +21,54 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00173.html">split</a></div>
-<h1>tbb::split Class Reference<br>
-<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00172.html">mutex</a>::<a class="el" href="a00173.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="a00398.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00362.html">mutex.h</a>></code>
<p>
-<table border="0" cellpadding="0" cellspacing="0">
+<a href="a00035.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public 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="a00173.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="605a6b9af0f8cdabdf81825e0de99600"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="605a6b9af0f8cdabdf81825e0de99600" args="(mutex &mutex)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00173.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00172.html">mutex</a> &<a class="el" href="a00172.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="a00173.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="a00173.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00172.html">mutex</a> &<a class="el" href="a00172.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="a00173.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00172.html">mutex</a> &<a class="el" href="a00172.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="a00173.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>
+
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Dummy type that distinguishes splitting constructor from copy constructor.
+The scoped locking pattern.
<p>
-See description of parallel_for and parallel_reduce for example usages.
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00398.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00362.html">mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00174.html b/doc/html/a00174.html
index e294cf8..1f51cb6 100644
--- a/doc/html/a00174.html
+++ b/doc/html/a00174.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::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,584 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00174.html">task</a></div>
-<h1>tbb::task Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00174.html">null_mutex</a></div>
+<h1>tbb::null_mutex Class Reference<br>
<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.
+[<a class="el" href="a00277.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="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00364.html">null_mutex.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::task:
-<p><center><img src="a00174.png" usemap="#tbb::task_map" border="0" alt=""></center>
-<map name="tbb::task_map">
-<area href="a00142.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
-</map>
-<a href="a00064.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">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</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">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="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</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">task is running, and will be destroyed after method <a class="el" href="a00174.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="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</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">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="a00174.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="a00174.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="a00174.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="a00174.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="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
- <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
-<br>
- <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a class="el" href="a00174.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="a00174.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="a00174.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="a00174.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00174.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="a00174.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">internal::allocate_additional_child_of_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">allocate_additional_child_of</a> (<a class="el" href="a00174.html">task</a> &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Like allocate_child, except that task's parent becomes "t", not this. <a href="#43bfe64c0e9333c0ca895cc0c375512b"></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="a00174.html#a57def00c8e9d932dbea0b3ee23991b9">destroy</a> (<a class="el" href="a00174.html">task</a> &victim)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy a task. <a href="#a57def00c8e9d932dbea0b3ee23991b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00174.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="a00174.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00174.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="a00174.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="a00174.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="a00174.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="a00174.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically increment reference count. <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="a00174.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically decrement reference count. <a href="#ef4680f5c148020c5e7e43ddef44cd5d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#f7737143d458f1ed1c0d7da3971d9e6b">spawn</a> (<a class="el" href="a00174.html">task</a> &child)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule task for execution when a worker becomes available. <a href="#f7737143d458f1ed1c0d7da3971d9e6b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db841c647eb6d754440c2f4e4a73c80b"></a><!-- doxytag: member="tbb::task::spawn" ref="db841c647eb6d754440c2f4e4a73c80b" args="(task_list &list)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">spawn</a> (<a class="el" href="a00176.html">task_list</a> &list)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn multiple tasks and clear list. <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="a00174.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00174.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="a00174.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00176.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="a00174.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="a00174.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task on whose behalf this task is working, or NULL if this is a root. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
-<a class="el" href="a00175.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Shared context that is used to communicate asynchronous state changes. <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="a00174.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if task is owned by different thread than thread that owns its parent. <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="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00174.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="a00174.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="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00174.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="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00174.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00174.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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00174.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context received cancellation request. <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="a00174.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="a00174.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00175.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">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00174.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. <a href="#ce8ce689c26a4ddf343829bc3c73290a"></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="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00176.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"><a class="anchor" name="bd43e8d6249738efafd12d6a4c72c5e3"></a><!-- doxytag: member="tbb::task::self" ref="bd43e8d6249738efafd12d6a4c72c5e3" args="()" -->
-static <a class="el" href="a00174.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00174.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="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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc65e26bdbb61f5e5a3d7ac92948bbd1"></a><!-- doxytag: member="tbb::task::internal::task_group_base" ref="bc65e26bdbb61f5e5a3d7ac92948bbd1" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::task_group_base</b></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00175.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00175.html#_details">More...</a><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="a00174.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="a00174.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enumeration of task states that the scheduler considers.
-<p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><!-- doxytag: member="executing" ref="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9" args="" -->executing</em> </td><td>
-task is running, and will be destroyed after method <a class="el" href="a00174.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="43bfe64c0e9333c0ca895cc0c375512b"></a><!-- doxytag: member="tbb::task::allocate_additional_child_of" ref="43bfe64c0e9333c0ca895cc0c375512b" args="(task &t)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">internal::allocate_additional_child_of_proxy tbb::task::allocate_additional_child_of </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00174.html">task</a> & </td>
- <td class="paramname"> <em>t</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Like allocate_child, except that task's parent becomes "t", not this.
-<p>
-Typically used in conjunction with schedule_to_reexecute to implement while loops. Atomically increments the reference count of t.parent()
-</div>
-</div><p>
-<a class="anchor" name="1434c79a5138993269d034008bff7329"></a><!-- doxytag: member="tbb::task::allocate_continuation" ref="1434c79a5138993269d034008bff7329" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">internal::allocate_continuation_proxy& tbb::task::allocate_continuation </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns proxy for overloaded new that allocates a continuation task of *this.
-<p>
-The continuation's parent becomes the parent of *this.
-</div>
-</div><p>
-<a class="anchor" name="0f3fb4aac549ab642022450a4bd13326"></a><!-- doxytag: member="tbb::task::cancel_group_execution" ref="0f3fb4aac549ab642022450a4bd13326" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::task::cancel_group_execution </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
-<p>
-<dl compact><dt><b>Returns:</b></dt><dd>false if cancellation has already been requested, true otherwise. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="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.
-<p>
-Has release semanics.
-</div>
-</div><p>
-<a class="anchor" name="a57def00c8e9d932dbea0b3ee23991b9"></a><!-- doxytag: member="tbb::task::destroy" ref="a57def00c8e9d932dbea0b3ee23991b9" args="(task &victim)" -->
-<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="a00174.html">task</a> & </td>
- <td class="paramname"> <em>victim</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="a00174.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="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.
-<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="a00174.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="a00174.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="a00174.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00174.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.
-</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="a00174.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
-<p>
-Requires that this.execute() be running.
-</div>
-</div><p>
-<a class="anchor" name="f7737143d458f1ed1c0d7da3971d9e6b"></a><!-- doxytag: member="tbb::task::spawn" ref="f7737143d458f1ed1c0d7da3971d9e6b" args="(task &child)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::spawn </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00174.html">task</a> & </td>
- <td class="paramname"> <em>child</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Schedule task for execution when a worker becomes available.
-<p>
-After all children spawned so far finish their method <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">task::execute</a>, their parent's method <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">task::execute</a> may start running. Therefore, it is important to ensure that at least one child has not completed until the parent is ready to run.
-</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="a00176.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="ce8ce689c26a4ddf343829bc3c73290a"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="ce8ce689c26a4ddf343829bc3c73290a" args="(task &root)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static void tbb::task::spawn_root_and_wait </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00174.html">task</a> & </td>
- <td class="paramname"> <em>root</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
-<p>
-The thread that calls spawn_root_and_wait must be the same thread that allocated the task.
-</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">
-
+A mutex which does nothing.
<p>
-Wait for reference count to become one, and set reference count to zero.
+A <a class="el" href="a00174.html">null_mutex</a> does no operation and simulates success.
<p>
-Works on tasks while waiting.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00364.html">null_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00175.html b/doc/html/a00175.html
index d0ff309..03906e3 100644
--- a/doc/html/a00175.html
+++ b/doc/html/a00175.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::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,212 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00175.html">task_group_context</a></div>
-<h1>tbb::task_group_context Class Reference<br>
-<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_group_context" -->Used to form groups of tasks.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00174.html">null_mutex</a>::<a class="el" href="a00175.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="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00364.html">null_mutex.h</a>></code>
<p>
-<a href="a00062.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00037.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="b8dce4661b346756cb4f584529ecd0ebad65d11fe6fab6ecbb356464170f6a38"></a><!-- doxytag: member="tbb::task_group_context::no_cancellation" ref="b8dce4661b346756cb4f584529ecd0ebad65d11fe6fab6ecbb356464170f6a38" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>no_cancellation</b> = 0x0002ul << 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>no_cancellation</b> = 0x0002ul << 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="a00175.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="a00175.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a> ()</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="a00175.html#8bcdfdf4e6bfb76125b6de15c00b571d">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="#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="a00175.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () const </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="a00174.html">null_mutex</a> &)</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="a00175.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6889f00ca3946906e89e856988bb890"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::acquire" ref="f6889f00ca3946906e89e856988bb890" args="(null_mutex &)" -->
+void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00174.html">null_mutex</a> &)</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 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="a00175.html#49a55352084fd44b8863d182e839e6dc">init</a> ()</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="a00174.html">null_mutex</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="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="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>
</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="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root()</a> method. See <a class="el" href="a00175.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="a00175.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.<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="a00175.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 whenever new fields are introduced in the currently unused padding areas or the meaning of the existing fields is changed or extended.
-</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">
-
-<p>
-Forcefully reinitializes the context after the task tree it was associated with is completed.
+Represents acquisition of a mutex.
<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="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00364.html">null_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00176.html b/doc/html/a00176.html
index d61e484..886e5c3 100644
--- a/doc/html/a00176.html
+++ b/doc/html/a00176.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::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,57 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00176.html">task_list</a></div>
-<h1>tbb::task_list Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00176.html">null_rw_mutex</a></div>
+<h1>tbb::null_rw_mutex Class Reference<br>
<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
+[<a class="el" href="a00277.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="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00365.html">null_rw_mutex.h</a>></code>
<p>
-<a href="a00066.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00038.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public 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="a00176.html#416341c2047eaef50417b41eaf7e9de6">task_list</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 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="a00176.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</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">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="a00176.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </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">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="a00176.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00174.html">task</a> &<a class="el" href="a00174.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="a00174.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.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="a00176.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 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="a00177.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00177.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A list of children.
+A rw mutex which does nothing.
<p>
-Used for method task::spawn_children
+A <a class="el" href="a00176.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="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00365.html">null_rw_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00177.html b/doc/html/a00177.html
index c4cef68..76cbb7e 100644
--- a/doc/html/a00177.html
+++ b/doc/html/a00177.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::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,141 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00177.html">task_scheduler_init</a></div>
-<h1>tbb::task_scheduler_init Class Reference<br>
-<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class representing reference to tbb scheduler.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00176.html">null_rw_mutex</a>::<a class="el" href="a00177.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="a00383.html">task_scheduler_init.h</a>></code>
+<code>#include <<a class="el" href="a00365.html">null_rw_mutex.h</a>></code>
<p>
-<a href="a00073.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00177.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e11281a13a7b6243c6c9ab243c5ad5a8"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::scoped_lock" ref="e11281a13a7b6243c6c9ab243c5ad5a8" args="(null_rw_mutex &, bool=true)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00176.html">null_rw_mutex</a> &, bool=true)</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="a00177.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"><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="a00176.html">null_rw_mutex</a> &, bool=true)</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="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa1e2a5592ee2672470ea44d98f1c498"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::upgrade_to_writer" ref="fa1e2a5592ee2672470ea44d98f1c498" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00177.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="efcb7948649e1652d59aaff9c8ea40f1"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::downgrade_to_reader" ref="efcb7948649e1652d59aaff9c8ea40f1" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>downgrade_to_reader</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Shorthand for default constructor followed by call to intialize(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="a00177.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="56686c4dfe4a32a1d9bd8e7e729130e6"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::try_acquire" ref="56686c4dfe4a32a1d9bd8e7e729130e6" args="(null_rw_mutex &, bool=true)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00176.html">null_rw_mutex</a> &, bool=true)</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="a00177.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6146c803a4ad2f14263fdc019a72b5a9"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::release" ref="6146c803a4ad2f14263fdc019a72b5a9" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
-<tr><td class="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="a00177.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="a00177.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="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00177.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 representing reference to tbb scheduler.
-<p>
-A thread must construct a <a class="el" href="a00177.html">task_scheduler_init</a>, and keep it alive, during the time that it uses the services of class task.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ba00714c33a41a3c2216f48613971cab"></a><!-- doxytag: member="tbb::task_scheduler_init::default_num_threads" ref="ba00714c33a41a3c2216f48613971cab" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static int __TBB_EXPORTED_FUNC tbb::task_scheduler_init::default_num_threads </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the number of threads tbb scheduler would create if initialized by default.
-<p>
-Result returned by this method does not depend on whether the scheduler has already been initialized.<p>
-Because tbb 2.0 does not support blocking tasks yet, you may use this method to boost the number of threads in the tbb's internal pool, if your tasks are doing I/O operations. The optimal number of additional threads depends on how much time your tasks spend in the blocked state.
-</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="a00177.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.
+Represents acquisition of a mutex.
<p>
-A value of -1 lets tbb decide on the number of threads, which is typically the number of hardware threads. For production code, the default value of -1 should be used, particularly if the client code is mixed with third party clients that might also use tbb.<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="a00383.html">task_scheduler_init.h</a></ul>
+<li><a class="el" href="a00365.html">null_rw_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00178.html b/doc/html/a00178.html
index 98b9c07..4ce4ca1 100644
--- a/doc/html/a00178.html
+++ b/doc/html/a00178.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::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,107 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00178.html">tbb_allocator</a></div>
-<h1>tbb::tbb_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00243.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="a00267.html">tbb</a>::<a class="el" href="a00178.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="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00366.html">parallel_do.h</a>></code>
<p>
-<a href="a00075.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00040.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3cdd9619bc0a802763e7823068f83a4c"></a><!-- doxytag: member="tbb::tbb_allocator::value_type" ref="3cdd9619bc0a802763e7823068f83a4c" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f979d0e74d7c6e5aeb0d26408776a9e1"></a><!-- doxytag: member="tbb::tbb_allocator::pointer" ref="f979d0e74d7c6e5aeb0d26408776a9e1" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1622504886ef265016a5821d61bf7adc"></a><!-- doxytag: member="tbb::tbb_allocator::const_pointer" ref="1622504886ef265016a5821d61bf7adc" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8e58d23c5c98fd65d4432c1e324f4c0"></a><!-- doxytag: member="tbb::tbb_allocator::reference" ref="b8e58d23c5c98fd65d4432c1e324f4c0" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="532f36f99650b1c26a2b8899383c5411"></a><!-- doxytag: member="tbb::tbb_allocator::const_reference" ref="532f36f99650b1c26a2b8899383c5411" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="639df0fb169cfcb94ba1b12429b736f4"></a><!-- doxytag: member="tbb::tbb_allocator::size_type" ref="639df0fb169cfcb94ba1b12429b736f4" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54828b5d0b937d608f76650a5df0e39f"></a><!-- doxytag: member="tbb::tbb_allocator::difference_type" ref="54828b5d0b937d608f76650a5df0e39f" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544d524c717485b74aa552fb45b45562cb5"></a><!-- doxytag: member="tbb::tbb_allocator::scalable" ref="09a7f81fb2c3055aaecf058b11538544d524c717485b74aa552fb45b45562cb5" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>scalable</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf"></a><!-- doxytag: member="tbb::tbb_allocator::standard" ref="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>standard</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.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="a00178.html">tbb_allocator</a> &) throw ()</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="a00178.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</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="a00178.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>
-
-<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="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="a00178.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="a00178.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="a00178.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="a00178.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="a00178.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="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.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>
-<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<typename T><br>
- class tbb::tbb_allocator< T ></h3>
+<h3>template<typename Item><br>
+ class tbb::parallel_do_feeder< Item ></h3>
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+Class the user supplied algorithm body uses to add new tasks.
<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.
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>Item</em> </td><td>Work item type </td></tr>
+ </table>
+</dl>
+
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00366.html">parallel_do.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00179.html b/doc/html/a00179.html
index 9adfef7..df29520 100644
--- a/doc/html/a00179.html
+++ b/doc/html/a00179.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::parallel_while< Body > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,117 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00179.html">tbb_allocator< void ></a></div>
-<h1>tbb::tbb_allocator< void > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00179.html">parallel_while</a></div>
+<h1>tbb::parallel_while< Body > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.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="a00274.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="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00400.html">parallel_while.h</a>></code>
<p>
-<a href="a00077.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="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 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="a00179.html#fa297e53d3af2a101e712bc200233e9c">value_type</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">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="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</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">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="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</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">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="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</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="a00179.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00179.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<><br>
- class tbb::tbb_allocator< void ></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="a00179.html">tbb::parallel_while</a>< Body >::add </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00179.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">
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<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="a00179.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="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00400.html">parallel_while.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00180.html b/doc/html/a00180.html
index 5787a8d..2dab623 100644
--- a/doc/html/a00180.html
+++ b/doc/html/a00180.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::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,145 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00180.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="a00267.html">tbb</a>::<a class="el" href="a00180.html">pipeline</a></div>
+<h1>tbb::pipeline Class Reference<br>
+<small>
+[<a class="el" href="a00274.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeling that applies filters to items.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00180.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
-<map name="tbb::tbb_exception_map">
-<area href="a00132.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00149.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
-</map>
-<a href="a00087.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00051.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00180.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</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="a00180.html#596dc3beba27099c4c8581cb419e1a59">pipeline</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="a00180.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0 throw ()</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="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00180.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="a00180.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</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="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00165.html">filter</a> &filter_)</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="a00180.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</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="a00180.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</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="a00180.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</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="a00180.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00180.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="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</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="a00180.html#2c84aef5b834b555ee220b176e25931e">clear</a> ()</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="a00180.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="a00175.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="a00132.html">tbb::captured_exception</a> and template class <a class="el" href="a00149.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" -->
-<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>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<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>
-<p>
-Destroys objects created by the <a class="el" href="a00180.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="a00132.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00149.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" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual <a class="el" href="a00180.html">tbb_exception</a>* tbb::tbb_exception::move </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [pure virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<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>
-<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implemented in <a class="el" href="a00132.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
-</div>
-</div><p>
-<a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *p)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::tbb_exception::operator delete </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>p</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c991e50853b0cac7da039550344d3ef"></a><!-- doxytag: member="tbb::pipeline::filter" ref="4c991e50853b0cac7da039550344d3ef" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>filter</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::pipeline::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9d033d41ff53a0ae6ef824aceee7ecbc"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_cleaner" ref="9d033d41ff53a0ae6ef824aceee7ecbc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_cleaner</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="589421589ec2788c2c39c0bc6272a09a"></a><!-- doxytag: member="tbb::pipeline::tbb::interface5::internal::pipeline_proxy" ref="589421589ec2788c2c39c0bc6272a09a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>tbb::interface5::internal::pipeline_proxy</b></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+A processing pipeling that applies filters to items.
<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="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00180.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" -->
+<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 void tbb::tbb_exception::throw_self </td>
+ <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"><code> [pure virtual]</code></td>
+ <td width="100%"><code> [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>
-Implemented in <a class="el" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00149.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+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="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00409.html">pipeline.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00181.html b/doc/html/a00181.html
index 6403aca..a5bbd5e 100644
--- a/doc/html/a00181.html
+++ b/doc/html/a00181.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::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,66 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<b>internal</b>::<a class="el" href="a00181.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="a00267.html">tbb</a>::<a class="el" href="a00181.html">pre_scan_tag</a></div>
+<h1>tbb::pre_scan_tag Struct Reference<br>
+<small>
+[<a class="el" href="a00274.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="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00391.html">parallel_scan.h</a>></code>
<p>
-<a href="a00090.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 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="a00181.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="a00181.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="a00181.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="a00181.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00180.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="a00181.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00181.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00132.html">captured_exception</a> &src)</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="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">
-
-<p>
-Destroys this objects.
+Used to indicate that the initial scan is being performed.
<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="a00393.html">tbb_exception.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00391.html">parallel_scan.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00182.html b/doc/html/a00182.html
index 1a02640..1446339 100644
--- a/doc/html/a00182.html
+++ b/doc/html/a00182.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::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,100 +21,52 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00182.html">thread_bound_filter</a></div>
-<h1>tbb::thread_bound_filter Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00182.html">queuing_mutex</a></div>
+<h1>tbb::queuing_mutex Class Reference<br>
<small>
-[<a class="el" href="a00241.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="a00277.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="a00360.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00420.html">queuing_mutex.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00182.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
-<map name="tbb::thread_bound_filter_map">
-<area href="a00144.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
-</map>
-<a href="a00046.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="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 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="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</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">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="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 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">enum </td><td class="memItemRight" valign="bottom"><b>result_type</b> { <b>success</b>,
-<b>item_not_available</b>,
-<b>end_of_stream</b>
- }</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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 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="a00182.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55d5339e4ca04b759f90c0c1ef966539"></a><!-- doxytag: member="tbb::queuing_mutex::is_fair_mutex" ref="55d5339e4ca04b759f90c0c1ef966539" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00182.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</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::queuing_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">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> (<a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> filter_mode)</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="a00183.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00183.html#_details">More...</a><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">
-
-<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.
+Queuing lock with local-only spinning.
<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="a00360.html">pipeline.h</a></ul>
+<li><a class="el" href="a00420.html">queuing_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00183.html b/doc/html/a00183.html
index 3918fc0..e014c8b 100644
--- a/doc/html/a00183.html
+++ b/doc/html/a00183.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::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,45 +21,71 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00183.html">tick_count</a></div>
-<h1>tbb::tick_count Class Reference<br>
-<small>
-[<a class="el" href="a00245.html">Timing</a>]</small>
-</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00182.html">queuing_mutex</a>::<a class="el" href="a00183.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="a00413.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00420.html">queuing_mutex.h</a>></code>
<p>
-<a href="a00101.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00055.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public 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="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</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="a00183.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</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="a00183.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00182.html">queuing_mutex</a> &m)</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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00183.html">tick_count</a> &t1, const <a class="el" href="a00183.html">tick_count</a> &t0)</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="a00183.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a> ()</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="a00184.html">interval_t</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="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="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00182.html">queuing_mutex</a> &m)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00184.html#_details">More...</a><br></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="a00183.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00182.html">queuing_mutex</a> &m)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bf2b8c87ff22115be9b2eac179f2d30"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::release" ref="3bf2b8c87ff22115be9b2eac179f2d30" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</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>
-Absolute timestamp.
+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">
+
+<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="a00413.html">tick_count.h</a></ul>
+<li><a class="el" href="a00420.html">queuing_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00184.html b/doc/html/a00184.html
index f4eec8a..d680ca5 100644
--- a/doc/html/a00184.html
+++ b/doc/html/a00184.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::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,60 +21,58 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00183.html">tick_count</a>::<a class="el" href="a00184.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="a00267.html">tbb</a>::<a class="el" href="a00184.html">queuing_rw_mutex</a></div>
+<h1>tbb::queuing_rw_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00277.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="a00413.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00421.html">queuing_rw_mutex.h</a>></code>
<p>
-<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00056.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public 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="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</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="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</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="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</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="a00184.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a> ()</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="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb88522d145ad7bcf5bebfa7d2a6122b"></a><!-- doxytag: member="tbb::queuing_rw_mutex::internal_construct" ref="eb88522d145ad7bcf5bebfa7d2a6122b" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="a00184.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00184.html">interval_t</a> &i)</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="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="a00184.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00184.html">interval_t</a> &i)</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="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="a00184.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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00183.html">tick_count</a> &t1, const <a class="el" href="a00183.html">tick_count</a> &t0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="147b34120505e419f6ea8d631ec4375d"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_fair_mutex" ref="147b34120505e419f6ea8d631ec4375d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-<tr><td class="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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00184.html">interval_t</a> &i, const <a class="el" href="a00184.html">interval_t</a> &j)</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 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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00184.html">interval_t</a> &i, const <a class="el" href="a00184.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"><a class="el" href="a00185.html">scoped_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00185.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Relative time interval.
+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>
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00413.html">tick_count.h</a></ul>
+<li><a class="el" href="a00421.html">queuing_rw_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00185.html b/doc/html/a00185.html
index 8778d50..ebc2b22 100644
--- a/doc/html/a00185.html
+++ b/doc/html/a00185.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::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,32 +21,100 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<b>internal</b>::<a class="el" href="a00185.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="a00267.html">tbb</a>::<a class="el" href="a00184.html">queuing_rw_mutex</a>::<a class="el" href="a00185.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="a00394.html">tbb_machine.h</a>></code>
+<code>#include <<a class="el" href="a00421.html">queuing_rw_mutex.h</a>></code>
<p>
-<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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>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 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="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</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="a00185.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00184.html">queuing_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="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="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">~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="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="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00184.html">queuing_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="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="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00184.html">queuing_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 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="a00185.html#67ae221109ddc69510ab593874e435d4">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer. <a href="#11ba1da4a722c9e6f73339a52c487e82"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2f93edf7b15ec4bcee138823220c52"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::downgrade_to_reader" ref="0d2f93edf7b15ec4bcee138823220c52" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00185.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>
-<h3>template<size_t Size, typename T><br>
- struct tbb::internal::work_around_alignment_bug< Size, T ></h3>
+The scoped locking pattern.
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="c62e365be7bcbba091c9ea7454a4d22c"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="c62e365be7bcbba091c9ea7454a4d22c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct lock that has not acquired a mutex.
+<p>
+Equivalent to zero-initialization of *this.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="11ba1da4a722c9e6f73339a52c487e82"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer" ref="11ba1da4a722c9e6f73339a52c487e82" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-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).
+Upgrade reader to become a writer.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00394.html">tbb_machine.h</a></ul>
+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="a00421.html">queuing_rw_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00186.html b/doc/html/a00186.html
index 9a16676..9fb13cd 100644
--- a/doc/html/a00186.html
+++ b/doc/html/a00186.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::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,70 +21,198 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00186.html">zero_allocator</a></div>
-<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00186.html">reader_writer_lock</a></div>
+<h1>tbb::interface5::reader_writer_lock Class Reference<br>
<small>
-[<a class="el" href="a00243.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="a00277.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="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00422.html">reader_writer_lock.h</a>></code>
<p>
-<a href="a00079.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="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="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="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="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="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="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="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="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"><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">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { <b>waiting_nonblocking</b>,
+<b>waiting</b>,
+<b>active</b>,
+<b>invalid</b>
+ }</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31f0de5db53e4c219e8548078572e1ff"></a><!-- doxytag: member="tbb::zero_allocator::const_reference" ref="31f0de5db53e4c219e8548078572e1ff" args="" -->
-typedef base_allocator_type::const_reference </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Status type for nodes associated with lock instances. <a href="a00186.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="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_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">Constructs a new <a class="el" href="a00186.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="a00186.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</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">Destructs a <a class="el" href="a00186.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="a00186.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="a00186.html">zero_allocator</a> &a) throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00186.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="a00186.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00186.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="a00186.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00186.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="a00186.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00186.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="a00186.html#5113b32689305599b2c36b5831547704">unlock</a> ()</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="a00186.html">zero_allocator</a>< U > &a) throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00186.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="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"><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">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="a00187.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks. <a href="a00187.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00188.html">scoped_lock_read</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks. <a href="a00188.html#_details">More...</a><br></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>
+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="a00186.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="a00187.html">scoped_lock</a> status:<p>
+waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
+State diagram for <a class="el" href="a00188.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="a00186.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="a00168.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00186.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="a00186.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="a00168.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00186.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="a00186.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="a00186.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">
-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.
+Tries to acquire the <a class="el" href="a00186.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="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00422.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00187.html b/doc/html/a00187.html
index 2211a27..afe7630 100644
--- a/doc/html/a00187.html
+++ b/doc/html/a00187.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::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,45 +21,44 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00187.html">zero_allocator< void, Allocator ></a></div>
-<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
-<small>
-[<a class="el" href="a00243.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="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00186.html">reader_writer_lock</a>::<a class="el" href="a00187.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="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00422.html">reader_writer_lock.h</a>></code>
<p>
-<a href="a00081.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00059.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="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="a00187.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00186.html">reader_writer_lock</a> &lock)</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 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="a00187.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</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, releases the write lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aea1cb0e88be9874f0f72e52063d0b90"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator new" ref="aea1cb0e88be9874f0f72e52063d0b90" args="(size_t s)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db804a05fcd37f7e81b94752e45039f7"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator delete" ref="db804a05fcd37f7e81b94752e45039f7" args="(void *p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td colspan="2"><br><h2>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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<template< typename T > class Allocator><br>
- class tbb::zero_allocator< void, Allocator ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+The scoped lock pattern for write locks.
+<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.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00422.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00188.html b/doc/html/a00188.html
new file mode 100644
index 0000000..3c6a02f
--- /dev/null
+++ b/doc/html/a00188.html
@@ -0,0 +1,65 @@
+<!DOCTYPE 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>
+<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="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00186.html">reader_writer_lock</a>::<a class="el" href="a00188.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="a00422.html">reader_writer_lock.h</a>></code>
+<p>
+<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 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="a00188.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00186.html">reader_writer_lock</a> &lock)</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="a00188.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</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="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 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>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+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="a00422.html">reader_writer_lock.h</a></ul>
+<hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00164.html b/doc/html/a00189.html
similarity index 72%
copy from doc/html/a00164.html
copy to doc/html/a00189.html
index ad8ebb4..34805fe 100644
--- a/doc/html/a00164.html
+++ b/doc/html/a00189.html
@@ -21,33 +21,44 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00164.html">recursive_mutex</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00189.html">recursive_mutex</a></div>
<h1>tbb::recursive_mutex Class Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
+[<a class="el" href="a00277.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="a00363.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00423.html">recursive_mutex.h</a>></code>
<p>
-<a href="a00052.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="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="a00189.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="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00164.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00189.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="a00164.html#4c342c69d47f4bb0b393535dee4015d6">lock</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.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="a00164.html#86e719b0afee25704af11ab97694d240">try_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.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="a00164.html#f0a96e26b7f074588dc31e32524856ae">unlock</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.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="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
+
<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="718cc53f6b33d8c396ccca0e4ebc5606"></a><!-- doxytag: member="tbb::recursive_mutex::is_rw_mutex" ref="718cc53f6b33d8c396ccca0e4ebc5606" args="" -->
static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
@@ -63,9 +74,9 @@ static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_
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="a00165.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.html">scoped_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00165.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00190.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Mutex that allows recursive mutex acquisition.
@@ -95,10 +106,10 @@ 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="a00363.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00423.html">recursive_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00165.html b/doc/html/a00190.html
similarity index 79%
copy from doc/html/a00165.html
copy to doc/html/a00190.html
index 0922378..6f72ddd 100644
--- a/doc/html/a00165.html
+++ b/doc/html/a00190.html
@@ -21,37 +21,37 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00164.html">recursive_mutex</a>::<a class="el" href="a00165.html">scoped_lock</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00189.html">recursive_mutex</a>::<a class="el" href="a00190.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="a00363.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00423.html">recursive_mutex.h</a>></code>
<p>
-<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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 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="a00165.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00164.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00189.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="a00165.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00164.html">recursive_mutex</a> &<a class="el" href="a00150.html">mutex</a>)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00189.html">recursive_mutex</a> &<a class="el" href="a00172.html">mutex</a>)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1197ffb8f3cd9d4fed71d7e06265b7c"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::~scoped_lock" ref="c1197ffb8f3cd9d4fed71d7e06265b7c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fb04da37cccf8c99b1f9102d9074f9a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::acquire" ref="7fb04da37cccf8c99b1f9102d9074f9a" args="(recursive_mutex &mutex)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00164.html">recursive_mutex</a> &<a class="el" href="a00150.html">mutex</a>)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00189.html">recursive_mutex</a> &<a class="el" href="a00172.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="a00165.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00164.html">recursive_mutex</a> &<a class="el" href="a00150.html">mutex</a>)</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00189.html">recursive_mutex</a> &<a class="el" href="a00172.html">mutex</a>)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00164.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00189.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="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">release</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00190.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>
@@ -65,10 +65,10 @@ 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>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00363.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00423.html">recursive_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00166.html b/doc/html/a00191.html
similarity index 92%
copy from doc/html/a00166.html
copy to doc/html/a00191.html
index 79c379f..217d1ca 100644
--- a/doc/html/a00166.html
+++ b/doc/html/a00191.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00166.html">scalable_allocator</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00191.html">scalable_allocator</a></div>
<h1>tbb::scalable_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00276.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="a00364.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00424.html">scalable_allocator.h</a>></code>
<p>
-<a href="a00054.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00063.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a1cf13c339ee177a103a7e19bf2710a"></a><!-- doxytag: member="tbb::scalable_allocator::value_type" ref="5a1cf13c339ee177a103a7e19bf2710a" args="" -->
@@ -57,11 +57,11 @@ typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>differen
<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="a00166.html">scalable_allocator</a> &) throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00191.html">scalable_allocator</a> &) throw ()</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="a00166.html">scalable_allocator</a>< U > &) throw ()</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="a00191.html">scalable_allocator</a>< U > &) throw ()</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>
@@ -70,15 +70,15 @@ 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="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="a00166.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a> (size_type n, const void *=0)</td></tr>
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.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="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a> (pointer p, size_type)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.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="a00166.html#880e766f1d913988c21973dbdd874fd5">max_size</a> () const throw ()</td></tr>
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.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)" -->
@@ -100,10 +100,10 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00364.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00424.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00131.html b/doc/html/a00192.html
similarity index 62%
rename from doc/html/a00131.html
rename to doc/html/a00192.html
index f700cbd..37a57d1 100644
--- a/doc/html/a00131.html
+++ b/doc/html/a00192.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::scalable_allocator< void > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,25 +21,25 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00131.html">cache_aligned_allocator< void ></a></div>
-<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00192.html">scalable_allocator< void ></a></div>
+<h1>tbb::scalable_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.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="a00276.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="a00277.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00424.html">scalable_allocator.h</a>></code>
<p>
-<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00065.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public 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="" -->
+<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="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
+<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="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
+<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>
@@ -48,15 +48,15 @@ typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<h3>template<><br>
- class tbb::cache_aligned_allocator< void ></h3>
+ class tbb::scalable_allocator< void ></h3>
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00277.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00424.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00125.html b/doc/html/a00193.html
similarity index 69%
rename from doc/html/a00125.html
rename to doc/html/a00193.html
index 3440429..ed3bd5d 100644
--- a/doc/html/a00125.html
+++ b/doc/html/a00193.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::auto_partitioner 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,25 +21,25 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00125.html">auto_partitioner</a></div>
-<h1>tbb::auto_partitioner Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00193.html">simple_partitioner</a></div>
+<h1>tbb::simple_partitioner Class Reference<br>
<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.
+[<a class="el" href="a00274.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="a00355.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
<p>
-<a href="a00042.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>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="" -->
+<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="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
+<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="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+<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 colspan="2"><br><h2>Classes</h2></td></tr>
@@ -47,15 +47,15 @@ class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-An auto partitioner.
+A simple 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.
+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="a00355.html">partitioner.h</a></ul>
+<li><a class="el" href="a00404.html">partitioner.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00169.html b/doc/html/a00194.html
similarity index 89%
copy from doc/html/a00169.html
copy to doc/html/a00194.html
index 1b2209a..5b8f327 100644
--- a/doc/html/a00169.html
+++ b/doc/html/a00194.html
@@ -21,33 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00169.html">spin_mutex</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00194.html">spin_mutex</a></div>
<h1>tbb::spin_mutex Class Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
+[<a class="el" href="a00277.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="a00365.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00425.html">spin_mutex.h</a>></code>
<p>
-<a href="a00058.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00067.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="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.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="a00169.html#4f748989e19b6045e3a2d2ee73626a28">lock</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.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="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.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="a00169.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.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>
@@ -65,14 +65,14 @@ static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_
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="a00170.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html">scoped_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00170.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00195.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="a00169.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 <20 instructions) when fairness is not an issue. If zero-initialized, the mutex is considered unheld.
+A <a class="el" href="a00194.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 <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="()" -->
@@ -119,10 +119,10 @@ 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="a00365.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00425.html">spin_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00170.html b/doc/html/a00195.html
similarity index 84%
copy from doc/html/a00170.html
copy to doc/html/a00195.html
index c2075d3..cbc6071 100644
--- a/doc/html/a00170.html
+++ b/doc/html/a00195.html
@@ -21,36 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00169.html">spin_mutex</a>::<a class="el" href="a00170.html">scoped_lock</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00194.html">spin_mutex</a>::<a class="el" href="a00195.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="a00365.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00425.html">spin_mutex.h</a>></code>
<p>
-<a href="a00059.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 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="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</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="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00169.html">spin_mutex</a> &m)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00194.html">spin_mutex</a> &m)</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="a00170.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00169.html">spin_mutex</a> &m)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00194.html">spin_mutex</a> &m)</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="a00170.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00169.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00194.html">spin_mutex</a> &m)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking). <a href="#9297ec188534b45dc0ca48f2f39a0501"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eeb615e68e963e6bf8d9c11402d0ce8e"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::release" ref="eeb615e68e963e6bf8d9c11402d0ce8e" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00195.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy lock. If holding a lock, releases the lock first. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
@@ -69,7 +69,7 @@ Represents acquisition of a mutex.
<tr>
<td class="memname">bool tbb::spin_mutex::scoped_lock::try_acquire </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00169.html">spin_mutex</a> & </td>
+ <td class="paramtype"><a class="el" href="a00194.html">spin_mutex</a> & </td>
<td class="paramname"> <em>m</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
@@ -85,10 +85,10 @@ 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="a00365.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00425.html">spin_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00171.html b/doc/html/a00196.html
similarity index 88%
copy from doc/html/a00171.html
copy to doc/html/a00196.html
index 9116dee..2622c23 100644
--- a/doc/html/a00171.html
+++ b/doc/html/a00196.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="a00237.html">tbb</a>::<a class="el" href="a00171.html">spin_rw_mutex_v3</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00196.html">spin_rw_mutex_v3</a></div>
<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
+[<a class="el" href="a00277.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="a00366.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00426.html">spin_rw_mutex.h</a>></code>
<p>
-<a href="a00060.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00069.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="a00171.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</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="a00171.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</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="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.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="a00171.html#088bb256be794cc47d3b83791632fdfc">try_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.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="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.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="a00171.html#13f799708ac4ca437a16be202e263e18">lock_read</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.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="a00171.html#b8667415869013f840d976aa406d385a">try_lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.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>
@@ -70,9 +70,9 @@ static const bool </td><td class="memItemRight" valign="bottom"><b>is_recur
static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00197.html">scoped_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00172.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00197.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.
@@ -121,10 +121,10 @@ 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="a00366.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00426.html">spin_rw_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00172.html b/doc/html/a00197.html
similarity index 72%
copy from doc/html/a00172.html
copy to doc/html/a00197.html
index b4c98ba..804c194 100644
--- a/doc/html/a00172.html
+++ b/doc/html/a00197.html
@@ -21,42 +21,43 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00171.html">spin_rw_mutex_v3</a>::<a class="el" href="a00172.html">scoped_lock</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00196.html">spin_rw_mutex_v3</a>::<a class="el" href="a00197.html">scoped_lock</a></div>
<h1>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00366.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00426.html">spin_rw_mutex.h</a>></code>
<p>
-<a href="a00061.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 Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.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="a00197.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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00171.html">spin_rw_mutex</a> &m, bool write=true)</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="a00197.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00196.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <a href="#42a92d4f8fdde425b111cfa8a9228071"></a><br></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="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00197.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="a00172.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00171.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00196.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="a00172.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="a00197.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="a00172.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00197.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="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00197.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="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00171.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00196.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>
</table>
@@ -87,37 +88,6 @@ Construct lock that has not acquired a mutex.
Equivalent to zero-initialization of *this.
</div>
</div><p>
-<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)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00171.html">spin_rw_mutex</a> & </td>
- <td class="paramname"> <em>m</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">bool </td>
- <td class="paramname"> <em>write</em> = <code>true</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>
-Acquire lock on given mutex.
-<p>
-Upon entry, *this should not be in the "have acquired a mutex" state.
-</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">
@@ -141,10 +111,10 @@ Returns true if the upgrade happened without re-acquiring the lock and false if
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00366.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00426.html">spin_rw_mutex.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00173.html b/doc/html/a00198.html
similarity index 85%
copy from doc/html/a00173.html
copy to doc/html/a00198.html
index 7d632d9..71b25d5 100644
--- a/doc/html/a00173.html
+++ b/doc/html/a00198.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="a00237.html">tbb</a>::<a class="el" href="a00173.html">split</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00198.html">split</a></div>
<h1>tbb::split Class Reference<br>
<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
+[<a class="el" href="a00274.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="a00398.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_stddef.h</a>></code>
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -39,10 +39,10 @@ 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="a00398.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_stddef.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00174.html b/doc/html/a00199.html
similarity index 75%
copy from doc/html/a00174.html
copy to doc/html/a00199.html
index e294cf8..fb0921f 100644
--- a/doc/html/a00174.html
+++ b/doc/html/a00199.html
@@ -21,91 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00174.html">task</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00199.html">task</a></div>
<h1>tbb::task Class Reference<br>
<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00279.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="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
<p>
<p>Inheritance diagram for tbb::task:
-<p><center><img src="a00174.png" usemap="#tbb::task_map" border="0" alt=""></center>
+<p><center><img src="a00199.png" usemap="#tbb::task_map" border="0" alt=""></center>
<map name="tbb::task_map">
-<area href="a00142.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
+<area href="a00163.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
</map>
-<a href="a00064.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 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="a00174.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="a00199.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="a00174.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="a00199.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="a00174.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="a00174.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="a00199.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="a00199.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="a00174.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="a00199.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="a00174.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="a00199.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="a00174.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="a00199.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="a00174.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="a00199.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="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
- <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
+ <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
+<a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
+<a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
+<a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
<br>
- <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
+ <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
+<a class="el" href="a00199.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="a00174.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="a00199.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="a00174.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
+virtual <a class="el" href="a00199.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.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="a00199.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="a00174.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
+internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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">internal::allocate_additional_child_of_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">allocate_additional_child_of</a> (<a class="el" href="a00174.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="a00199.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00199.html">task</a> &t)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Like allocate_child, except that task's parent becomes "t", not this. <a href="#43bfe64c0e9333c0ca895cc0c375512b"></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="a00174.html#a57def00c8e9d932dbea0b3ee23991b9">destroy</a> (<a class="el" href="a00174.html">task</a> &victim)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy a task. <a href="#a57def00c8e9d932dbea0b3ee23991b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</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="a00199.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="a00174.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="a00199.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="a00174.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00174.html">task</a> &new_parent)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00199.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="a00174.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="a00199.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="a00174.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="a00199.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>
@@ -116,100 +113,101 @@ 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="a00174.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.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="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically increment reference count. <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="a00174.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="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically decrement reference count. <a href="#ef4680f5c148020c5e7e43ddef44cd5d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#f7737143d458f1ed1c0d7da3971d9e6b">spawn</a> (<a class="el" href="a00174.html">task</a> &child)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule task for execution when a worker becomes available. <a href="#f7737143d458f1ed1c0d7da3971d9e6b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db841c647eb6d754440c2f4e4a73c80b"></a><!-- doxytag: member="tbb::task::spawn" ref="db841c647eb6d754440c2f4e4a73c80b" args="(task_list &list)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">spawn</a> (<a class="el" href="a00176.html">task_list</a> &list)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn multiple tasks and clear list. <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="a00174.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00174.html">task</a> &child)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00199.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="a00174.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00176.html">task_list</a> &list)</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00202.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="a00174.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="a00199.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="a00174.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
+<a class="el" href="a00199.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">task on whose behalf this task is working, or NULL if this is a root. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
-<a class="el" href="a00175.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
+<a class="el" href="a00201.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Shared context that is used to communicate asynchronous state changes. <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="a00174.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if task is owned by different thread than thread that owns its parent. <br></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="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
+<a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
+int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.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="a00199.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="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00199.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="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
+<a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00174.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="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00199.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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.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="a00199.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="a00174.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context received cancellation request. <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="a00174.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
+static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00175.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="a00199.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00201.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">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00174.html">task</a> &root)</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="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00199.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. <a href="#ce8ce689c26a4ddf343829bc3c73290a"></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="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00176.html">task_list</a> &root_list)</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="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00202.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"><a class="anchor" name="8365d063c0cc9d7bd616bca47256b93c"></a><!-- doxytag: member="tbb::task::enqueue" ref="8365d063c0cc9d7bd616bca47256b93c" args="(task &t)" -->
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00199.html">task</a> &t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution. <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="a00174.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
+static <a class="el" href="a00199.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.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>
@@ -231,9 +229,6 @@ class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_c
<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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc65e26bdbb61f5e5a3d7ac92948bbd1"></a><!-- doxytag: member="tbb::task::internal::task_group_base" ref="bc65e26bdbb61f5e5a3d7ac92948bbd1" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::task_group_base</b></td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Base class for user-defined tasks.
@@ -244,7 +239,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="a00174.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a> </td>
+ <td class="memname">typedef internal::affinity_id <a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a> </td>
</tr>
</table>
</div>
@@ -262,7 +257,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="a00174.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
+ <td class="memname">enum <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
</tr>
</table>
</div>
@@ -274,7 +269,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="a00174.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
+task is running, and will be destroyed after method <a class="el" href="a00199.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>
@@ -291,28 +286,6 @@ task to be recycled as continuation </td></tr>
</div>
</div><p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="43bfe64c0e9333c0ca895cc0c375512b"></a><!-- doxytag: member="tbb::task::allocate_additional_child_of" ref="43bfe64c0e9333c0ca895cc0c375512b" args="(task &t)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">internal::allocate_additional_child_of_proxy tbb::task::allocate_additional_child_of </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00174.html">task</a> & </td>
- <td class="paramname"> <em>t</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Like allocate_child, except that task's parent becomes "t", not this.
-<p>
-Typically used in conjunction with schedule_to_reexecute to implement while loops. Atomically increments the reference count of t.parent()
-</div>
-</div><p>
<a class="anchor" name="1434c79a5138993269d034008bff7329"></a><!-- doxytag: member="tbb::task::allocate_continuation" ref="1434c79a5138993269d034008bff7329" args="()" -->
<div class="memitem">
<div class="memproto">
@@ -374,18 +347,18 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
<p>
Atomically decrement reference count.
<p>
-Has release semanics.
+Has release semantics.
</div>
</div><p>
-<a class="anchor" name="a57def00c8e9d932dbea0b3ee23991b9"></a><!-- doxytag: member="tbb::task::destroy" ref="a57def00c8e9d932dbea0b3ee23991b9" args="(task &victim)" -->
+<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="a00174.html">task</a> & </td>
- <td class="paramname"> <em>victim</em> </td>
+ <td class="paramtype"><a class="el" href="a00199.html">task</a> & </td>
+ <td class="paramname"> <em>t</em> </td>
<td> ) </td>
<td width="100%"></td>
</tr>
@@ -396,7 +369,7 @@ Has release semanics.
<p>
Destroy a task.
<p>
-Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00174.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="a00199.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="f5fb43c7ad0de5a4b95703cebc39e345"></a><!-- doxytag: member="tbb::task::increment_ref_count" ref="f5fb43c7ad0de5a4b95703cebc39e345" args="()" -->
@@ -427,7 +400,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="a00174.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
+ <td class="paramtype"><a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
<td class="paramname"> <em>id</em> </td>
<td> ) </td>
<td width="100%"><code> [virtual]</code></td>
@@ -439,7 +412,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="a00174.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="a00199.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>
@@ -461,7 +434,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="a00174.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00174.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="a00199.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00199.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>
@@ -483,7 +456,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.
+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="()" -->
@@ -502,31 +475,9 @@ For safety, it requires additional increment of ref_count.
<div class="memdoc">
<p>
-Schedule this for reexecution after current <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
-<p>
-Requires that this.execute() be running.
-</div>
-</div><p>
-<a class="anchor" name="f7737143d458f1ed1c0d7da3971d9e6b"></a><!-- doxytag: member="tbb::task::spawn" ref="f7737143d458f1ed1c0d7da3971d9e6b" args="(task &child)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::task::spawn </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00174.html">task</a> & </td>
- <td class="paramname"> <em>child</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Schedule task for execution when a worker becomes available.
+Schedule this for reexecution after current <a class="el" href="a00199.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
<p>
-After all children spawned so far finish their method <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">task::execute</a>, their parent's method <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">task::execute</a> may start running. Therefore, it is important to ensure that at least one child has not completed until the parent is ready to run.
+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)" -->
@@ -536,7 +487,7 @@ After all children spawned so far finish their method <a class="el" href="a00174
<tr>
<td class="memname">void tbb::task::spawn_root_and_wait </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00176.html">task_list</a> & </td>
+ <td class="paramtype"><a class="el" href="a00202.html">task_list</a> & </td>
<td class="paramname"> <em>root_list</em> </td>
<td> ) </td>
<td width="100%"><code> [inline, static]</code></td>
@@ -551,28 +502,6 @@ Spawn root tasks on list and wait for all of them to finish.
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="ce8ce689c26a4ddf343829bc3c73290a"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="ce8ce689c26a4ddf343829bc3c73290a" args="(task &root)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static void tbb::task::spawn_root_and_wait </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00174.html">task</a> & </td>
- <td class="paramname"> <em>root</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
-<p>
-The thread that calls spawn_root_and_wait must be the same thread that allocated the task.
-</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">
@@ -595,10 +524,10 @@ Works on tasks while waiting.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00427.html">task.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00174.png b/doc/html/a00199.png
similarity index 100%
rename from doc/html/a00174.png
rename to doc/html/a00199.png
diff --git a/doc/html/a00142.html b/doc/html/a00200.html
similarity index 60%
copy from doc/html/a00142.html
copy to doc/html/a00200.html
index ee63611..054dd46 100644
--- a/doc/html/a00142.html
+++ b/doc/html/a00200.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::interface5::internal::task_base Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,31 +21,25 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00142.html">empty_task</a></div>
-<h1>tbb::empty_task Class Reference<br>
-<small>
-[<a class="el" href="a00246.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="a00267.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00200.html">task_base</a></div>
+<h1>tbb::interface5::internal::task_base Class Reference</h1><!-- doxytag: class="tbb::interface5::internal::task_base" -->Base class for methods that became static in TBB 3.0.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::empty_task:
-<p><center><img src="a00142.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
-<map name="tbb::empty_task_map">
-<area href="a00174.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
-</map>
-<a href="a00065.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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-task that does nothing. Useful for synchronization.
+Base class for methods that became static in TBB 3.0.
+<p>
+TBB's evolution caused the "this" argument for several methods to become obsolete. However, for backwards binary compatibility, the new methods need distinct names, otherwise the One Definition Rule would be broken. Hence the new methods are defined in this private base class, and then exposed in class task via using declarations.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00427.html">task.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00175.html b/doc/html/a00201.html
similarity index 90%
copy from doc/html/a00175.html
copy to doc/html/a00201.html
index d0ff309..c57da67 100644
--- a/doc/html/a00175.html
+++ b/doc/html/a00201.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00175.html">task_group_context</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00201.html">task_group_context</a></div>
<h1>tbb::task_group_context Class Reference<br>
<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_group_context" -->Used to form groups of tasks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
<p>
-<a href="a00062.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00073.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5af85179a348162d4ddd66b6fc0d60fb4fda16c4f77defd3d0f6aad87fceed4"></a><!-- doxytag: member="tbb::task_group_context::isolated" ref="d5af85179a348162d4ddd66b6fc0d60fb4fda16c4f77defd3d0f6aad87fceed4" args="" -->
@@ -42,9 +42,6 @@
<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="b8dce4661b346756cb4f584529ecd0ebad65d11fe6fab6ecbb356464170f6a38"></a><!-- doxytag: member="tbb::task_group_context::no_cancellation" ref="b8dce4661b346756cb4f584529ecd0ebad65d11fe6fab6ecbb356464170f6a38" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>no_cancellation</b> = 0x0002ul << 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>
@@ -55,30 +52,29 @@
}</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>no_cancellation</b> = 0x0002ul << 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="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a> (kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00201.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="a00175.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</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="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a> ()</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="a00175.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a> ()</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="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">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="#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="a00175.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () const </td></tr>
+bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () const </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="a00175.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</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="a00201.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ()</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 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="a00175.html#49a55352084fd44b8863d182e839e6dc">init</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="a00201.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>
@@ -93,9 +89,9 @@ class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_r
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="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root()</a> method. See <a class="el" href="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context::task_group_context</a> for more details.<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="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root()</a> method. See <a class="el" href="a00201.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="a00175.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.
+IMPLEMENTATION NOTE: When adding new members to <a class="el" href="a00201.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)" -->
@@ -130,7 +126,7 @@ By default a bound context is created. That is this context will be bound (as ch
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="a00175.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>
+VERSIONING NOTE: Implementation(s) of <a class="el" href="a00201.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 whenever new fields are introduced in the currently unused padding areas or the meaning of the existing fields is changed or extended.
</div>
</div><p>
@@ -223,10 +219,10 @@ 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="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00427.html">task.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00176.html b/doc/html/a00202.html
similarity index 78%
copy from doc/html/a00176.html
copy to doc/html/a00202.html
index d61e484..194ee33 100644
--- a/doc/html/a00176.html
+++ b/doc/html/a00202.html
@@ -21,46 +21,49 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00176.html">task_list</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00202.html">task_list</a></div>
<h1>tbb::task_list Class Reference<br>
<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00367.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
<p>
-<a href="a00066.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 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="a00176.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.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="a00176.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.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="a00176.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.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="a00176.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00174.html">task</a> &<a class="el" href="a00174.html">task</a>)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00199.html">task</a> &<a class="el" href="a00199.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="a00174.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
+<a class="el" href="a00199.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.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="a00176.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the list. <br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e656073628561c8fd68f6134d527e2de"></a><!-- doxytag: member="tbb::task_list::task" ref="e656073628561c8fd68f6134d527e2de" args="" -->
class </td><td class="memItemRight" valign="bottom"><b>task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task_list::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
+
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
A list of children.
@@ -68,10 +71,10 @@ A list of children.
Used for method task::spawn_children
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00367.html">task.h</a></ul>
+<li><a class="el" href="a00427.html">task.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00177.html b/doc/html/a00203.html
similarity index 88%
copy from doc/html/a00177.html
copy to doc/html/a00203.html
index c4cef68..24c2ce3 100644
--- a/doc/html/a00177.html
+++ b/doc/html/a00203.html
@@ -21,58 +21,58 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00177.html">task_scheduler_init</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00203.html">task_scheduler_init</a></div>
<h1>tbb::task_scheduler_init Class Reference<br>
<small>
-[<a class="el" href="a00246.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class representing reference to tbb scheduler.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00383.html">task_scheduler_init.h</a>></code>
+<code>#include <<a class="el" href="a00443.html">task_scheduler_init.h</a>></code>
<p>
-<a href="a00073.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 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="a00177.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00177.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="a00203.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00203.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="a00177.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="a00203.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="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.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="a00177.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00203.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 intialize(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="a00177.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.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="a00177.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.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="a00177.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="a00203.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="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.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="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00177.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="a00203.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 representing reference to tbb scheduler.
<p>
-A thread must construct a <a class="el" href="a00177.html">task_scheduler_init</a>, and keep it alive, during the time that it uses the services of class task.
+A thread must construct a <a class="el" href="a00203.html">task_scheduler_init</a>, and keep it alive, during the time that it uses the services of class task.
<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="()" -->
@@ -136,7 +136,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="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
+ <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
<td> ) </td>
<td width="100%"></td>
</tr>
@@ -152,10 +152,10 @@ The number_of_threads is ignored if any other task_scheduler_inits currently exi
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00383.html">task_scheduler_init.h</a></ul>
+<li><a class="el" href="a00443.html">task_scheduler_init.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00178.html b/doc/html/a00204.html
similarity index 90%
copy from doc/html/a00178.html
copy to doc/html/a00204.html
index 98b9c07..47f153a 100644
--- a/doc/html/a00178.html
+++ b/doc/html/a00204.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00178.html">tbb_allocator</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00204.html">tbb_allocator</a></div>
<h1>tbb::tbb_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::tbb_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
<p>
-<a href="a00075.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="3cdd9619bc0a802763e7823068f83a4c"></a><!-- doxytag: member="tbb::tbb_allocator::value_type" ref="3cdd9619bc0a802763e7823068f83a4c" args="" -->
@@ -61,18 +61,18 @@ typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>differen
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf"></a><!-- doxytag: member="tbb::tbb_allocator::standard" ref="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf" args="" -->
</td><td class="memItemRight" valign="bottom"><b>standard</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.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="a00204.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="a00178.html">tbb_allocator</a> &) throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00204.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="a00178.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="a00204.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="a00178.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const throw ()</td></tr>
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00178.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00178.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a> ()</td></tr>
+static <a class="el" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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>
@@ -118,10 +118,10 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The class selects the best memory allocation mechanism available from scalable_malloc and standard malloc. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00179.html b/doc/html/a00205.html
similarity index 88%
copy from doc/html/a00179.html
copy to doc/html/a00205.html
index 9adfef7..1da6c0a 100644
--- a/doc/html/a00179.html
+++ b/doc/html/a00205.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00179.html">tbb_allocator< void ></a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00205.html">tbb_allocator< void ></a></div>
<h1>tbb::tbb_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::tbb_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
<p>
-<a href="a00077.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00088.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05f5ff584890407c8d672e4b4378744d"></a><!-- doxytag: member="tbb::tbb_allocator< void >::pointer" ref="05f5ff584890407c8d672e4b4378744d" args="" -->
@@ -53,10 +53,10 @@ typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00180.html b/doc/html/a00206.html
similarity index 82%
copy from doc/html/a00180.html
copy to doc/html/a00206.html
index 5787a8d..7eead76 100644
--- a/doc/html/a00180.html
+++ b/doc/html/a00206.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="a00237.html">tbb</a>::<a class="el" href="a00180.html">tbb_exception</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00206.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="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00180.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
+<p><center><img src="a00206.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
<map name="tbb::tbb_exception_map">
-<area href="a00132.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00149.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
+<area href="a00153.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
+<area href="a00171.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
</map>
-<a href="a00087.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00180.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00206.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00206.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="a00180.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="a00206.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="a00180.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="a00180.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="a00206.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="a00206.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="a00180.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00206.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="a00180.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00206.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="a00180.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="a00180.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="a00206.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="a00206.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="a00180.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="a00175.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="a00206.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="a00201.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="a00132.html">tbb::captured_exception</a> and template class <a class="el" href="a00149.html">tbb::movable_exception</a>. See their declarations for more info.
+TBB provides two implementations of this interface: <a class="el" href="a00153.html">tbb::captured_exception</a> and template class <a class="el" href="a00171.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="a00132.h
<div class="memdoc">
<p>
-Destroys objects created by the <a class="el" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.
+Destroys objects created by the <a class="el" href="a00206.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="a00132.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00149.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00171.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="a00132.html#93d875d3555502ff6f18513525de204c"
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">virtual <a class="el" href="a00180.html">tbb_exception</a>* tbb::tbb_exception::move </td>
+ <td class="memname">virtual <a class="el" href="a00206.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="a00132.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00171.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="a00132.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="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00180.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="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
+When overriding method <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator.
</div>
</div><p>
<a class="anchor" name="8588e07fa49692f4d734e4f2e4f048f4"></a><!-- doxytag: member="tbb::tbb_exception::throw_self" ref="8588e07fa49692f4d734e4f2e4f048f4" args="()=0" -->
@@ -152,14 +152,14 @@ Throws this exception object.
<p>
Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
<p>
-Implemented in <a class="el" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00149.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00180.png b/doc/html/a00206.png
similarity index 100%
rename from doc/html/a00180.png
rename to doc/html/a00206.png
diff --git a/doc/html/a00181.html b/doc/html/a00207.html
similarity index 84%
copy from doc/html/a00181.html
copy to doc/html/a00207.html
index 6403aca..ce332cc 100644
--- a/doc/html/a00181.html
+++ b/doc/html/a00207.html
@@ -21,31 +21,31 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<b>internal</b>::<a class="el" href="a00181.html">tbb_exception_ptr</a></div>
+<a class="el" href="a00267.html">tbb</a>::<b>internal</b>::<a class="el" href="a00207.html">tbb_exception_ptr</a></div>
<h1>tbb::internal::tbb_exception_ptr Class Reference</h1><!-- doxytag: class="tbb::internal::tbb_exception_ptr" -->Exception container that preserves the exact copy of the original exception.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00393.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
<p>
-<a href="a00090.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 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="a00181.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="a00207.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="a00181.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00207.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="a00181.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
+static <a class="el" href="a00207.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="a00181.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00180.html">tbb_exception</a> &tag)</td></tr>
+static <a class="el" href="a00207.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00206.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="a00181.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00181.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00132.html">captured_exception</a> &src)</td></tr>
+static <a class="el" href="a00207.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00153.html">captured_exception</a> &src)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">This overload uses move semantics (i.e. it empties src). <br></td></tr>
</table>
@@ -77,10 +77,10 @@ Note that objects of this type can be created only by the allocate() method.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00393.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00122.html b/doc/html/a00208.html
similarity index 53%
rename from doc/html/a00122.html
rename to doc/html/a00208.html
index cbffd7f..ea2c89f 100644
--- a/doc/html/a00122.html
+++ b/doc/html/a00208.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< T > Struct Template Reference</title>
+<title>tbb::tbb_hash_compare< Key > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,38 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00122.html">atomic</a></div>
-<h1>tbb::atomic< T > Struct Template Reference<br>
-<small>
-[<a class="el" href="a00244.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00208.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="a00266.html">atomic.h</a>></code>
+<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00002.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="a00122.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00122.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="a00266.html">atomic.h</a></ul>
+<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00182.html b/doc/html/a00209.html
similarity index 89%
copy from doc/html/a00182.html
copy to doc/html/a00209.html
index 1a02640..913e80d 100644
--- a/doc/html/a00182.html
+++ b/doc/html/a00209.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="a00237.html">tbb</a>::<a class="el" href="a00182.html">thread_bound_filter</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00209.html">thread_bound_filter</a></div>
<h1>tbb::thread_bound_filter Class Reference<br>
<small>
-[<a class="el" href="a00241.html">Algorithms</a>]</small>
+[<a class="el" href="a00274.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="a00360.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
<p>
<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00182.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
+<p><center><img src="a00209.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
<map name="tbb::thread_bound_filter_map">
-<area href="a00144.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<area href="a00165.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
</map>
-<a href="a00046.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23"></a><!-- doxytag: member="tbb::thread_bound_filter::success" ref="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23" args="" -->
@@ -53,15 +53,15 @@
}</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="a00182.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="a00209.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="a00182.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="a00209.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>
<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> (<a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> filter_mode)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b> (mode filter_mode)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
@@ -111,10 +111,10 @@ This interface is non-blocking. Returns 'success' if an item was processed. Retu
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00360.html">pipeline.h</a></ul>
+<li><a class="el" href="a00409.html">pipeline.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00182.png b/doc/html/a00209.png
similarity index 100%
rename from doc/html/a00182.png
rename to doc/html/a00209.png
diff --git a/doc/html/a00183.html b/doc/html/a00210.html
similarity index 78%
copy from doc/html/a00183.html
copy to doc/html/a00210.html
index 3918fc0..d187626 100644
--- a/doc/html/a00183.html
+++ b/doc/html/a00210.html
@@ -21,45 +21,45 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00183.html">tick_count</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00210.html">tick_count</a></div>
<h1>tbb::tick_count Class Reference<br>
<small>
-[<a class="el" href="a00245.html">Timing</a>]</small>
+[<a class="el" href="a00278.html">Timing</a>]</small>
</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00413.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00476.html">tick_count.h</a>></code>
<p>
-<a href="a00101.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 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="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00210.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="a00183.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
+static <a class="el" href="a00210.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00210.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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00183.html">tick_count</a> &t1, const <a class="el" href="a00183.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00211.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00210.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00210.html">tick_count</a> &t1, const <a class="el" href="a00210.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="a00184.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="a00211.html">interval_t</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00184.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00211.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="a00413.html">tick_count.h</a></ul>
+<li><a class="el" href="a00476.html">tick_count.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00184.html b/doc/html/a00211.html
similarity index 76%
copy from doc/html/a00184.html
copy to doc/html/a00211.html
index f4eec8a..1d39455 100644
--- a/doc/html/a00184.html
+++ b/doc/html/a00211.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="a00237.html">tbb</a>::<a class="el" href="a00183.html">tick_count</a>::<a class="el" href="a00184.html">interval_t</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00210.html">tick_count</a>::<a class="el" href="a00211.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="a00413.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00476.html">tick_count.h</a>></code>
<p>
-<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public 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="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.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="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.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="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
+double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.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="a00184.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00184.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00211.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00211.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="a00184.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00184.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00211.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00211.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="a00184.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00183.html">tick_count</a> &t1, const <a class="el" href="a00183.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00211.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00210.html">tick_count</a> &t1, const <a class="el" href="a00210.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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00184.html">interval_t</a> &i, const <a class="el" href="a00184.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00211.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00211.html">interval_t</a> &i, const <a class="el" href="a00211.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="a00184.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00184.html">interval_t</a> &i, const <a class="el" href="a00184.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00211.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00211.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00211.html">interval_t</a> &i, const <a class="el" href="a00211.html">interval_t</a> &j)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
</table>
@@ -71,10 +71,10 @@ class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00
Relative time interval.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00413.html">tick_count.h</a></ul>
+<li><a class="el" href="a00476.html">tick_count.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00185.html b/doc/html/a00212.html
similarity index 87%
copy from doc/html/a00185.html
copy to doc/html/a00212.html
index 8778d50..4709dd7 100644
--- a/doc/html/a00185.html
+++ b/doc/html/a00212.html
@@ -21,13 +21,13 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<b>internal</b>::<a class="el" href="a00185.html">work_around_alignment_bug</a></div>
+<a class="el" href="a00267.html">tbb</a>::<b>internal</b>::<a class="el" href="a00212.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="a00394.html">tbb_machine.h</a>></code>
+<code>#include <<a class="el" href="a00454.html">tbb_machine.h</a>></code>
<p>
-<a href="a00098.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 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="" -->
@@ -43,10 +43,10 @@ Work around for bug in GNU 3.2 and MSVC compilers.
Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated. The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T).
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00394.html">tbb_machine.h</a></ul>
+<li><a class="el" href="a00454.html">tbb_machine.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00186.html b/doc/html/a00213.html
similarity index 92%
copy from doc/html/a00186.html
copy to doc/html/a00213.html
index 9a16676..be4d723 100644
--- a/doc/html/a00186.html
+++ b/doc/html/a00213.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00186.html">zero_allocator</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00213.html">zero_allocator</a></div>
<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00276.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="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
<p>
-<a href="a00079.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="77c87446a645cc3dbeba6fc82cc7eec0"></a><!-- doxytag: member="tbb::zero_allocator::base_allocator_type" ref="77c87446a645cc3dbeba6fc82cc7eec0" args="" -->
@@ -59,11 +59,11 @@ typedef base_allocator_type::difference_type </td><td class="memItemRight"
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c48c0436e3239be8f07c53c7f6658e4"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="8c48c0436e3239be8f07c53c7f6658e4" args="(const zero_allocator &a)" -->
- </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00186.html">zero_allocator</a> &a) throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00213.html">zero_allocator</a> &a) throw ()</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="67685c1cfcd3b5f81ac8f3c8dd1375b9"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="67685c1cfcd3b5f81ac8f3c8dd1375b9" args="(const zero_allocator< U > &a)" -->
template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00186.html">zero_allocator</a>< U > &a) throw ()</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00213.html">zero_allocator</a>< U > &a) throw ()</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b6e7eb50d9faeca418d56a9758357377"></a><!-- doxytag: member="tbb::zero_allocator::allocate" ref="b6e7eb50d9faeca418d56a9758357377" args="(const size_type n, const void *hint=0)" -->
pointer </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const size_type n, const void *hint=0)</td></tr>
@@ -81,10 +81,10 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The class is an adapter over an actual allocator that fills the allocation using memset function with template argument C as the value. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00187.html b/doc/html/a00214.html
similarity index 89%
copy from doc/html/a00187.html
copy to doc/html/a00214.html
index 2211a27..26be386 100644
--- a/doc/html/a00187.html
+++ b/doc/html/a00214.html
@@ -21,16 +21,16 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00187.html">zero_allocator< void, Allocator ></a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00214.html">zero_allocator< void, Allocator ></a></div>
<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00243.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::zero_allocator< void, Allocator >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00387.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
<p>
-<a href="a00081.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="ce4f3bf06e8aaf8020fa443297eff5f7"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::base_allocator_type" ref="ce4f3bf06e8aaf8020fa443297eff5f7" args="" -->
@@ -56,10 +56,10 @@ typedef base_allocator_type::const_pointer </td><td class="memItemRight" va
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00387.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00241.html b/doc/html/a00241.html
deleted file mode 100644
index 4835d63..0000000
--- a/doc/html/a00241.html
+++ /dev/null
@@ -1,344 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Algorithms</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<h1>Algorithms</h1><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.html">tbb::blocked_range< Value ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00127.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00128.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="a00128.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00129.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="a00129.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="a00159.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="a00159.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="a00145.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="a00145.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.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="a00157.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00168.html">tbb::simple_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00168.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00125.html">tbb::auto_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00125.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html">tbb::filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00144.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.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="a00182.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html">tbb::pipeline</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeling that applies filters to items. <a href="a00158.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00173.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="a00173.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="a00241.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="a00241.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="a00241.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="a00241.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="a00241.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="a00125.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="a00241.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="a00120.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="a00241.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="a00241.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="a00125.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="a00241.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="a00120.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="a00241.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="a00241.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="a00241.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00175.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="a00175.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="a00175.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="a00175.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="a00175.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="a00175.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="a00175.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="a00175.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="a00175.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
-
-<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00241.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="a00241.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="a00168.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="a00241.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="a00125.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="a00241.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="a00120.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="a00241.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="a00241.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="a00125.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="a00241.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="a00120.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="a00241.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="a00241.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="a00168.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="a00241.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="a00125.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="a00241.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="a00120.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="a00241.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="a00241.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="a00125.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="a00241.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="a00120.html">affinity_partitioner</a> 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="a00241.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="a00241.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="a00168.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="a00241.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="a00125.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="a00241.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="a00241.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="a00241.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
-</table>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="g49edcf9447cd91a9527a3f8e8512b7aa"></a><!-- doxytag: member="tbb::parallel_sort" ref="g49edcf9447cd91a9527a3f8e8512b7aa" args="(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename RandomAccessIterator, typename Compare> </div>
- <table class="memname">
- <tr>
- <td class="memname">void tbb::parallel_sort </td>
- <td>(</td>
- <td class="paramtype">RandomAccessIterator </td>
- <td class="paramname"> <em>begin</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">RandomAccessIterator </td>
- <td class="paramname"> <em>end</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Compare & </td>
- <td class="paramname"> <em>comp</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sorts the data in [begin,end) using the given comparator.
-<p>
-The compare function object is used for all comparisons between elements during sorting. The compare object must define a bool operator() function.
-</div>
-</div><p>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00242.html b/doc/html/a00242.html
deleted file mode 100644
index 9b8899a..0000000
--- a/doc/html/a00242.html
+++ /dev/null
@@ -1,47 +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>Containers</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>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="a00133.html">tbb::combinable< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00133.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html">tbb::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="a00135.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00139.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="a00139.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00134.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="a00134.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00140.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="a00140.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00141.html#_details">More...</a><br></td></tr>
-</table>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00243.html b/doc/html/a00243.html
deleted file mode 100644
index f0bc545..0000000
--- a/doc/html/a00243.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="a00121.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="a00121.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00130.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="a00130.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00131.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="a00131.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00166.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="a00166.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00167.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="a00167.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.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="a00178.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.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="a00179.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00186.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="a00186.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00187.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="a00187.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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-2009 Intel Corporation. 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/a00244.html b/doc/html/a00244.html
deleted file mode 100644
index 67deb90..0000000
--- a/doc/html/a00244.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>Synchronization</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>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="a00122.html">tbb::atomic< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00122.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.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="a00150.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html">tbb::null_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00152.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">tbb::null_rw_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00154.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html">tbb::queuing_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00160.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.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="a00162.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html">tbb::recursive_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00164.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00169.html">tbb::spin_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00169.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00171.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="a00171.html#_details">More...</a><br></td></tr>
-</table>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00246.html b/doc/html/a00246.html
deleted file mode 100644
index 8957db5..0000000
--- a/doc/html/a00246.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>Task Scheduling</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>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="a00175.html">tbb::task_group_context</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00175.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html">tbb::task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00174.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html">tbb::empty_task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00142.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html">tbb::task_list</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00176.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class representing reference to tbb scheduler. <a href="a00177.html#_details">More...</a><br></td></tr>
-</table>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00247.html b/doc/html/a00247.html
deleted file mode 100644
index c02ba00..0000000
--- a/doc/html/a00247.html
+++ /dev/null
@@ -1,921 +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-2010 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 <iterator></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <new></span>
-<a name="l00032"></a>00032
-<a name="l00033"></a><a class="code" href="a00237.html">00033</a> <span class="keyword">namespace </span>tbb {
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span>
-<a name="l00037"></a>00037 <span class="comment">// forward declaration</span>
-<a name="l00038"></a><a class="code" href="a00240.html">00038</a> <span class="keyword">namespace </span>strict_ppl {
-<a name="l00039"></a>00039 <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="a00139.html">concurrent_queue</a>;
-<a name="l00040"></a>00040 }
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <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="a00134.html">concurrent_bounded_queue</a>;
-<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>deprecated {
-<a name="l00045"></a>00045 <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="a00139.html">concurrent_queue</a>;
-<a name="l00046"></a>00046 }
-<a name="l00047"></a>00047 <span class="preprocessor">#endif</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span>
-<a name="l00050"></a>00050 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00051"></a>00051
-<a name="l00053"></a>00053 <span class="keyword">namespace </span>internal {
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="keyword">typedef</span> size_t ticket;
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue ;
-<a name="l00060"></a>00060 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00061"></a>00061 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00062"></a>00062
-<a name="l00064"></a>00064
-<a name="l00067"></a>00067 <span class="keyword">struct </span>concurrent_queue_rep_base : no_copy {
-<a name="l00068"></a>00068 <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="l00069"></a>00069 <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="l00070"></a>00070
-<a name="l00071"></a>00071 <span class="keyword">protected</span>:
-<a name="l00073"></a>00073 <span class="keyword">static</span> <span class="keyword">const</span> size_t phi = 3;
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="keyword">public</span>:
-<a name="l00076"></a>00076 <span class="comment">// must be power of 2</span>
-<a name="l00077"></a>00077 <span class="keyword">static</span> <span class="keyword">const</span> size_t n_queue = 8;
-<a name="l00078"></a>00078
-<a name="l00080"></a>00080 <span class="keyword">struct </span>page {
-<a name="l00081"></a>00081 page* next;
-<a name="l00082"></a>00082 uintptr_t mask;
-<a name="l00083"></a>00083 };
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 atomic<ticket> head_counter;
-<a name="l00086"></a>00086 <span class="keywordtype">char</span> pad1[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00087"></a>00087 atomic<ticket> tail_counter;
-<a name="l00088"></a>00088 <span class="keywordtype">char</span> pad2[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00089"></a>00089
-<a name="l00091"></a>00091 size_t items_per_page;
-<a name="l00092"></a>00092
-<a name="l00094"></a>00094 size_t item_size;
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 atomic<size_t> n_invalid_entries;
-<a name="l00098"></a>00098
-<a name="l00099"></a>00099 <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="l00100"></a>00100 } ;
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <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="l00103"></a>00103 <span class="keywordflow">return</span> uintptr_t(p)>1;
-<a name="l00104"></a>00104 }
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107
-<a name="l00110"></a>00110 <span class="keyword">class </span>concurrent_queue_page_allocator
-<a name="l00111"></a>00111 {
-<a name="l00112"></a>00112 <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="l00113"></a>00113 <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="l00114"></a>00114 <span class="keyword">protected</span>:
-<a name="l00115"></a>00115 <span class="keyword">virtual</span> ~concurrent_queue_page_allocator() {}
-<a name="l00116"></a>00116 <span class="keyword">private</span>:
-<a name="l00117"></a>00117 <span class="keyword">virtual</span> concurrent_queue_rep_base::page* allocate_page() = 0;
-<a name="l00118"></a>00118 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page* p ) = 0;
-<a name="l00119"></a>00119 } ;
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="comment">// unary minus operator applied to unsigned type, result still unsigned</span>
-<a name="l00123"></a>00123 <span class="preprocessor">#pragma warning( push )</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( disable: 4146 )</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>
-<a name="l00128"></a>00128
-<a name="l00130"></a>00130 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00131"></a>00131 <span class="keyword">class </span>micro_queue : no_copy {
-<a name="l00132"></a>00132 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00133"></a>00133
-<a name="l00135"></a>00135 <span class="keyword">class </span>destroyer: no_copy {
-<a name="l00136"></a>00136 T& my_value;
-<a name="l00137"></a>00137 <span class="keyword">public</span>:
-<a name="l00138"></a>00138 destroyer( T& value ) : my_value(value) {}
-<a name="l00139"></a>00139 ~destroyer() {my_value.~T();}
-<a name="l00140"></a>00140 };
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 T& get_ref( page& page, size_t index ) {
-<a name="l00143"></a>00143 <span class="keywordflow">return</span> static_cast<T*>(static_cast<void*>(&page+1))[index];
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <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="l00147"></a>00147 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="keywordtype">void</span> copy_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00151"></a>00151 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( static_cast<const T*>(static_cast<const void*>(&src+1))[sindex] );
-<a name="l00152"></a>00152 }
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00155"></a>00155 T& from = get_ref(src,index);
-<a name="l00156"></a>00156 destroyer d(from);
-<a name="l00157"></a>00157 *static_cast<T*>(dst) = from;
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <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="l00161"></a>00161
-<a name="l00162"></a>00162 <span class="keyword">public</span>:
-<a name="l00163"></a>00163 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer<T>;
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 atomic<page*> head_page;
-<a name="l00166"></a>00166 atomic<ticket> head_counter;
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 atomic<page*> tail_page;
-<a name="l00169"></a>00169 atomic<ticket> tail_counter;
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 spin_mutex page_mutex;
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <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="l00174"></a>00174
-<a name="l00175"></a>00175 <span class="keywordtype">bool</span> pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 micro_queue& assign( <span class="keyword">const</span> micro_queue& src, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 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="l00180"></a>00180
-<a name="l00181"></a>00181 <span class="keywordtype">void</span> invalidate_page_and_rethrow( ticket k ) ;
-<a name="l00182"></a>00182 };
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00185"></a>00185 <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="l00186"></a>00186 atomic_backoff backoff;
-<a name="l00187"></a>00187 <span class="keywordflow">do</span> {
-<a name="l00188"></a>00188 backoff.pause();
-<a name="l00189"></a>00189 <span class="keywordflow">if</span>( counter&1 ) {
-<a name="l00190"></a>00190 ++rb.n_invalid_entries;
-<a name="l00191"></a>00191 throw_bad_last_alloc_exception_v4();
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193 } <span class="keywordflow">while</span>( counter!=k ) ;
-<a name="l00194"></a>00194 }
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00197"></a>00197 <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="l00198"></a>00198 k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00199"></a>00199 page* p = NULL;
-<a name="l00200"></a>00200 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00201"></a>00201 <span class="keywordflow">if</span>( !index ) {
-<a name="l00202"></a>00202 <span class="keywordflow">try</span> {
-<a name="l00203"></a>00203 concurrent_queue_page_allocator& pa = base;
-<a name="l00204"></a>00204 p = pa.allocate_page();
-<a name="l00205"></a>00205 } <span class="keywordflow">catch</span> (...) {
-<a name="l00206"></a>00206 ++base.my_rep->n_invalid_entries;
-<a name="l00207"></a>00207 invalidate_page_and_rethrow( k );
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209 p->mask = 0;
-<a name="l00210"></a>00210 p->next = NULL;
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="keywordflow">if</span>( tail_counter!=k ) spin_wait_until_my_turn( tail_counter, k, *base.my_rep );
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="keywordflow">if</span>( p ) {
-<a name="l00216"></a>00216 spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00217"></a>00217 page* q = tail_page;
-<a name="l00218"></a>00218 <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00219"></a>00219 q->next = p;
-<a name="l00220"></a>00220 <span class="keywordflow">else</span>
-<a name="l00221"></a>00221 head_page = p;
-<a name="l00222"></a>00222 tail_page = p;
-<a name="l00223"></a>00223 } <span class="keywordflow">else</span> {
-<a name="l00224"></a>00224 p = tail_page;
-<a name="l00225"></a>00225 }
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keywordflow">try</span> {
-<a name="l00228"></a>00228 copy_item( *p, index, item );
-<a name="l00229"></a>00229 <span class="comment">// If no exception was thrown, mark item as present.</span>
-<a name="l00230"></a>00230 p->mask |= uintptr_t(1)<<index;
-<a name="l00231"></a>00231 tail_counter += concurrent_queue_rep_base::n_queue;
-<a name="l00232"></a>00232 } <span class="keywordflow">catch</span> (...) {
-<a name="l00233"></a>00233 ++base.my_rep->n_invalid_entries;
-<a name="l00234"></a>00234 tail_counter += concurrent_queue_rep_base::n_queue;
-<a name="l00235"></a>00235 <span class="keywordflow">throw</span>;
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238
-<a name="l00239"></a>00239 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00240"></a>00240 <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="l00241"></a>00241 k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00242"></a>00242 <span class="keywordflow">if</span>( head_counter!=k ) spin_wait_until_eq( head_counter, k );
-<a name="l00243"></a>00243 <span class="keywordflow">if</span>( tail_counter==k ) spin_wait_while_eq( tail_counter, k );
-<a name="l00244"></a>00244 page& p = *head_page;
-<a name="l00245"></a>00245 __TBB_ASSERT( &p, NULL );
-<a name="l00246"></a>00246 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00247"></a>00247 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>;
-<a name="l00248"></a>00248 {
-<a name="l00249"></a>00249 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="l00250"></a>00250 <span class="keywordflow">if</span>( p.mask & uintptr_t(1)<<index ) {
-<a name="l00251"></a>00251 success = <span class="keyword">true</span>;
-<a name="l00252"></a>00252 assign_and_destroy_item( dst, p, index );
-<a name="l00253"></a>00253 } <span class="keywordflow">else</span> {
-<a name="l00254"></a>00254 --base.my_rep->n_invalid_entries;
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257 <span class="keywordflow">return</span> success;
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00261"></a>00261 micro_queue<T>& micro_queue<T>::assign( <span class="keyword">const</span> micro_queue<T>& src, concurrent_queue_base_v3<T>& base ) {
-<a name="l00262"></a>00262 head_counter = src.head_counter;
-<a name="l00263"></a>00263 tail_counter = src.tail_counter;
-<a name="l00264"></a>00264 page_mutex = src.page_mutex;
-<a name="l00265"></a>00265
-<a name="l00266"></a>00266 <span class="keyword">const</span> page* srcp = src.head_page;
-<a name="l00267"></a>00267 <span class="keywordflow">if</span>( is_valid_page(srcp) ) {
-<a name="l00268"></a>00268 ticket g_index = head_counter;
-<a name="l00269"></a>00269 <span class="keywordflow">try</span> {
-<a name="l00270"></a>00270 size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
-<a name="l00271"></a>00271 size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00272"></a>00272 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="l00273"></a>00273
-<a name="l00274"></a>00274 head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
-<a name="l00275"></a>00275 page* cur_page = head_page;
-<a name="l00276"></a>00276
-<a name="l00277"></a>00277 <span class="keywordflow">if</span>( srcp != src.tail_page ) {
-<a name="l00278"></a>00278 <span class="keywordflow">for</span>( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {
-<a name="l00279"></a>00279 cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index );
-<a name="l00280"></a>00280 cur_page = cur_page->next;
-<a name="l00281"></a>00281 }
-<a name="l00282"></a>00282
-<a name="l00283"></a>00283 __TBB_ASSERT( srcp==src.tail_page, NULL );
-<a name="l00284"></a>00284 size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00285"></a>00285 <span class="keywordflow">if</span>( last_index==0 ) last_index = base.my_rep->items_per_page;
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
-<a name="l00288"></a>00288 cur_page = cur_page->next;
-<a name="l00289"></a>00289 }
-<a name="l00290"></a>00290 tail_page = cur_page;
-<a name="l00291"></a>00291 } <span class="keywordflow">catch</span> (...) {
-<a name="l00292"></a>00292 invalidate_page_and_rethrow( g_index );
-<a name="l00293"></a>00293 }
-<a name="l00294"></a>00294 } <span class="keywordflow">else</span> {
-<a name="l00295"></a>00295 head_page = tail_page = NULL;
-<a name="l00296"></a>00296 }
-<a name="l00297"></a>00297 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299
-<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
-<a name="l00302"></a>00302 <span class="comment">// Append an invalid page at address 1 so that no more pushes are allowed.</span>
-<a name="l00303"></a>00303 page* invalid_page = (page*)uintptr_t(1);
-<a name="l00304"></a>00304 {
-<a name="l00305"></a>00305 spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00306"></a>00306 tail_counter = k+concurrent_queue_rep_base::n_queue+1;
-<a name="l00307"></a>00307 page* q = tail_page;
-<a name="l00308"></a>00308 <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00309"></a>00309 q->next = invalid_page;
-<a name="l00310"></a>00310 <span class="keywordflow">else</span>
-<a name="l00311"></a>00311 head_page = invalid_page;
-<a name="l00312"></a>00312 tail_page = invalid_page;
-<a name="l00313"></a>00313 }
-<a name="l00314"></a>00314 <span class="keywordflow">throw</span>;
-<a name="l00315"></a>00315 }
-<a name="l00316"></a>00316
-<a name="l00317"></a>00317 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00318"></a>00318 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="l00319"></a>00319 concurrent_queue_page_allocator& pa = base;
-<a name="l00320"></a>00320 page* new_page = pa.allocate_page();
-<a name="l00321"></a>00321 new_page->next = NULL;
-<a name="l00322"></a>00322 new_page->mask = src_page->mask;
-<a name="l00323"></a>00323 <span class="keywordflow">for</span>( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
-<a name="l00324"></a>00324 <span class="keywordflow">if</span>( new_page->mask & uintptr_t(1)<<begin_in_page )
-<a name="l00325"></a>00325 copy_item( *new_page, begin_in_page, *src_page, begin_in_page );
-<a name="l00326"></a>00326 <span class="keywordflow">return</span> new_page;
-<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> T>
-<a name="l00330"></a>00330 <span class="keyword">class </span>micro_queue_pop_finalizer: no_copy {
-<a name="l00331"></a>00331 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00332"></a>00332 ticket my_ticket;
-<a name="l00333"></a>00333 micro_queue<T>& my_queue;
-<a name="l00334"></a>00334 page* my_page;
-<a name="l00335"></a>00335 concurrent_queue_page_allocator& allocator;
-<a name="l00336"></a>00336 <span class="keyword">public</span>:
-<a name="l00337"></a>00337 micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :
-<a name="l00338"></a>00338 my_ticket(k), my_queue(queue), my_page(p), allocator(b)
-<a name="l00339"></a>00339 {}
-<a name="l00340"></a>00340 ~micro_queue_pop_finalizer() ;
-<a name="l00341"></a>00341 };
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00344"></a>00344 micro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {
-<a name="l00345"></a>00345 page* p = my_page;
-<a name="l00346"></a>00346 <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00347"></a>00347 spin_mutex::scoped_lock lock( my_queue.page_mutex );
-<a name="l00348"></a>00348 page* q = p->next;
-<a name="l00349"></a>00349 my_queue.head_page = q;
-<a name="l00350"></a>00350 <span class="keywordflow">if</span>( !is_valid_page(q) ) {
-<a name="l00351"></a>00351 my_queue.tail_page = NULL;
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353 }
-<a name="l00354"></a>00354 my_queue.head_counter = my_ticket;
-<a name="l00355"></a>00355 <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00356"></a>00356 allocator.deallocate_page( p );
-<a name="l00357"></a>00357 }
-<a name="l00358"></a>00358 }
-<a name="l00359"></a>00359
-<a name="l00360"></a>00360 <span class="preprocessor">#if _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 // warning 4146 is back</span>
-<a name="l00363"></a>00363 <span class="preprocessor"></span>
-<a name="l00364"></a>00364 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_rep ;
-<a name="l00365"></a>00365 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00366"></a>00366
-<a name="l00368"></a>00368
-<a name="l00371"></a>00371 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00372"></a>00372 <span class="keyword">struct </span>concurrent_queue_rep : <span class="keyword">public</span> concurrent_queue_rep_base {
-<a name="l00373"></a>00373 micro_queue<T> array[n_queue];
-<a name="l00374"></a>00374
-<a name="l00376"></a>00376 <span class="keyword">static</span> size_t index( ticket k ) {
-<a name="l00377"></a>00377 <span class="keywordflow">return</span> k*phi%n_queue;
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379
-<a name="l00380"></a>00380 micro_queue<T>& choose( ticket k ) {
-<a name="l00381"></a>00381 <span class="comment">// The formula here approximates LRU in a cache-oblivious way.</span>
-<a name="l00382"></a>00382 <span class="keywordflow">return</span> array[index(k)];
-<a name="l00383"></a>00383 }
-<a name="l00384"></a>00384 };
-<a name="l00385"></a>00385
-<a name="l00387"></a>00387
-<a name="l00391"></a>00391 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00392"></a>00392 <span class="keyword">class </span>concurrent_queue_base_v3: <span class="keyword">public</span> concurrent_queue_page_allocator {
-<a name="l00394"></a>00394 concurrent_queue_rep<T>* my_rep;
-<a name="l00395"></a>00395
-<a name="l00396"></a>00396 <span class="keyword">friend</span> <span class="keyword">struct </span>concurrent_queue_rep<T>;
-<a name="l00397"></a>00397 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue<T>;
-<a name="l00398"></a>00398 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep<T>;
-<a name="l00399"></a>00399 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3<T>;
-<a name="l00400"></a>00400
-<a name="l00401"></a>00401 <span class="keyword">protected</span>:
-<a name="l00402"></a>00402 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_rep<T>::page page;
-<a name="l00403"></a>00403
-<a name="l00404"></a>00404 <span class="keyword">private</span>:
-<a name="l00405"></a>00405 <span class="comment">/* override */</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00406"></a>00406 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00407"></a>00407 size_t n = <span class="keyword">sizeof</span>(page) + r.items_per_page*r.item_size;
-<a name="l00408"></a>00408 <span class="keywordflow">return</span> reinterpret_cast<page*>(allocate_block ( n ));
-<a name="l00409"></a>00409 }
-<a name="l00410"></a>00410
-<a name="l00411"></a>00411 <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="l00412"></a>00412 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00413"></a>00413 size_t n = <span class="keyword">sizeof</span>(page) + r.items_per_page*r.item_size;
-<a name="l00414"></a>00414 deallocate_block( reinterpret_cast<void*>(p), n );
-<a name="l00415"></a>00415 }
-<a name="l00416"></a>00416
-<a name="l00418"></a>00418 <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) = 0;
-<a name="l00419"></a>00419
-<a name="l00421"></a>00421 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *p, size_t n ) = 0;
-<a name="l00422"></a>00422
-<a name="l00423"></a>00423 <span class="keyword">protected</span>:
-<a name="l00424"></a>00424 concurrent_queue_base_v3( size_t item_size ) ;
-<a name="l00425"></a>00425
-<a name="l00426"></a>00426 <span class="comment">/* override */</span> <span class="keyword">virtual</span> ~concurrent_queue_base_v3() {
-<a name="l00427"></a>00427 <span class="preprocessor">#if __TBB_USE_ASSERT</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span> size_t nq = my_rep->n_queue;
-<a name="l00429"></a>00429 <span class="keywordflow">for</span>( size_t i=0; i<nq; i++ )
-<a name="l00430"></a>00430 __TBB_ASSERT( my_rep->array[i].tail_page==NULL, <span class="stringliteral">"pages were not freed properly"</span> );
-<a name="l00431"></a>00431 #endif <span class="comment">/* __TBB_USE_ASSERT */</span>
-<a name="l00432"></a>00432 cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);
-<a name="l00433"></a>00433 }
-<a name="l00434"></a>00434
-<a name="l00436"></a>00436 <span class="keywordtype">void</span> internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00437"></a>00437 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00438"></a>00438 ticket k = r.tail_counter++;
-<a name="l00439"></a>00439 r.choose(k).push( src, k, *<span class="keyword">this</span> );
-<a name="l00440"></a>00440 }
-<a name="l00441"></a>00441
-<a name="l00443"></a>00443
-<a name="l00444"></a>00444 <span class="keywordtype">bool</span> internal_try_pop( <span class="keywordtype">void</span>* dst ) ;
-<a name="l00445"></a>00445
-<a name="l00447"></a>00447 size_t internal_size() <span class="keyword">const </span>;
-<a name="l00448"></a>00448
-<a name="l00450"></a>00450 <span class="keywordtype">bool</span> internal_empty() <span class="keyword">const </span>;
-<a name="l00451"></a>00451
-<a name="l00453"></a>00453 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00454"></a>00454 <span class="keywordtype">void</span> internal_finish_clear() ;
-<a name="l00455"></a>00455
-<a name="l00457"></a>00457 <span class="keywordtype">void</span> internal_throw_exception()<span class="keyword"> const </span>{
-<a name="l00458"></a>00458 throw_exception( eid_bad_alloc );
-<a name="l00459"></a>00459 }
-<a name="l00460"></a>00460
-<a name="l00462"></a>00462 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00463"></a>00463 };
-<a name="l00464"></a>00464
-<a name="l00465"></a>00465 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00466"></a>00466 concurrent_queue_base_v3<T>::concurrent_queue_base_v3( size_t item_size ) {
-<a name="l00467"></a>00467 my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
-<a name="l00468"></a>00468 __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00469"></a>00469 __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00470"></a>00470 __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00471"></a>00471 __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00472"></a>00472 memset(my_rep,0,<span class="keyword">sizeof</span>(concurrent_queue_rep<T>));
-<a name="l00473"></a>00473 my_rep->item_size = item_size;
-<a name="l00474"></a>00474 my_rep->items_per_page = item_size<=8 ? 32 :
-<a name="l00475"></a>00475 item_size<=16 ? 16 :
-<a name="l00476"></a>00476 item_size<=32 ? 8 :
-<a name="l00477"></a>00477 item_size<=64 ? 4 :
-<a name="l00478"></a>00478 item_size<=128 ? 2 :
-<a name="l00479"></a>00479 1;
-<a name="l00480"></a>00480 }
-<a name="l00481"></a>00481
-<a name="l00482"></a>00482 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00483"></a>00483 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_try_pop( <span class="keywordtype">void</span>* dst ) {
-<a name="l00484"></a>00484 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00485"></a>00485 ticket k;
-<a name="l00486"></a>00486 <span class="keywordflow">do</span> {
-<a name="l00487"></a>00487 k = r.head_counter;
-<a name="l00488"></a>00488 <span class="keywordflow">for</span>(;;) {
-<a name="l00489"></a>00489 <span class="keywordflow">if</span>( r.tail_counter<=k ) {
-<a name="l00490"></a>00490 <span class="comment">// Queue is empty </span>
-<a name="l00491"></a>00491 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00492"></a>00492 }
-<a name="l00493"></a>00493 <span class="comment">// Queue had item with ticket k when we looked. Attempt to get that item.</span>
-<a name="l00494"></a>00494 ticket tk=k;
-<a name="l00495"></a>00495 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
-<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span> k = r.head_counter.compare_and_swap( tk+1, tk );
-<a name="l00500"></a>00500 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00502"></a>00502 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00503"></a>00503 <span class="preprocessor"></span> <span class="keywordflow">if</span>( k==tk )
-<a name="l00504"></a>00504 <span class="keywordflow">break</span>;
-<a name="l00505"></a>00505 <span class="comment">// Another thread snatched the item, retry.</span>
-<a name="l00506"></a>00506 }
-<a name="l00507"></a>00507 } <span class="keywordflow">while</span>( !r.choose( k ).pop( dst, k, *<span class="keyword">this</span> ) );
-<a name="l00508"></a>00508 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00509"></a>00509 }
-<a name="l00510"></a>00510
-<a name="l00511"></a>00511 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00512"></a>00512 size_t concurrent_queue_base_v3<T>::internal_size()<span class="keyword"> const </span>{
-<a name="l00513"></a>00513 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00514"></a>00514 __TBB_ASSERT( <span class="keyword">sizeof</span>(ptrdiff_t)<=<span class="keyword">sizeof</span>(size_t), NULL );
-<a name="l00515"></a>00515 ticket hc = r.head_counter;
-<a name="l00516"></a>00516 size_t nie = r.n_invalid_entries;
-<a name="l00517"></a>00517 ticket tc = r.tail_counter;
-<a name="l00518"></a>00518 __TBB_ASSERT( hc!=tc || !nie, NULL );
-<a name="l00519"></a>00519 ptrdiff_t sz = tc-hc-nie;
-<a name="l00520"></a>00520 <span class="keywordflow">return</span> sz<0 ? 0 : size_t(sz);
-<a name="l00521"></a>00521 }
-<a name="l00522"></a>00522
-<a name="l00523"></a>00523 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00524"></a>00524 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_empty()<span class="keyword"> const </span>{
-<a name="l00525"></a>00525 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00526"></a>00526 ticket tc = r.tail_counter;
-<a name="l00527"></a>00527 ticket hc = r.head_counter;
-<a name="l00528"></a>00528 <span class="comment">// if tc!=r.tail_counter, the queue was not empty at some point between the two reads.</span>
-<a name="l00529"></a>00529 <span class="keywordflow">return</span> tc==r.tail_counter && tc==hc+r.n_invalid_entries ;
-<a name="l00530"></a>00530 }
-<a name="l00531"></a>00531
-<a name="l00532"></a>00532 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00533"></a>00533 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::internal_finish_clear() {
-<a name="l00534"></a>00534 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00535"></a>00535 size_t nq = r.n_queue;
-<a name="l00536"></a>00536 <span class="keywordflow">for</span>( size_t i=0; i<nq; ++i ) {
-<a name="l00537"></a>00537 page* tp = r.array[i].tail_page;
-<a name="l00538"></a>00538 <span class="keywordflow">if</span>( is_valid_page(tp) ) {
-<a name="l00539"></a>00539 __TBB_ASSERT( r.array[i].head_page==tp, <span class="stringliteral">"at most one page should remain"</span> );
-<a name="l00540"></a>00540 deallocate_page( tp );
-<a name="l00541"></a>00541 r.array[i].tail_page = NULL;
-<a name="l00542"></a>00542 } <span class="keywordflow">else</span>
-<a name="l00543"></a>00543 __TBB_ASSERT( !is_valid_page(r.array[i].head_page), <span class="stringliteral">"head page pointer corrupt?"</span> );
-<a name="l00544"></a>00544 }
-<a name="l00545"></a>00545 }
-<a name="l00546"></a>00546
-<a name="l00547"></a>00547 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00548"></a>00548 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) {
-<a name="l00549"></a>00549 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00550"></a>00550 r.items_per_page = src.my_rep->items_per_page;
-<a name="l00551"></a>00551
-<a name="l00552"></a>00552 <span class="comment">// copy concurrent_queue_rep.</span>
-<a name="l00553"></a>00553 r.head_counter = src.my_rep->head_counter;
-<a name="l00554"></a>00554 r.tail_counter = src.my_rep->tail_counter;
-<a name="l00555"></a>00555 r.n_invalid_entries = src.my_rep->n_invalid_entries;
-<a name="l00556"></a>00556
-<a name="l00557"></a>00557 <span class="comment">// copy micro_queues</span>
-<a name="l00558"></a>00558 <span class="keywordflow">for</span>( size_t i = 0; i<r.n_queue; ++i )
-<a name="l00559"></a>00559 r.array[i].assign( src.my_rep->array[i], *<span class="keyword">this</span>);
-<a name="l00560"></a>00560
-<a name="l00561"></a>00561 __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter,
-<a name="l00562"></a>00562 <span class="stringliteral">"the source concurrent queue should not be concurrently modified."</span> );
-<a name="l00563"></a>00563 }
-<a name="l00564"></a>00564
-<a name="l00565"></a>00565 <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="l00566"></a>00566
-<a name="l00567"></a>00567 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00568"></a>00568 <span class="keyword">class </span>concurrent_queue_iterator_rep: no_assign {
-<a name="l00569"></a>00569 <span class="keyword">public</span>:
-<a name="l00570"></a>00570 ticket head_counter;
-<a name="l00571"></a>00571 <span class="keyword">const</span> concurrent_queue_base_v3<T>& my_queue;
-<a name="l00572"></a>00572 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];
-<a name="l00573"></a>00573 concurrent_queue_iterator_rep( <span class="keyword">const</span> concurrent_queue_base_v3<T>& queue ) :
-<a name="l00574"></a>00574 head_counter(queue.my_rep->head_counter),
-<a name="l00575"></a>00575 my_queue(queue)
-<a name="l00576"></a>00576 {
-<a name="l00577"></a>00577 <span class="keywordflow">for</span>( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )
-<a name="l00578"></a>00578 array[k] = queue.my_rep->array[k].head_page;
-<a name="l00579"></a>00579 }
-<a name="l00580"></a>00580
-<a name="l00582"></a>00582 <span class="keywordtype">bool</span> get_item( <span class="keywordtype">void</span>*& item, size_t k ) ;
-<a name="l00583"></a>00583 };
-<a name="l00584"></a>00584
-<a name="l00585"></a>00585 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00586"></a>00586 <span class="keywordtype">bool</span> concurrent_queue_iterator_rep<T>::get_item( <span class="keywordtype">void</span>*& item, size_t k ) {
-<a name="l00587"></a>00587 <span class="keywordflow">if</span>( k==my_queue.my_rep->tail_counter ) {
-<a name="l00588"></a>00588 item = NULL;
-<a name="l00589"></a>00589 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00590"></a>00590 } <span class="keywordflow">else</span> {
-<a name="l00591"></a>00591 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
-<a name="l00592"></a>00592 __TBB_ASSERT(p,NULL);
-<a name="l00593"></a>00593 size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
-<a name="l00594"></a>00594 item = static_cast<unsigned char*>(static_cast<void*>(p+1)) + my_queue.my_rep->item_size*i;
-<a name="l00595"></a>00595 <span class="keywordflow">return</span> (p->mask & uintptr_t(1)<<i)!=0;
-<a name="l00596"></a>00596 }
-<a name="l00597"></a>00597 }
-<a name="l00598"></a>00598
-<a name="l00600"></a>00600
-<a name="l00601"></a>00601 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00602"></a>00602 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 : no_assign {
-<a name="l00604"></a>00604
-<a name="l00605"></a>00605 concurrent_queue_iterator_rep<Value>* my_rep;
-<a name="l00606"></a>00606
-<a name="l00607"></a>00607 <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="l00608"></a>00608 <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="l00609"></a>00609
-<a name="l00610"></a>00610 <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="l00611"></a>00611 <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="l00612"></a>00612 <span class="keyword">protected</span>:
-<a name="l00614"></a>00614 <span class="keyword">mutable</span> <span class="keywordtype">void</span>* my_item;
-<a name="l00615"></a>00615
-<a name="l00616"></a>00616 <span class="keyword">public</span>:
-<a name="l00618"></a>00618 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
-<a name="l00619"></a>00619 <span class="preprocessor">#if __GNUC__==4&&__GNUC_MINOR__==3</span>
-<a name="l00620"></a>00620 <span class="preprocessor"></span> <span class="comment">// to get around a possible gcc 4.3 bug</span>
-<a name="l00621"></a>00621 __asm__ __volatile__(<span class="stringliteral">""</span>: : :<span class="stringliteral">"memory"</span>);
-<a name="l00622"></a>00622 <span class="preprocessor">#endif</span>
-<a name="l00623"></a>00623 <span class="preprocessor"></span> }
-<a name="l00624"></a>00624
-<a name="l00626"></a>00626 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
-<a name="l00627"></a>00627 assign(i);
-<a name="l00628"></a>00628 }
-<a name="l00629"></a>00629
-<a name="l00631"></a>00631 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) ;
-<a name="l00632"></a>00632
-<a name="l00633"></a>00633 <span class="keyword">protected</span>:
-<a name="l00635"></a>00635 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) ;
-<a name="l00636"></a>00636
-<a name="l00638"></a>00638 <span class="keywordtype">void</span> advance() ;
-<a name="l00639"></a>00639
-<a name="l00641"></a>00641 ~concurrent_queue_iterator_base_v3() {
-<a name="l00642"></a>00642 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00643"></a>00643 my_rep = NULL;
-<a name="l00644"></a>00644 }
-<a name="l00645"></a>00645 };
-<a name="l00646"></a>00646
-<a name="l00647"></a>00647 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00648"></a>00648 concurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) {
-<a name="l00649"></a>00649 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00650"></a>00650 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>(queue);
-<a name="l00651"></a>00651 size_t k = my_rep->head_counter;
-<a name="l00652"></a>00652 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00653"></a>00653 }
-<a name="l00654"></a>00654
-<a name="l00655"></a>00655 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00656"></a>00656 <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="l00657"></a>00657 <span class="keywordflow">if</span>( my_rep!=other.my_rep ) {
-<a name="l00658"></a>00658 <span class="keywordflow">if</span>( my_rep ) {
-<a name="l00659"></a>00659 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00660"></a>00660 my_rep = NULL;
-<a name="l00661"></a>00661 }
-<a name="l00662"></a>00662 <span class="keywordflow">if</span>( other.my_rep ) {
-<a name="l00663"></a>00663 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00664"></a>00664 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );
-<a name="l00665"></a>00665 }
-<a name="l00666"></a>00666 }
-<a name="l00667"></a>00667 my_item = other.my_item;
-<a name="l00668"></a>00668 }
-<a name="l00669"></a>00669
-<a name="l00670"></a>00670 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00671"></a>00671 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::advance() {
-<a name="l00672"></a>00672 __TBB_ASSERT( my_item, <span class="stringliteral">"attempt to increment iterator past end of queue"</span> );
-<a name="l00673"></a>00673 size_t k = my_rep->head_counter;
-<a name="l00674"></a>00674 <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
-<a name="l00675"></a>00675 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00676"></a>00676 <span class="preprocessor"></span> <span class="keywordtype">void</span>* tmp;
-<a name="l00677"></a>00677 my_rep->get_item(tmp,k);
-<a name="l00678"></a>00678 __TBB_ASSERT( my_item==tmp, NULL );
-<a name="l00679"></a>00679 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00680"></a>00680 size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
-<a name="l00681"></a>00681 <span class="keywordflow">if</span>( i==queue.my_rep->items_per_page-1 ) {
-<a name="l00682"></a>00682 <span class="keyword">typename</span> concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
-<a name="l00683"></a>00683 root = root->next;
-<a name="l00684"></a>00684 }
-<a name="l00685"></a>00685 <span class="comment">// advance k</span>
-<a name="l00686"></a>00686 my_rep->head_counter = ++k;
-<a name="l00687"></a>00687 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00688"></a>00688 }
-<a name="l00689"></a>00689
-<a name="l00690"></a>00690 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00691"></a>00691 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">const</span> concurrent_queue_base_v3<const T>& add_constness( <span class="keyword">const</span> concurrent_queue_base_v3<T>& q )
-<a name="l00692"></a>00692 {
-<a name="l00693"></a>00693 <span class="keywordflow">return</span> *reinterpret_cast<const concurrent_queue_base_v3<const T> *>(&q) ;
-<a name="l00694"></a>00694 }
-<a name="l00695"></a>00695
-<a name="l00696"></a>00696 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00697"></a>00697 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">const</span> concurrent_queue_iterator_base_v3<const T>& add_constness( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<T>& q )
-<a name="l00698"></a>00698 {
-<a name="l00699"></a>00699 <span class="keywordflow">return</span> *reinterpret_cast<const concurrent_queue_iterator_base_v3<const T> *>(&q) ;
-<a name="l00700"></a>00700 }
-<a name="l00701"></a>00701
-<a name="l00703"></a>00703
-<a name="l00705"></a>00705 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00706"></a>00706 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base_v3<Value>,
-<a name="l00707"></a>00707 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00708"></a>00708 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00709"></a>00709 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00710"></a>00710 <span class="keyword">friend</span> class ::tbb::strict_ppl::concurrent_queue;
-<a name="l00711"></a>00711 <span class="preprocessor">#else</span>
-<a name="l00712"></a>00712 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00713"></a>00713 <span class="preprocessor">#endif </span>
-<a name="l00715"></a>00715 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :</span>
-<a name="l00716"></a>00716 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3<Value>(queue)
-<a name="l00717"></a>00717 {
-<a name="l00718"></a>00718 }
-<a name="l00719"></a>00719
-<a name="l00720"></a>00720 template<typename T>
-<a name="l00721"></a>00721 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_base_v3<T>& other ) :
-<a name="l00722"></a>00722 concurrent_queue_iterator_base_v3<Value>(add_constness(other))
-<a name="l00723"></a>00723 {
-<a name="l00724"></a>00724 }
-<a name="l00725"></a>00725
-<a name="l00726"></a>00726 <span class="keyword">public</span>:
-<a name="l00727"></a>00727 concurrent_queue_iterator() {}
-<a name="l00728"></a>00728
-<a name="l00730"></a>00730 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,Value>& other ) :
-<a name="l00731"></a>00731 concurrent_queue_iterator_base_v3<Value>(other)
-<a name="l00732"></a>00732 {
-<a name="l00733"></a>00733 }
-<a name="l00734"></a>00734
-<a name="l00735"></a>00735 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00736"></a>00736 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,T>& other ) :
-<a name="l00737"></a>00737 concurrent_queue_iterator_base_v3<Value>(add_constness(other))
-<a name="l00738"></a>00738 {
-<a name="l00739"></a>00739 }
-<a name="l00740"></a>00740
-<a name="l00742"></a>00742 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00743"></a>00743 assign(other);
-<a name="l00744"></a>00744 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00745"></a>00745 }
-<a name="l00746"></a>00746
-<a name="l00748"></a>00748 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00749"></a>00749 <span class="keywordflow">return</span> *static_cast<Value*>(this->my_item);
-<a name="l00750"></a>00750 }
-<a name="l00751"></a>00751
-<a name="l00752"></a>00752 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00753"></a>00753
-<a name="l00755"></a>00755 concurrent_queue_iterator& operator++() {
-<a name="l00756"></a>00756 this->advance();
-<a name="l00757"></a>00757 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00758"></a>00758 }
-<a name="l00759"></a>00759
-<a name="l00761"></a>00761 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00762"></a>00762 Value* result = &operator*();
-<a name="l00763"></a>00763 operator++();
-<a name="l00764"></a>00764 <span class="keywordflow">return</span> result;
-<a name="l00765"></a>00765 }
-<a name="l00766"></a>00766 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00767"></a>00767
-<a name="l00768"></a>00768
-<a name="l00769"></a>00769 <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="l00770"></a>00770 <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="l00771"></a>00771 <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00772"></a>00772 }
-<a name="l00773"></a>00773
-<a name="l00774"></a>00774 <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="l00775"></a>00775 <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="l00776"></a>00776 <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l00777"></a>00777 }
-<a name="l00778"></a>00778
-<a name="l00779"></a>00779 } <span class="comment">// namespace internal</span>
-<a name="l00780"></a>00780
-<a name="l00782"></a>00782
-<a name="l00783"></a>00783 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00784"></a>00784
-<a name="l00786"></a>00786 <span class="keyword">namespace </span>internal {
-<a name="l00787"></a>00787
-<a name="l00788"></a>00788 <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00789"></a>00789 <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00790"></a>00790 <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00791"></a>00791 <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="l00792"></a>00792
-<a name="l00794"></a>00794
-<a name="l00796"></a>00796 <span class="keyword">class </span>concurrent_queue_base_v3: no_copy {
-<a name="l00798"></a>00798 concurrent_queue_rep* my_rep;
-<a name="l00799"></a>00799
-<a name="l00800"></a>00800 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00801"></a>00801 <span class="keyword">friend</span> <span class="keyword">struct </span>micro_queue;
-<a name="l00802"></a>00802 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer;
-<a name="l00803"></a>00803 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00804"></a>00804 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00805"></a>00805 <span class="keyword">protected</span>:
-<a name="l00807"></a>00807 <span class="keyword">struct </span>page {
-<a name="l00808"></a>00808 page* next;
-<a name="l00809"></a>00809 uintptr_t mask;
-<a name="l00810"></a>00810 };
-<a name="l00811"></a>00811
-<a name="l00813"></a>00813 ptrdiff_t my_capacity;
-<a name="l00814"></a>00814
-<a name="l00816"></a>00816 size_t items_per_page;
-<a name="l00817"></a>00817
-<a name="l00819"></a>00819 size_t item_size;
-<a name="l00820"></a>00820
-<a name="l00821"></a>00821 <span class="keyword">private</span>:
-<a name="l00822"></a>00822 <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="l00823"></a>00823 <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="l00824"></a>00824 <span class="keyword">protected</span>:
-<a name="l00825"></a>00825 __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );
-<a name="l00826"></a>00826 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();
-<a name="l00827"></a>00827
-<a name="l00829"></a>00829 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00830"></a>00830
-<a name="l00832"></a>00832 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_pop( <span class="keywordtype">void</span>* dst );
-<a name="l00833"></a>00833
-<a name="l00835"></a>00835 <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="l00836"></a>00836
-<a name="l00838"></a>00838
-<a name="l00839"></a>00839 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_pop_if_present( <span class="keywordtype">void</span>* dst );
-<a name="l00840"></a>00840
-<a name="l00842"></a>00842 ptrdiff_t __TBB_EXPORTED_METHOD internal_size() <span class="keyword">const</span>;
-<a name="l00843"></a>00843
-<a name="l00845"></a>00845 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_empty() <span class="keyword">const</span>;
-<a name="l00846"></a>00846
-<a name="l00848"></a>00848 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );
-<a name="l00849"></a>00849
-<a name="l00851"></a>00851 <span class="keyword">virtual</span> page *allocate_page() = 0;
-<a name="l00852"></a>00852
-<a name="l00854"></a>00854 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) = 0;
-<a name="l00855"></a>00855
-<a name="l00857"></a>00857 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00858"></a>00858 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_finish_clear() ;
-<a name="l00859"></a>00859
-<a name="l00861"></a>00861 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception() <span class="keyword">const</span>;
-<a name="l00862"></a>00862
-<a name="l00864"></a>00864 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00865"></a>00865
-<a name="l00866"></a>00866 <span class="keyword">private</span>:
-<a name="l00867"></a>00867 <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="l00868"></a>00868 };
-<a name="l00869"></a>00869
-<a name="l00871"></a>00871
-<a name="l00872"></a>00872 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 {
-<a name="l00874"></a>00874
-<a name="l00875"></a>00875 concurrent_queue_iterator_rep* my_rep;
-<a name="l00876"></a>00876
-<a name="l00877"></a>00877 <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="l00878"></a>00878 <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="l00879"></a>00879
-<a name="l00880"></a>00880 <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="l00881"></a>00881 <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="l00882"></a>00882 <span class="keyword">protected</span>:
-<a name="l00884"></a>00884 <span class="keyword">mutable</span> <span class="keywordtype">void</span>* my_item;
-<a name="l00885"></a>00885
-<a name="l00887"></a>00887 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
-<a name="l00888"></a>00888
-<a name="l00890"></a>00890 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
-<a name="l00891"></a>00891 assign(i);
-<a name="l00892"></a>00892 }
-<a name="l00893"></a>00893
-<a name="l00895"></a>00895 __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue );
-<a name="l00896"></a>00896
-<a name="l00898"></a>00898 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i );
-<a name="l00899"></a>00899
-<a name="l00901"></a>00901 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD advance();
-<a name="l00902"></a>00902
-<a name="l00904"></a>00904 __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();
-<a name="l00905"></a>00905 };
-<a name="l00906"></a>00906
-<a name="l00907"></a>00907 <span class="keyword">typedef</span> concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
-<a name="l00908"></a>00908
-<a name="l00910"></a>00910
-<a name="l00912"></a>00912 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00913"></a>00913 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base,
-<a name="l00914"></a>00914 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00915"></a>00915 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00916"></a>00916 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00917"></a>00917 <span class="keyword">friend</span> class ::tbb::concurrent_bounded_queue;
-<a name="l00918"></a>00918
-<a name="l00919"></a>00919 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00920"></a>00920 <span class="keyword">friend</span> class ::tbb::deprecated::concurrent_queue;
-<a name="l00921"></a>00921 <span class="preprocessor">#else</span>
-<a name="l00922"></a>00922 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00923"></a>00923 <span class="preprocessor">#endif </span>
-<a name="l00925"></a>00925 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :</span>
-<a name="l00926"></a>00926 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3(queue)
-<a name="l00927"></a>00927 {
-<a name="l00928"></a>00928 }
-<a name="l00929"></a>00929
-<a name="l00930"></a>00930 <span class="keyword">public</span>:
-<a name="l00931"></a>00931 concurrent_queue_iterator() {}
-<a name="l00932"></a>00932
-<a name="l00935"></a>00935 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00936"></a>00936 concurrent_queue_iterator_base_v3(other)
-<a name="l00937"></a>00937 {}
-<a name="l00938"></a>00938
-<a name="l00940"></a>00940 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00941"></a>00941 assign(other);
-<a name="l00942"></a>00942 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00943"></a>00943 }
-<a name="l00944"></a>00944
-<a name="l00946"></a>00946 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00947"></a>00947 <span class="keywordflow">return</span> *static_cast<Value*>(my_item);
-<a name="l00948"></a>00948 }
-<a name="l00949"></a>00949
-<a name="l00950"></a>00950 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00951"></a>00951
-<a name="l00953"></a>00953 concurrent_queue_iterator& operator++() {
-<a name="l00954"></a>00954 advance();
-<a name="l00955"></a>00955 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00956"></a>00956 }
-<a name="l00957"></a>00957
-<a name="l00959"></a>00959 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00960"></a>00960 Value* result = &operator*();
-<a name="l00961"></a>00961 operator++();
-<a name="l00962"></a>00962 <span class="keywordflow">return</span> result;
-<a name="l00963"></a>00963 }
-<a name="l00964"></a>00964 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00965"></a>00965
-<a name="l00966"></a>00966
-<a name="l00967"></a>00967 <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="l00968"></a>00968 <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="l00969"></a>00969 <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00970"></a>00970 }
-<a name="l00971"></a>00971
-<a name="l00972"></a>00972 <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="l00973"></a>00973 <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="l00974"></a>00974 <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l00975"></a>00975 }
-<a name="l00976"></a>00976
-<a name="l00977"></a>00977 } <span class="comment">// namespace internal;</span>
-<a name="l00978"></a>00978
-<a name="l00980"></a>00980
-<a name="l00981"></a>00981 } <span class="comment">// namespace tbb</span>
-<a name="l00982"></a>00982
-<a name="l00983"></a>00983 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_internal_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00248.html
similarity index 85%
rename from doc/html/a00218.html
rename to doc/html/a00248.html
index ac978cd..471efb5 100644
--- a/doc/html/a00218.html
+++ b/doc/html/a00248.html
@@ -21,40 +21,40 @@
</ul></div>
<h1>scalable_allocator.h File Reference</h1>
<p>
-<a href="a00364.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00424.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="a00237.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="a00267.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="a00166.html">tbb::scalable_allocator< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.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="a00166.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="a00191.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="a00167.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="a00192.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="a00167.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="a00192.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="a00243.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="a00276.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="a00243.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="a00276.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="a00243.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="a00276.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="a00243.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.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="a00243.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.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="a00243.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="a00276.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="a00243.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="a00276.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="a00243.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="a00276.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="a00243.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</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>
@@ -68,7 +68,7 @@ template<typename T, typename U> </td></tr>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00237.html b/doc/html/a00267.html
similarity index 78%
rename from doc/html/a00237.html
rename to doc/html/a00267.html
index 4157a0f..2f17efb 100644
--- a/doc/html/a00237.html
+++ b/doc/html/a00267.html
@@ -25,169 +25,166 @@
<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="a00121.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="a00142.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="a00121.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="a00122.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="a00142.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="a00143.html">atomic</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00122.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="a00123.html">atomic< void * ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00143.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="a00144.html">atomic< void * ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00123.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00123.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.html">blocked_range</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00144.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html">blocked_range</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00127.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00128.html">blocked_range2d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00148.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.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="a00128.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00129.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="a00149.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.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="a00129.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00130.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="a00150.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.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="a00130.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00131.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="a00151.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.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="a00131.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00133.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="a00152.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">combinable</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00133.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00135.html">concurrent_hash_map</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00154.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="a00208.html">tbb_hash_compare</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T. <a href="a00135.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00134.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="a00208.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.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="a00134.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html">concurrent_vector</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00155.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">Concurrent vector container. <a href="a00141.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html">enumerable_thread_specific</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">concurrent_vector</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The thread local class template. <a href="a00143.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>flattened2d</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00162.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html">mutex</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html">mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00172.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html">null_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00150.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html">null_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00174.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html">null_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00152.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00176.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.html">parallel_do_feeder</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00154.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html">parallel_do_feeder</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks. <a href="a00178.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="a00181.html">pre_scan_tag</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks. <a href="a00156.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="a00159.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="a00181.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="a00167.html">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="a00159.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="a00145.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="a00167.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.html">parallel_while</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00145.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.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="a00179.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00193.html">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="a00157.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00168.html">simple_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00193.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00146.html">auto_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00168.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00125.html">auto_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00146.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html">affinity_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00125.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00120.html">affinity_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00141.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html">filter</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00120.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html">filter</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00165.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00209.html">thread_bound_filter</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00144.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.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="a00209.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html">pipeline</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00182.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html">pipeline</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeling that applies filters to items. <a href="a00180.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.html">queuing_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeling that applies filters to items. <a href="a00158.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html">queuing_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00182.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html">queuing_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00160.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">queuing_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <a href="a00184.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.html">recursive_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <a href="a00162.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html">recursive_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00189.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.html">scalable_allocator</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00164.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00166.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="a00191.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00192.html">scalable_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00166.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00167.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="a00192.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.html">spin_mutex</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="a00167.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00169.html">spin_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00194.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.html">spin_rw_mutex_v3</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00169.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00171.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="a00196.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00201.html">task_group_context</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00171.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00175.html">task_group_context</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00201.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html">task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00175.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html">task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00199.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html">empty_task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00174.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html">empty_task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00163.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html">task_list</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00142.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html">task_list</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00176.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00202.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="a00177.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="a00203.html">task_scheduler_init</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class representing reference to tbb scheduler. <a href="a00177.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00178.html">tbb_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class representing reference to tbb scheduler. <a href="a00203.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00178.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.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="a00204.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00205.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="a00179.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00186.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="a00205.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00213.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="a00186.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00187.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="a00213.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00214.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="a00187.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00126.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="a00214.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html">bad_last_alloc</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00126.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00146.html">improper_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00147.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00168.html">improper_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <a href="a00146.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html">missing_wait</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <a href="a00168.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00170.html">missing_wait</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group. <a href="a00148.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.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="a00170.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00169.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="a00147.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.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="a00169.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00206.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="a00180.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00132.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="a00206.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.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="a00132.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.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="a00153.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00171.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="a00149.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00173.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="a00171.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00198.html">split</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00173.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.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="a00198.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00210.html">tick_count</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00183.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00210.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="a00240.html">strict_ppl</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html">strict_ppl</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">For internal use only. <br></td></tr>
@@ -196,99 +193,99 @@
<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="a00241.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="a00274.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="a00241.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00175.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="a00274.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00201.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="a00241.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="a00274.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="a00241.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00168.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="a00274.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00193.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="a00241.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00125.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="a00274.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00125.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00146.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="a00241.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00120.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="a00274.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00120.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00141.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="a00241.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00168.html">simple_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.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="a00241.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00125.html">auto_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.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="a00125.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="a00146.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="a00241.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00120.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.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="a00120.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="a00141.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="a00241.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00175.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="a00274.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00201.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="a00241.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="a00274.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="a00241.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00175.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="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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="a00175.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="a00201.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>
@@ -330,105 +327,105 @@ 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="a00241.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="a00274.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="a00241.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00168.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="a00274.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00168.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.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="a00241.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00125.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="a00274.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00125.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00146.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="a00241.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00120.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="a00274.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00120.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00141.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="a00241.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00168.html">simple_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.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="a00241.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00125.html">auto_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00125.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="a00146.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="a00241.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00120.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00120.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="a00141.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="a00241.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="a00274.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="a00241.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00168.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="a00274.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00168.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.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="a00241.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00125.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="a00274.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00125.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00146.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="a00241.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00120.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="a00274.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00120.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00141.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="a00241.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00168.html">simple_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.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="a00241.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00125.html">auto_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00125.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="a00146.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="a00241.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00120.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00175.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="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00120.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="a00141.html">affinity_partitioner</a> 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="a00241.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="a00274.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="a00241.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00168.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="a00274.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00168.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00193.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="a00241.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00125.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="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00125.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00146.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="a00241.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="a00274.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="a00241.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="a00274.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="a00241.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="a00274.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="a00241.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="a00274.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>
@@ -436,7 +433,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="a00171.html">spin_rw_mutex_v3</a> </td><td class="memItemRight" valign="bottom"><b>spin_rw_mutex</b></td></tr>
+typedef <a class="el" href="a00196.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>
@@ -445,17 +442,17 @@ 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="a00237.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="a00267.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="a00237.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
-<a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
+<a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
+<a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
}</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory fencing. <a href="a00237.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="a00237.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="a00267.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="a00267.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>,
<b>ets_no_key</b>
}</td></tr>
@@ -470,77 +467,64 @@ 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="a00237.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="a00122.html">atomic</a>< T * ></td></tr>
+size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.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="a00143.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="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="a00130.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00130.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="a00151.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00151.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="a00130.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00130.html">cache_aligned_allocator</a>< U > &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4b4d8d820cb2ec18147261226f2dd999"></a><!-- doxytag: member="tbb::tbb_hasher" ref="4b4d8d820cb2ec18147261226f2dd999" args="(const T &t)" -->
-template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">size_t </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a> (const T &t)</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="a00151.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00151.html">cache_aligned_allocator</a>< U > &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Hasher functions. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8f289e50dd0f44bd454acbeeaf368376"></a><!-- doxytag: member="tbb::tbb_hasher" ref="8f289e50dd0f44bd454acbeeaf368376" args="(P *ptr)" -->
-template<typename P> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">size_t </td><td class="memTemplItemRight" valign="bottom"><b>tbb_hasher</b> (P *ptr)</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="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c8af1cda078ee9c708c35271ea9c0d4"></a><!-- doxytag: member="tbb::tbb_hasher" ref="5c8af1cda078ee9c708c35271ea9c0d4" args="(const std::basic_string< E, S, A > &s)" -->
-template<typename E, typename S, typename A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">size_t </td><td class="memTemplItemRight" valign="bottom"><b>tbb_hasher</b> (const std::basic_string< E, S, A > &s)</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="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2b28d6aee7af88e0e2c6571d14cb5f59"></a><!-- doxytag: member="tbb::tbb_hasher" ref="2b28d6aee7af88e0e2c6571d14cb5f59" args="(const std::pair< F, S > &p)" -->
-template<typename F, typename S> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">size_t </td><td class="memTemplItemRight" valign="bottom"><b>tbb_hasher</b> (const std::pair< F, S > &p)</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="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00156.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="a00141.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00141.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="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.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="a00141.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00141.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="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.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="a00141.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00141.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="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.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="a00141.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00141.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="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.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="a00141.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00141.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="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.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="a00141.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00141.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="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.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="a00141.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00141.html">concurrent_vector</a>< T, A > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="cac990ecc7b1d2088bf5d047801d63a5"></a><!-- doxytag: member="tbb::flatten2d" ref="cac990ecc7b1d2088bf5d047801d63a5" args="(const Container &c, const typename Container::const_iterator b, const typename Container::const_iterator e)" -->
-template<typename Container> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">flattened2d< Container > </td><td class="memTemplItemRight" valign="bottom"><b>flatten2d</b> (const Container &c, const typename Container::const_iterator b, const typename Container::const_iterator e)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b327db9f1ccb9bdfcdbacbf07fac6d10"></a><!-- doxytag: member="tbb::flatten2d" ref="b327db9f1ccb9bdfcdbacbf07fac6d10" args="(const Container &c)" -->
-template<typename Container> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">flattened2d< Container > </td><td class="memTemplItemRight" valign="bottom"><b>flatten2d</b> (const Container &c)</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="a00162.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00162.html">concurrent_vector</a>< T, A > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="tbb::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00166.html">scalable_allocator</a>< T > &, const <a class="el" href="a00166.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="a00191.html">scalable_allocator</a>< T > &, const <a class="el" href="a00191.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="a00166.html">scalable_allocator</a>< T > &, const <a class="el" href="a00166.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="a00191.html">scalable_allocator</a>< T > &, const <a class="el" href="a00191.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>
@@ -551,38 +535,33 @@ 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="a00178.html">tbb_allocator</a>< T > &, const <a class="el" href="a00178.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="a00204.html">tbb_allocator</a>< T > &, const <a class="el" href="a00204.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="a00178.html">tbb_allocator</a>< T > &, const <a class="el" href="a00178.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="a00204.html">tbb_allocator</a>< T > &, const <a class="el" href="a00204.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="a00186.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00186.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="a00213.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00213.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="a00186.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00186.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="a00213.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00213.html">zero_allocator</a>< T2, B2 > &b)</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="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a> (<a class="el" href="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler)</td></tr>
+<a class="el" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a> (<a class="el" href="a00267.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="a00237.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="a00267.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="a00237.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="a00267.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="a00184.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00183.html">tick_count</a> &t1, const <a class="el" href="a00183.html">tick_count</a> &t0)</td></tr>
-
-<tr><td colspan="2"><br><h2>Variables</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6902d551186a654ffbf88582d4a0bdfa"></a><!-- doxytag: member="tbb::hash_multiplier" ref="6902d551186a654ffbf88582d4a0bdfa" args="" -->
-static const size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">hash_multiplier</a> = sizeof(size_t)==4? 2654435769U : 11400714819323198485ULL</td></tr>
+<a class="el" href="a00211.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00210.html">tick_count</a> &t1, const <a class="el" href="a00210.html">tick_count</a> &t0)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Hash multiplier. <br></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>
@@ -591,7 +570,7 @@ The namespace tbb contains all components of the library. <hr><h2>Enumeration Ty
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">enum <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a> </td>
+ <td class="memname">enum <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a> </td>
</tr>
</table>
</div>
@@ -680,7 +659,7 @@ The version it returns is determined at runtime, not at compile/link time. So it
</div><p>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00240.html b/doc/html/a00273.html
similarity index 89%
rename from doc/html/a00240.html
rename to doc/html/a00273.html
index 7267c7c..a5b00eb 100644
--- a/doc/html/a00240.html
+++ b/doc/html/a00273.html
@@ -20,39 +20,39 @@
<li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00237.html">tbb</a>::<a class="el" href="a00240.html">strict_ppl</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00273.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="a00139.html">concurrent_queue</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.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="a00139.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00160.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="a00240.html#15c764c70c8a32e7a4b8c291d0cc8dde">parallel_for</a> (Index first, Index last, Index step, 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="a00273.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="a00175.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_for</b> (Index first, Index last, Index step, const Function &f, <a class="el" href="a00201.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="a00240.html#490399525b1e690ec31d6db964c6b272">parallel_for</a> (Index first, Index 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="a00273.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="a00175.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_for</b> (Index first, Index last, const Function &f, <a class="el" href="a00201.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-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00274.html b/doc/html/a00274.html
index 038fe72..f82736c 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>blocked_range.h Source File</title>
+<title>Algorithms</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,114 +11,331 @@
<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>blocked_range.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00040"></a><a class="code" href="a00127.html">00040</a> <span class="keyword">class </span><a class="code" href="a00127.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="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
-<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051
-<a name="l00052"></a><a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
-<a name="l00053"></a>00053
-<a name="l00055"></a><a class="code" href="a00127.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00127.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="a00127.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00127.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="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00127.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00127.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="a00127.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="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00127.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="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00127.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="a00127.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
-<a name="l00087"></a>00087
-<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00127.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00127.html">blocked_range</a>& r, <a class="code" href="a00173.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="a00127.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="a00127.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00127.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00127.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108 r.<a class="code" href="a00127.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> middle;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue>
-<a name="l00113"></a>00113 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range2d;
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue, <span class="keyword">typename</span> PageValue>
-<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range3d;
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 } <span class="comment">// namespace tbb </span>
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range_H */</span>
-</pre></div><hr>
+<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="a00148.html">tbb::blocked_range< Value ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00148.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.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="a00149.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.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="a00150.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="a00181.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="a00181.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="a00167.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="a00167.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.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="a00179.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00193.html">tbb::simple_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00193.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00146.html">tbb::auto_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00146.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html">tbb::filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00165.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00209.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="a00209.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html">tbb::pipeline</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeling that applies filters to items. <a href="a00180.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00198.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="a00198.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="a00274.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="a00274.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="a00274.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="a00274.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="a00274.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="a00146.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="a00274.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="a00141.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="a00274.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="a00274.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="a00146.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="a00274.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="a00141.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="a00274.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="a00274.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="a00274.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00201.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="a00201.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="a00201.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="a00201.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="a00201.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="a00201.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="a00201.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="a00201.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="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
+
+<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.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="a00274.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="a00193.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="a00274.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="a00146.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="a00274.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="a00141.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="a00274.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="a00274.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="a00146.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="a00274.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="a00141.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="a00274.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="a00274.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="a00193.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="a00274.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="a00146.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="a00274.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="a00141.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="a00274.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="a00274.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="a00146.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="a00274.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="a00141.html">affinity_partitioner</a> 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="a00274.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="a00274.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="a00193.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="a00274.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="a00146.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="a00274.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="a00274.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="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
+</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="g49edcf9447cd91a9527a3f8e8512b7aa"></a><!-- doxytag: member="tbb::parallel_sort" ref="g49edcf9447cd91a9527a3f8e8512b7aa" args="(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename RandomAccessIterator, typename Compare> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::parallel_sort </td>
+ <td>(</td>
+ <td class="paramtype">RandomAccessIterator </td>
+ <td class="paramname"> <em>begin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">RandomAccessIterator </td>
+ <td class="paramname"> <em>end</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Compare & </td>
+ <td class="paramname"> <em>comp</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Sorts the data in [begin,end) using the given comparator.
+<p>
+The compare function object is used for all comparisons between elements during sorting. The compare object must define a bool operator() function.
+</div>
+</div><p>
+<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00275.html b/doc/html/a00275.html
index f748339..58f6e66 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>blocked_range2d.h Source File</title>
+<title>Containers</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,100 +11,37 @@
<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>blocked_range2d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range2d_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range2d_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00128.html">00032</a> <span class="keyword">class </span><a class="code" href="a00128.html">blocked_range2d</a> {
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00128.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<RowValue></a> <a class="code" href="a00127.html">row_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<ColValue></a> <a class="code" href="a00127.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="a00127.html">row_range_type</a> my_rows;
-<a name="l00040"></a>00040 <a class="code" href="a00127.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="a00128.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00127.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="a00127.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="a00128.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="a00128.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00128.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="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
-<a name="l00062"></a>00062 }
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00128.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00128.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="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
-<a name="l00067"></a>00067 }
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <a class="code" href="a00128.html">blocked_range2d</a>( <a class="code" href="a00128.html">blocked_range2d</a>& r, <a class="code" href="a00173.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00074"></a>00074 my_cols.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00128.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00128.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="a00128.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00127.html">row_range_type</a>& <a class="code" href="a00128.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="a00128.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00127.html">col_range_type</a>& <a class="code" href="a00128.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
-<a name="l00085"></a>00085 };
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 } <span class="comment">// namespace tbb </span>
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range2d_H */</span>
-</pre></div><hr>
+<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="a00154.html">tbb::combinable< T ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00154.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html">tbb::interface4::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="a00156.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.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="a00160.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.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="a00155.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.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="a00161.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00162.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00164.html">enumerable_thread_specific</a> container. <a href="a00164.html#_details">More...</a><br></td></tr>
+</table>
+<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00276.html b/doc/html/a00276.html
index e92f908..5fd0b2d 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>blocked_range3d.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,118 +11,300 @@
<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>blocked_range3d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range3d_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range3d_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> PageValue, <span class="keyword">typename</span> RowValue=PageValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00129.html">00032</a> <span class="keyword">class </span><a class="code" href="a00129.html">blocked_range3d</a> {
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00129.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<PageValue></a> <a class="code" href="a00127.html">page_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<RowValue></a> <a class="code" href="a00127.html">row_range_type</a>;
-<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<ColValue></a> <a class="code" href="a00127.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="a00127.html">page_range_type</a> my_pages;
-<a name="l00041"></a>00041 <a class="code" href="a00127.html">row_range_type</a> my_rows;
-<a name="l00042"></a>00042 <a class="code" href="a00127.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="a00129.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
-<a name="l00047"></a>00047 RowValue row_begin, RowValue row_end,
-<a name="l00048"></a>00048 ColValue col_begin, ColValue col_end ) :
-<a name="l00049"></a>00049 my_pages(page_begin,page_end),
-<a name="l00050"></a>00050 my_rows(row_begin,row_end),
-<a name="l00051"></a>00051 my_cols(col_begin,col_end)
-<a name="l00052"></a>00052 {
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <a class="code" href="a00129.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00127.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="a00127.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="a00127.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="a00129.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00129.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="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069
-<a name="l00071"></a><a class="code" href="a00129.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00129.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="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <a class="code" href="a00129.html">blocked_range3d</a>( <a class="code" href="a00129.html">blocked_range3d</a>& r, <a class="code" href="a00173.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00082"></a>00082 my_cols.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00129.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00129.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00088"></a>00088 my_cols.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00129.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00129.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="a00129.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00127.html">page_range_type</a>& <a class="code" href="a00129.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="a00129.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00127.html">row_range_type</a>& <a class="code" href="a00129.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="a00129.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00127.html">col_range_type</a>& <a class="code" href="a00129.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
-<a name="l00103"></a>00103
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 } <span class="comment">// namespace tbb </span>
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range3d_H */</span>
-</pre></div><hr>
+<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="a00142.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="a00142.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.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="a00151.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.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="a00152.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.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="a00191.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00192.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="a00192.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.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="a00204.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00205.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="a00205.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00213.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="a00213.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00214.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="a00214.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="a00276.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="a00276.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="a00276.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="a00276.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="a00276.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="a00276.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="a00276.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="a00276.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="a00276.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-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00277.html b/doc/html/a00277.html
index b288d44..bc43e52 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>cache_aligned_allocator.h Source File</title>
+<title>Synchronization</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,127 +11,46 @@
<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>cache_aligned_allocator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_cache_aligned_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_cache_aligned_allocator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 size_t __TBB_EXPORTED_FUNC NFS_GetLineSize();
-<a name="l00034"></a>00034
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC NFS_Allocate( size_t n_element, size_t element_size, <span class="keywordtype">void</span>* hint );
-<a name="l00038"></a>00038
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC NFS_Free( <span class="keywordtype">void</span>* );
-<a name="l00043"></a>00043 }
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</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: 4100)</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="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="a00130.html">00057</a> <span class="keyword">class </span><a class="code" href="a00130.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;
-<a name="l00061"></a>00061 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<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="a00130.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="a00130.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00071"></a>00071 <a class="code" href="a00130.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00130.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="a00130.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00130.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="a00130.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00130.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="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00130.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="a00130.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00130.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="a00130.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00130.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="a00130.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00130.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>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<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="a00131.html">00107</a> <span class="keyword">class </span><a class="code" href="a00130.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="a00130.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="a00130.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00130.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>;}
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 } <span class="comment">// namespace tbb</span>
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_cache_aligned_allocator_H */</span>
-</pre></div><hr>
+<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="a00143.html">tbb::atomic< T ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00143.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.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="a00172.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html">tbb::null_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00174.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html">tbb::null_rw_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00176.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.html">tbb::queuing_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00182.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.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="a00184.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00186.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="a00186.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.html">tbb::recursive_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00189.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.html">tbb::spin_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00194.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.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="a00196.html#_details">More...</a><br></td></tr>
+</table>
+<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00245.html b/doc/html/a00278.html
similarity index 88%
rename from doc/html/a00245.html
rename to doc/html/a00278.html
index 26e71fa..5879d12 100644
--- a/doc/html/a00245.html
+++ b/doc/html/a00278.html
@@ -17,13 +17,13 @@
<h1>Timing</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00183.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="a00210.html">tbb::tick_count</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00183.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00210.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00279.html b/doc/html/a00279.html
index 2ce886a..2fa7494 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>combinable.h Source File</title>
+<title>Task Scheduling</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,83 +11,31 @@
<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>combinable.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_combinable_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_combinable_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb/enumerable_thread_specific.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb/cache_aligned_allocator.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00034"></a><a class="code" href="a00133.html">00034</a> <span class="keyword">class </span><a class="code" href="a00133.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="a00130.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00130.html">my_alloc</a>;
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00143.html">tbb::enumerable_thread_specific<T, my_alloc, ets_no_key></a> <a class="code" href="a00143.html">my_ets_type</a>;
-<a name="l00039"></a>00039 <a class="code" href="a00143.html">my_ets_type</a> 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="a00133.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="a00133.html">combinable</a>( finit _finit) : my_ets(_finit) { }
-<a name="l00047"></a>00047
-<a name="l00049"></a><a class="code" href="a00133.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00133.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
-<a name="l00050"></a>00050 }
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <a class="code" href="a00133.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00133.html">combinable</a>& other) : my_ets(other.my_ets) { }
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 combinable & operator=( <span class="keyword">const</span> combinable & other) { my_ets = other.my_ets; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> clear() { my_ets.<a class="code" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">clear</a>(); }
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 T& local() { <span class="keywordflow">return</span> my_ets.<a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>(); }
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 T& local(<span class="keywordtype">bool</span> & exists) { <span class="keywordflow">return</span> my_ets.<a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>(exists); }
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">template</span>< <span class="keyword">typename</span> FCombine>
-<a name="l00063"></a>00063 T combine(FCombine fcombine) { <span class="keywordflow">return</span> my_ets.<a class="code" href="a00143.html#dd6b27d9c98297220b08732d9087a5a8">combine</a>(fcombine); }
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> FCombine>
-<a name="l00066"></a>00066 <span class="keywordtype">void</span> combine_each(FCombine fcombine) { my_ets.<a class="code" href="a00143.html#4abce9638ef2693d813d820af59bb6e2">combine_each</a>(fcombine); }
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 };
-<a name="l00069"></a>00069 } <span class="comment">// namespace tbb</span>
-<a name="l00070"></a>00070 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_combinable_H */</span>
-</pre></div><hr>
+<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="a00201.html">tbb::task_group_context</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00201.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html">tbb::task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00199.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html">tbb::empty_task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00163.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html">tbb::task_list</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00202.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class representing reference to tbb scheduler. <a href="a00203.html#_details">More...</a><br></td></tr>
+</table>
+<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00280.html b/doc/html/a00280.html
index ffa0b98..94ec695 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>concurrent_hash_map.h Source File</title>
+<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>
@@ -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_hash_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<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-2010 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,1224 +39,898 @@
<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="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 <stdexcept></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <iterator></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <utility></span> <span class="comment">// Need std::pair</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include <cstring></span> <span class="comment">// Need std::memset</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <string></span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_allocator.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 "atomic.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#include <typeinfo></span>
-<a name="l00038"></a>00038 <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
-<a name="l00043"></a>00043 <span class="keyword">namespace </span>internal {
-<a name="l00045"></a>00045 <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="l00047"></a>00047 <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="l00049"></a>00049 <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="l00050"></a>00050 }
-<a name="l00051"></a>00051
-<a name="l00053"></a>00053 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00054"></a>00054 <span class="keyword">struct </span>tbb_hash_compare {
-<a name="l00055"></a>00055 <span class="keyword">static</span> size_t hash( <span class="keyword">const</span> Key& a ) { <span class="keywordflow">return</span> <a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a>(a); }
-<a name="l00056"></a>00056 <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="l00057"></a>00057 };
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">namespace </span>interface4 {
-<a name="l00060"></a>00060
-<a name="l00061"></a>00061 <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="l00062"></a>00062 <span class="keyword">class </span>concurrent_hash_map;
+<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 <new></span>
+<a name="l00031"></a>00031
+<a name="l00032"></a>00032 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00033"></a>00033 <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="l00034"></a>00034 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</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 <iterator></span>
+<a name="l00039"></a>00039
+<a name="l00040"></a>00040 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span>
+<a name="l00044"></a>00044
+<a name="l00045"></a><a class="code" href="a00267.html">00045</a> <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="a00273.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="a00160.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="a00155.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="a00160.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="l00064"></a>00064 <span class="keyword">namespace </span>internal {
-<a name="l00065"></a>00065
+<a name="l00065"></a>00065 <span class="keyword">namespace </span>internal {
<a name="l00066"></a>00066
-<a name="l00068"></a>00068 <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00070"></a>00070 <span class="keyword">struct </span>hash_map_node_base : tbb::internal::no_copy {
-<a name="l00072"></a>00072 <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
-<a name="l00074"></a>00074 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00076"></a>00076 hash_map_node_base *next;
-<a name="l00077"></a>00077 mutex_t mutex;
-<a name="l00078"></a>00078 };
-<a name="l00080"></a>00080 <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="l00082"></a>00082 <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="l00084"></a>00084 <span class="keyword">class </span>hash_map_base {
-<a name="l00085"></a>00085 <span class="keyword">public</span>:
-<a name="l00087"></a>00087 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00089"></a>00089 <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00091"></a>00091 <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00093"></a>00093 <span class="keyword">typedef</span> hash_map_node_base node_base;
-<a name="l00095"></a>00095 <span class="keyword">struct </span>bucket : tbb::internal::no_copy {
-<a name="l00097"></a>00097 <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
-<a name="l00099"></a>00099 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00100"></a>00100 mutex_t mutex;
-<a name="l00101"></a>00101 node_base *node_list;
-<a name="l00102"></a>00102 };
-<a name="l00104"></a>00104 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_block = 1;
-<a name="l00106"></a>00106 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_buckets = 1<<embedded_block;
-<a name="l00108"></a>00108 <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="l00110"></a>00110 <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="l00112"></a>00112 <span class="comment"></span> <span class="keyword">typedef</span> bucket *segment_ptr_t;
-<a name="l00114"></a>00114 <span class="keyword">typedef</span> segment_ptr_t segments_table_t[pointers_per_table];
-<a name="l00116"></a>00116 atomic<hashcode_t> my_mask;
-<a name="l00118"></a>00118 segments_table_t my_table;
-<a name="l00120"></a>00120 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="l00122"></a>00122 <span class="comment"></span> bucket my_embedded_segment[embedded_buckets];
-<a name="l00123"></a>00123
-<a name="l00125"></a>00125 hash_map_base() {
-<a name="l00126"></a>00126 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="l00127"></a>00127 + <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="l00128"></a>00128 + embedded_buckets*<span class="keyword">sizeof</span>(bucket) ); <span class="comment">// n*8 or n*16</span>
-<a name="l00129"></a>00129 <span class="keywordflow">for</span>( size_type i = 0; i < embedded_block; i++ ) <span class="comment">// fill the table</span>
-<a name="l00130"></a>00130 my_table[i] = my_embedded_segment + segment_base(i);
-<a name="l00131"></a>00131 my_mask = embedded_buckets - 1;
-<a name="l00132"></a>00132 __TBB_ASSERT( embedded_block <= first_block, <span class="stringliteral">"The first block number must include embedded blocks"</span>);
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134
-<a name="l00136"></a>00136 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00137"></a>00137 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139
-<a name="l00141"></a>00141 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00142"></a>00142 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144
-<a name="l00146"></a>00146 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00147"></a>00147 <span class="keywordflow">return</span> size_type(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149
-<a name="l00151"></a>00151 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_valid( <span class="keywordtype">void</span> *ptr ) {
-<a name="l00152"></a>00152 <span class="keywordflow">return</span> reinterpret_cast<size_t>(ptr) > size_t(63);
-<a name="l00153"></a>00153 }
-<a name="l00154"></a>00154
-<a name="l00156"></a>00156 <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="l00157"></a>00157 <span class="keywordflow">if</span>( is_initial ) std::memset(ptr, 0, sz*<span class="keyword">sizeof</span>(bucket) );
-<a name="l00158"></a>00158 <span class="keywordflow">else</span> <span class="keywordflow">for</span>(size_type i = 0; i < sz; i++, ptr++) {
-<a name="l00159"></a>00159 *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
-<a name="l00160"></a>00160 ptr->node_list = rehash_req;
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163
-<a name="l00165"></a>00165 <span class="keyword">static</span> <span class="keywordtype">void</span> add_to_bucket( bucket *b, node_base *n ) {
-<a name="l00166"></a>00166 __TBB_ASSERT(b->node_list != rehash_req, NULL);
-<a name="l00167"></a>00167 n->next = b->node_list;
-<a name="l00168"></a>00168 b->node_list = n; <span class="comment">// its under lock and flag is set</span>
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170
-<a name="l00172"></a>00172 <span class="keyword">struct </span>enable_segment_failsafe {
-<a name="l00173"></a>00173 segment_ptr_t *my_segment_ptr;
-<a name="l00174"></a>00174 enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
-<a name="l00175"></a>00175 ~enable_segment_failsafe() {
-<a name="l00176"></a>00176 <span class="keywordflow">if</span>( my_segment_ptr ) *my_segment_ptr = 0; <span class="comment">// indicate no allocation in progress</span>
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00181"></a>00181 <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="l00182"></a>00182 __TBB_ASSERT( k, <span class="stringliteral">"Zero segment must be embedded"</span> );
-<a name="l00183"></a>00183 enable_segment_failsafe watchdog( my_table, k );
-<a name="l00184"></a>00184 cache_aligned_allocator<bucket> alloc;
-<a name="l00185"></a>00185 size_type sz;
-<a name="l00186"></a>00186 __TBB_ASSERT( !is_valid(my_table[k]), <span class="stringliteral">"Wrong concurrent assignment"</span>);
-<a name="l00187"></a>00187 <span class="keywordflow">if</span>( k >= first_block ) {
-<a name="l00188"></a>00188 sz = segment_size( k );
-<a name="l00189"></a>00189 segment_ptr_t ptr = alloc.allocate( sz );
-<a name="l00190"></a>00190 init_buckets( ptr, sz, is_initial );
-<a name="l00191"></a>00191 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00192"></a>00192 <span class="preprocessor"></span> <span class="comment">// TODO: actually, fence and notification are unnecessary here and below</span>
-<a name="l00193"></a>00193 itt_store_pointer_with_release_v3( my_table + k, ptr );
-<a name="l00194"></a>00194 <span class="preprocessor">#else</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span> my_table[k] = ptr;<span class="comment">// my_mask has release fence</span>
-<a name="l00196"></a>00196 <span class="preprocessor">#endif</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span> sz <<= 1;<span class="comment">// double it to get entire capacity of the container</span>
-<a name="l00198"></a>00198 } <span class="keywordflow">else</span> { <span class="comment">// the first block</span>
-<a name="l00199"></a>00199 __TBB_ASSERT( k == embedded_block, <span class="stringliteral">"Wrong segment index"</span> );
-<a name="l00200"></a>00200 sz = segment_size( first_block );
-<a name="l00201"></a>00201 segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
-<a name="l00202"></a>00202 init_buckets( ptr, sz - embedded_buckets, is_initial );
-<a name="l00203"></a>00203 ptr -= segment_base(embedded_block);
-<a name="l00204"></a>00204 <span class="keywordflow">for</span>(segment_index_t i = embedded_block; i < first_block; i++) <span class="comment">// calc the offsets</span>
-<a name="l00205"></a>00205 #<span class="keywordflow">if</span> TBB_USE_THREADING_TOOLS
-<a name="l00206"></a>00206 itt_store_pointer_with_release_v3( my_table + i, ptr + segment_base(i) );
-<a name="l00207"></a>00207 <span class="preprocessor">#else</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span> my_table[i] = ptr + segment_base(i);
-<a name="l00209"></a>00209 <span class="preprocessor">#endif</span>
-<a name="l00210"></a>00210 <span class="preprocessor"></span> }
-<a name="l00211"></a>00211 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span> itt_store_pointer_with_release_v3( &my_mask, (<span class="keywordtype">void</span>*)(sz-1) );
-<a name="l00213"></a>00213 <span class="preprocessor">#else</span>
-<a name="l00214"></a>00214 <span class="preprocessor"></span> my_mask = sz - 1;
-<a name="l00215"></a>00215 <span class="preprocessor">#endif</span>
-<a name="l00216"></a>00216 <span class="preprocessor"></span> watchdog.my_segment_ptr = 0;
-<a name="l00217"></a>00217 }
-<a name="l00218"></a>00218
-<a name="l00220"></a>00220 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="l00221"></a>00221 segment_index_t s = segment_index_of( h );
-<a name="l00222"></a>00222 h -= segment_base(s);
-<a name="l00223"></a>00223 segment_ptr_t seg = my_table[s];
-<a name="l00224"></a>00224 __TBB_ASSERT( is_valid(seg), <span class="stringliteral">"hashcode must be cut by valid mask for allocated segments"</span> );
-<a name="l00225"></a>00225 <span class="keywordflow">return</span> &seg[h];
-<a name="l00226"></a>00226 }
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="comment">// internal serial rehashing helper</span>
-<a name="l00229"></a>00229 <span class="keywordtype">void</span> mark_rehashed_levels( hashcode_t h ) <span class="keywordflow">throw</span> () {
-<a name="l00230"></a>00230 segment_index_t s = segment_index_of( h );
-<a name="l00231"></a>00231 <span class="keywordflow">while</span>( segment_ptr_t seg = my_table[++s] )
-<a name="l00232"></a>00232 <span class="keywordflow">if</span>( seg[h].node_list == rehash_req ) {
-<a name="l00233"></a>00233 seg[h].node_list = empty_rehashed;
-<a name="l00234"></a>00234 mark_rehashed_levels( h + segment_base(s) );
-<a name="l00235"></a>00235 }
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237
-<a name="l00239"></a>00239 <span class="comment">// Splitting into two functions should help inlining</span>
-<a name="l00240"></a>00240 <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="l00241"></a>00241 hashcode_t m_now, m_old = m;
-<a name="l00242"></a>00242 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span> m_now = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l00244"></a>00244 <span class="preprocessor">#else</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span> m_now = my_mask;
-<a name="l00246"></a>00246 <span class="preprocessor">#endif</span>
-<a name="l00247"></a>00247 <span class="preprocessor"></span> <span class="keywordflow">if</span>( m_old != m_now )
-<a name="l00248"></a>00248 <span class="keywordflow">return</span> check_rehashing_collision( h, m_old, m = m_now );
-<a name="l00249"></a>00249 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00250"></a>00250 }
-<a name="l00251"></a>00251
-<a name="l00253"></a>00253 <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="l00254"></a>00254 __TBB_ASSERT(m_old != m, NULL); <span class="comment">// TODO?: m arg could be optimized out by passing h = h&m</span>
-<a name="l00255"></a>00255 <span class="keywordflow">if</span>( (h & m_old) != (h & m) ) { <span class="comment">// mask changed for this hashcode, rare event</span>
-<a name="l00256"></a>00256 <span class="comment">// condition above proves that 'h' has some other bits set beside 'm_old'</span>
-<a name="l00257"></a>00257 <span class="comment">// find next applicable mask after m_old //TODO: look at bsl instruction</span>
-<a name="l00258"></a>00258 <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="l00259"></a>00259 m_old = (m_old<<1) - 1; <span class="comment">// get full mask from a bit</span>
-<a name="l00260"></a>00260 __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
-<a name="l00261"></a>00261 <span class="comment">// check whether it is rehashing/ed</span>
-<a name="l00262"></a>00262 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00263"></a>00263 <span class="preprocessor"></span> <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&( get_bucket(h & m_old)->node_list )) != rehash_req )
-<a name="l00264"></a>00264 <span class="preprocessor">#else</span>
-<a name="l00265"></a>00265 <span class="preprocessor"></span> <span class="keywordflow">if</span>( __TBB_load_with_acquire(get_bucket( h & m_old )->node_list) != rehash_req )
-<a name="l00266"></a>00266 <span class="preprocessor">#endif</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<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 = segment_index_of( mask+1 );
-<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="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00281"></a>00281 <span class="preprocessor"></span> <span class="keywordflow">if</span>( !itt_load_pointer_v3(my_table+new_seg)
-<a name="l00282"></a>00282 #<span class="keywordflow">else</span>
-<a name="l00283"></a>00283 <span class="keywordflow">if</span>( !my_table[new_seg]
-<a name="l00284"></a>00284 #endif
-<a name="l00285"></a>00285 && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
-<a name="l00286"></a>00286 <span class="keywordflow">return</span> new_seg; <span class="comment">// The value must be processed</span>
-<a name="l00287"></a>00287 }
-<a name="l00288"></a>00288 <span class="keywordflow">return</span> 0;
-<a name="l00289"></a>00289 }
-<a name="l00290"></a>00290
-<a name="l00292"></a>00292 <span class="keywordtype">void</span> reserve(size_type buckets) {
-<a name="l00293"></a>00293 <span class="keywordflow">if</span>( !buckets-- ) <span class="keywordflow">return</span>;
-<a name="l00294"></a>00294 <span class="keywordtype">bool</span> is_initial = !my_size;
-<a name="l00295"></a>00295 <span class="keywordflow">for</span>( size_type m = my_mask; buckets > m; m = my_mask )
-<a name="l00296"></a>00296 enable_segment( segment_index_of( m+1 ), is_initial );
-<a name="l00297"></a>00297 }
-<a name="l00299"></a>00299 <span class="keywordtype">void</span> internal_swap(hash_map_base &table) {
-<a name="l00300"></a>00300 std::swap(this->my_mask, table.my_mask);
-<a name="l00301"></a>00301 std::swap(this->my_size, table.my_size);
-<a name="l00302"></a>00302 <span class="keywordflow">for</span>(size_type i = 0; i < embedded_buckets; i++)
-<a name="l00303"></a>00303 std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
-<a name="l00304"></a>00304 <span class="keywordflow">for</span>(size_type i = embedded_block; i < pointers_per_table; i++)
-<a name="l00305"></a>00305 std::swap(this->my_table[i], table.my_table[i]);
-<a name="l00306"></a>00306 }
-<a name="l00307"></a>00307 };
-<a name="l00308"></a>00308
-<a name="l00309"></a>00309 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00310"></a>00310 <span class="keyword">class </span>hash_map_range;
-<a name="l00311"></a>00311
-<a name="l00313"></a>00313
-<a name="l00315"></a>00315 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00316"></a>00316 <span class="keyword">class </span>hash_map_iterator
-<a name="l00317"></a>00317 : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value>
-<a name="l00318"></a>00318 {
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> Container map_type;
-<a name="l00320"></a>00320 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::node node;
-<a name="l00321"></a>00321 <span class="keyword">typedef</span> hash_map_base::node_base node_base;
-<a name="l00322"></a>00322 <span class="keyword">typedef</span> hash_map_base::bucket bucket;
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 <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="l00325"></a>00325 <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="l00326"></a>00326
-<a name="l00327"></a>00327 <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="l00328"></a>00328 <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="l00329"></a>00329
-<a name="l00330"></a>00330 <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="l00331"></a>00331 <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="l00332"></a>00332
-<a name="l00333"></a>00333 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00334"></a>00334 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_iterator;
-<a name="l00335"></a>00335
-<a name="l00336"></a>00336 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00337"></a>00337 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 <span class="keywordtype">void</span> advance_to_next_bucket() { <span class="comment">// TODO?: refactor to iterator_base class</span>
-<a name="l00340"></a>00340 size_t k = my_index+1;
-<a name="l00341"></a>00341 <span class="keywordflow">while</span>( my_bucket && k <= my_map->my_mask ) {
-<a name="l00342"></a>00342 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00343"></a>00343 <span class="keywordflow">if</span>( k& (k-2) ) <span class="comment">// not the beginning of a segment</span>
-<a name="l00344"></a>00344 ++my_bucket;
-<a name="l00345"></a>00345 <span class="keywordflow">else</span> my_bucket = my_map->get_bucket( k );
-<a name="l00346"></a>00346 my_node = static_cast<node*>( my_bucket->node_list );
-<a name="l00347"></a>00347 <span class="keywordflow">if</span>( hash_map_base::is_valid(my_node) ) {
-<a name="l00348"></a>00348 my_index = k; <span class="keywordflow">return</span>;
-<a name="l00349"></a>00349 }
-<a name="l00350"></a>00350 ++k;
-<a name="l00351"></a>00351 }
-<a name="l00352"></a>00352 my_bucket = 0; my_node = 0; my_index = k; <span class="comment">// the end</span>
-<a name="l00353"></a>00353 }
-<a name="l00354"></a>00354 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00355"></a>00355 <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="l00356"></a>00356 <span class="keyword">friend</span> <span class="keyword">class </span>interface4::concurrent_hash_map;
-<a name="l00357"></a>00357 <span class="preprocessor">#else</span>
-<a name="l00358"></a>00358 <span class="preprocessor"></span> <span class="keyword">public</span>: <span class="comment">// workaround</span>
-<a name="l00359"></a>00359 <span class="preprocessor">#endif</span>
-<a name="l00361"></a>00361 <span class="preprocessor"> const Container *my_map;</span>
-<a name="l00362"></a>00362 <span class="preprocessor"></span>
-<a name="l00364"></a>00364 size_t my_index;
-<a name="l00365"></a>00365
-<a name="l00367"></a>00367 <span class="keyword">const</span> bucket *my_bucket;
-<a name="l00368"></a>00368
-<a name="l00370"></a>00370 node *my_node;
-<a name="l00371"></a>00371
-<a name="l00372"></a>00372 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="l00373"></a>00373
-<a name="l00374"></a>00374 <span class="keyword">public</span>:
-<a name="l00376"></a>00376 hash_map_iterator() {}
-<a name="l00377"></a>00377 hash_map_iterator( <span class="keyword">const</span> hash_map_iterator<Container,typename Container::value_type> &other ) :
-<a name="l00378"></a>00378 my_map(other.my_map),
-<a name="l00379"></a>00379 my_index(other.my_index),
-<a name="l00380"></a>00380 my_bucket(other.my_bucket),
-<a name="l00381"></a>00381 my_node(other.my_node)
-<a name="l00382"></a>00382 {}
-<a name="l00383"></a>00383 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00384"></a>00384 __TBB_ASSERT( hash_map_base::is_valid(my_node), <span class="stringliteral">"iterator uninitialized or at end of container?"</span> );
-<a name="l00385"></a>00385 <span class="keywordflow">return</span> my_node->item;
-<a name="l00386"></a>00386 }
-<a name="l00387"></a>00387 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00388"></a>00388 hash_map_iterator& operator++();
-<a name="l00389"></a>00389
-<a name="l00391"></a>00391 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00392"></a>00392 Value* result = &operator*();
-<a name="l00393"></a>00393 operator++();
-<a name="l00394"></a>00394 <span class="keywordflow">return</span> result;
-<a name="l00395"></a>00395 }
-<a name="l00396"></a>00396 };
-<a name="l00397"></a>00397
-<a name="l00398"></a>00398 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00399"></a>00399 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="l00400"></a>00400 my_map(&map),
-<a name="l00401"></a>00401 my_index(index),
-<a name="l00402"></a>00402 my_bucket(b),
-<a name="l00403"></a>00403 my_node( static_cast<node*>(n) )
-<a name="l00404"></a>00404 {
-<a name="l00405"></a>00405 <span class="keywordflow">if</span>( b && !hash_map_base::is_valid(n) )
-<a name="l00406"></a>00406 advance_to_next_bucket();
-<a name="l00407"></a>00407 }
+<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
+<a name="l00236"></a>00236 <span class="keywordflow">if</span>( p ) {
+<a name="l00237"></a>00237 spin_mutex::scoped_lock lock( page_mutex );
+<a name="l00238"></a>00238 page* q = tail_page;
+<a name="l00239"></a>00239 <span class="keywordflow">if</span>( is_valid_page(q) )
+<a name="l00240"></a>00240 q->next = p;
+<a name="l00241"></a>00241 <span class="keywordflow">else</span>
+<a name="l00242"></a>00242 head_page = p;
+<a name="l00243"></a>00243 tail_page = p;
+<a name="l00244"></a>00244 } <span class="keywordflow">else</span> {
+<a name="l00245"></a>00245 p = tail_page;
+<a name="l00246"></a>00246 }
+<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 p->mask |= uintptr_t(1)<<index;
+<a name="l00252"></a>00252 tail_counter += concurrent_queue_rep_base::n_queue;
+<a name="l00253"></a>00253 } __TBB_CATCH (...) {
+<a name="l00254"></a>00254 ++base.my_rep->n_invalid_entries;
+<a name="l00255"></a>00255 tail_counter += concurrent_queue_rep_base::n_queue;
+<a name="l00256"></a>00256 __TBB_RETHROW();
+<a name="l00257"></a>00257 }
+<a name="l00258"></a>00258 }
+<a name="l00259"></a>00259
+<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00261"></a>00261 <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="l00262"></a>00262 k &= -concurrent_queue_rep_base::n_queue;
+<a name="l00263"></a>00263 <span class="keywordflow">if</span>( head_counter!=k ) spin_wait_until_eq( head_counter, k );
+<a name="l00264"></a>00264 <span class="keywordflow">if</span>( tail_counter==k ) spin_wait_while_eq( tail_counter, k );
+<a name="l00265"></a>00265 page& p = *head_page;
+<a name="l00266"></a>00266 __TBB_ASSERT( &p, NULL );
+<a name="l00267"></a>00267 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+<a name="l00268"></a>00268 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>;
+<a name="l00269"></a>00269 {
+<a name="l00270"></a>00270 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="l00271"></a>00271 <span class="keywordflow">if</span>( p.mask & uintptr_t(1)<<index ) {
+<a name="l00272"></a>00272 success = <span class="keyword">true</span>;
+<a name="l00273"></a>00273 assign_and_destroy_item( dst, p, index );
+<a name="l00274"></a>00274 } <span class="keywordflow">else</span> {
+<a name="l00275"></a>00275 --base.my_rep->n_invalid_entries;
+<a name="l00276"></a>00276 }
+<a name="l00277"></a>00277 }
+<a name="l00278"></a>00278 <span class="keywordflow">return</span> success;
+<a name="l00279"></a>00279 }
+<a name="l00280"></a>00280
+<a name="l00281"></a>00281 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00282"></a>00282 micro_queue<T>& micro_queue<T>::assign( <span class="keyword">const</span> micro_queue<T>& src, concurrent_queue_base_v3<T>& base ) {
+<a name="l00283"></a>00283 head_counter = src.head_counter;
+<a name="l00284"></a>00284 tail_counter = src.tail_counter;
+<a name="l00285"></a>00285 page_mutex = src.page_mutex;
+<a name="l00286"></a>00286
+<a name="l00287"></a>00287 <span class="keyword">const</span> page* srcp = src.head_page;
+<a name="l00288"></a>00288 <span class="keywordflow">if</span>( is_valid_page(srcp) ) {
+<a name="l00289"></a>00289 ticket g_index = head_counter;
+<a name="l00290"></a>00290 __TBB_TRY {
+<a name="l00291"></a>00291 size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
+<a name="l00292"></a>00292 size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+<a name="l00293"></a>00293 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="l00294"></a>00294
+<a name="l00295"></a>00295 head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
+<a name="l00296"></a>00296 page* cur_page = head_page;
+<a name="l00297"></a>00297
+<a name="l00298"></a>00298 <span class="keywordflow">if</span>( srcp != src.tail_page ) {
+<a name="l00299"></a>00299 <span class="keywordflow">for</span>( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {
+<a name="l00300"></a>00300 cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index );
+<a name="l00301"></a>00301 cur_page = cur_page->next;
+<a name="l00302"></a>00302 }
+<a name="l00303"></a>00303
+<a name="l00304"></a>00304 __TBB_ASSERT( srcp==src.tail_page, NULL );
+<a name="l00305"></a>00305 size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+<a name="l00306"></a>00306 <span class="keywordflow">if</span>( last_index==0 ) last_index = base.my_rep->items_per_page;
+<a name="l00307"></a>00307
+<a name="l00308"></a>00308 cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
+<a name="l00309"></a>00309 cur_page = cur_page->next;
+<a name="l00310"></a>00310 }
+<a name="l00311"></a>00311 tail_page = cur_page;
+<a name="l00312"></a>00312 } __TBB_CATCH (...) {
+<a name="l00313"></a>00313 invalidate_page_and_rethrow( g_index );
+<a name="l00314"></a>00314 }
+<a name="l00315"></a>00315 } <span class="keywordflow">else</span> {
+<a name="l00316"></a>00316 head_page = tail_page = NULL;
+<a name="l00317"></a>00317 }
+<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 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00322"></a>00322 <span class="keywordtype">void</span> micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
+<a name="l00323"></a>00323 <span class="comment">// Append an invalid page at address 1 so that no more pushes are allowed.</span>
+<a name="l00324"></a>00324 page* invalid_page = (page*)uintptr_t(1);
+<a name="l00325"></a>00325 {
+<a name="l00326"></a>00326 spin_mutex::scoped_lock lock( page_mutex );
+<a name="l00327"></a>00327 tail_counter = k+concurrent_queue_rep_base::n_queue+1;
+<a name="l00328"></a>00328 page* q = tail_page;
+<a name="l00329"></a>00329 <span class="keywordflow">if</span>( is_valid_page(q) )
+<a name="l00330"></a>00330 q->next = invalid_page;
+<a name="l00331"></a>00331 <span class="keywordflow">else</span>
+<a name="l00332"></a>00332 head_page = invalid_page;
+<a name="l00333"></a>00333 tail_page = invalid_page;
+<a name="l00334"></a>00334 }
+<a name="l00335"></a>00335 __TBB_RETHROW();
+<a name="l00336"></a>00336 }
+<a name="l00337"></a>00337
+<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00339"></a>00339 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="l00340"></a>00340 concurrent_queue_page_allocator& pa = base;
+<a name="l00341"></a>00341 page* new_page = pa.allocate_page();
+<a name="l00342"></a>00342 new_page->next = NULL;
+<a name="l00343"></a>00343 new_page->mask = src_page->mask;
+<a name="l00344"></a>00344 <span class="keywordflow">for</span>( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
+<a name="l00345"></a>00345 <span class="keywordflow">if</span>( new_page->mask & uintptr_t(1)<<begin_in_page )
+<a name="l00346"></a>00346 copy_item( *new_page, begin_in_page, *src_page, begin_in_page );
+<a name="l00347"></a>00347 <span class="keywordflow">return</span> new_page;
+<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> T>
+<a name="l00351"></a>00351 <span class="keyword">class </span>micro_queue_pop_finalizer: no_copy {
+<a name="l00352"></a>00352 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
+<a name="l00353"></a>00353 ticket my_ticket;
+<a name="l00354"></a>00354 micro_queue<T>& my_queue;
+<a name="l00355"></a>00355 page* my_page;
+<a name="l00356"></a>00356 concurrent_queue_page_allocator& allocator;
+<a name="l00357"></a>00357 <span class="keyword">public</span>:
+<a name="l00358"></a>00358 micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :
+<a name="l00359"></a>00359 my_ticket(k), my_queue(queue), my_page(p), allocator(b)
+<a name="l00360"></a>00360 {}
+<a name="l00361"></a>00361 ~micro_queue_pop_finalizer() ;
+<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>
+<a name="l00365"></a>00365 micro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {
+<a name="l00366"></a>00366 page* p = my_page;
+<a name="l00367"></a>00367 <span class="keywordflow">if</span>( is_valid_page(p) ) {
+<a name="l00368"></a>00368 spin_mutex::scoped_lock lock( my_queue.page_mutex );
+<a name="l00369"></a>00369 page* q = p->next;
+<a name="l00370"></a>00370 my_queue.head_page = q;
+<a name="l00371"></a>00371 <span class="keywordflow">if</span>( !is_valid_page(q) ) {
+<a name="l00372"></a>00372 my_queue.tail_page = NULL;
+<a name="l00373"></a>00373 }
+<a name="l00374"></a>00374 }
+<a name="l00375"></a>00375 my_queue.head_counter = my_ticket;
+<a name="l00376"></a>00376 <span class="keywordflow">if</span>( is_valid_page(p) ) {
+<a name="l00377"></a>00377 allocator.deallocate_page( p );
+<a name="l00378"></a>00378 }
+<a name="l00379"></a>00379 }
+<a name="l00380"></a>00380
+<a name="l00381"></a>00381 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00382"></a>00382 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span>
+<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4146 is back</span>
+<a name="l00384"></a>00384 <span class="preprocessor"></span>
+<a name="l00385"></a>00385 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_rep ;
+<a name="l00386"></a>00386 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
+<a name="l00387"></a>00387
+<a name="l00389"></a>00389
+<a name="l00392"></a>00392 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00393"></a>00393 <span class="keyword">struct </span>concurrent_queue_rep : <span class="keyword">public</span> concurrent_queue_rep_base {
+<a name="l00394"></a>00394 micro_queue<T> array[n_queue];
+<a name="l00395"></a>00395
+<a name="l00397"></a>00397 <span class="keyword">static</span> size_t index( ticket k ) {
+<a name="l00398"></a>00398 <span class="keywordflow">return</span> k*phi%n_queue;
+<a name="l00399"></a>00399 }
+<a name="l00400"></a>00400
+<a name="l00401"></a>00401 micro_queue<T>& choose( ticket k ) {
+<a name="l00402"></a>00402 <span class="comment">// The formula here approximates LRU in a cache-oblivious way.</span>
+<a name="l00403"></a>00403 <span class="keywordflow">return</span> array[index(k)];
+<a name="l00404"></a>00404 }
+<a name="l00405"></a>00405 };
+<a name="l00406"></a>00406
<a name="l00408"></a>00408
-<a name="l00409"></a>00409 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00410"></a>00410 hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
-<a name="l00411"></a>00411 my_node = static_cast<node*>( my_node->next );
-<a name="l00412"></a>00412 <span class="keywordflow">if</span>( !my_node ) advance_to_next_bucket();
-<a name="l00413"></a>00413 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00414"></a>00414 }
-<a name="l00415"></a>00415
-<a name="l00416"></a>00416 <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="l00417"></a>00417 <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="l00418"></a>00418 <span class="keywordflow">return</span> i.my_node == j.my_node && i.my_map == j.my_map;
-<a name="l00419"></a>00419 }
-<a name="l00420"></a>00420
-<a name="l00421"></a>00421 <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="l00422"></a>00422 <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="l00423"></a>00423 <span class="keywordflow">return</span> i.my_node != j.my_node || i.my_map != j.my_map;
-<a name="l00424"></a>00424 }
-<a name="l00425"></a>00425
+<a name="l00412"></a>00412 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00413"></a>00413 <span class="keyword">class </span>concurrent_queue_base_v3: <span class="keyword">public</span> concurrent_queue_page_allocator {
+<a name="l00415"></a>00415 concurrent_queue_rep<T>* my_rep;
+<a name="l00416"></a>00416
+<a name="l00417"></a>00417 <span class="keyword">friend</span> <span class="keyword">struct </span>concurrent_queue_rep<T>;
+<a name="l00418"></a>00418 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue<T>;
+<a name="l00419"></a>00419 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep<T>;
+<a name="l00420"></a>00420 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3<T>;
+<a name="l00421"></a>00421
+<a name="l00422"></a>00422 <span class="keyword">protected</span>:
+<a name="l00423"></a>00423 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_rep<T>::page page;
+<a name="l00424"></a>00424
+<a name="l00425"></a>00425 <span class="keyword">private</span>:
+<a name="l00426"></a>00426 <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
<a name="l00427"></a>00427
-<a name="l00428"></a>00428 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00429"></a>00429 <span class="keyword">class </span>hash_map_range {
-<a name="l00430"></a>00430 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::map_type map_type;
-<a name="l00431"></a>00431 Iterator my_begin;
-<a name="l00432"></a>00432 Iterator my_end;
-<a name="l00433"></a>00433 <span class="keyword">mutable</span> Iterator my_midpoint;
-<a name="l00434"></a>00434 size_t my_grainsize;
-<a name="l00436"></a>00436 <span class="keywordtype">void</span> set_midpoint() <span class="keyword">const</span>;
-<a name="l00437"></a>00437 <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="l00438"></a>00438 <span class="keyword">public</span>:
-<a name="l00440"></a>00440 <span class="keyword">typedef</span> std::size_t size_type;
-<a name="l00441"></a>00441 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
-<a name="l00442"></a>00442 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::reference reference;
-<a name="l00443"></a>00443 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::difference_type difference_type;
-<a name="l00444"></a>00444 <span class="keyword">typedef</span> Iterator iterator;
+<a name="l00428"></a>00428 <span class="comment">/* override */</span> <span class="keyword">virtual</span> page *allocate_page() {
+<a name="l00429"></a>00429 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00430"></a>00430 size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
+<a name="l00431"></a>00431 <span class="keywordflow">return</span> reinterpret_cast<page*>(allocate_block ( n ));
+<a name="l00432"></a>00432 }
+<a name="l00433"></a>00433
+<a name="l00434"></a>00434 <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="l00435"></a>00435 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00436"></a>00436 size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
+<a name="l00437"></a>00437 deallocate_block( reinterpret_cast<void*>(p), n );
+<a name="l00438"></a>00438 }
+<a name="l00439"></a>00439
+<a name="l00441"></a>00441 <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) = 0;
+<a name="l00442"></a>00442
+<a name="l00444"></a>00444 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *p, size_t n ) = 0;
<a name="l00445"></a>00445
-<a name="l00447"></a>00447 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin==my_end;}
+<a name="l00446"></a>00446 <span class="keyword">protected</span>:
+<a name="l00447"></a>00447 concurrent_queue_base_v3();
<a name="l00448"></a>00448
-<a name="l00450"></a>00450 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00451"></a>00451 <span class="keywordflow">return</span> my_midpoint!=my_end;
-<a name="l00452"></a>00452 }
-<a name="l00454"></a>00454 hash_map_range( hash_map_range& r, split ) :
-<a name="l00455"></a>00455 my_end(r.my_end),
-<a name="l00456"></a>00456 my_grainsize(r.my_grainsize)
-<a name="l00457"></a>00457 {
-<a name="l00458"></a>00458 r.my_end = my_begin = r.my_midpoint;
-<a name="l00459"></a>00459 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00460"></a>00460 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00461"></a>00461 set_midpoint();
-<a name="l00462"></a>00462 r.set_midpoint();
-<a name="l00463"></a>00463 }
-<a name="l00465"></a>00465 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00466"></a>00466 hash_map_range( hash_map_range<U>& r) :
-<a name="l00467"></a>00467 my_begin(r.my_begin),
-<a name="l00468"></a>00468 my_end(r.my_end),
-<a name="l00469"></a>00469 my_midpoint(r.my_midpoint),
-<a name="l00470"></a>00470 my_grainsize(r.my_grainsize)
-<a name="l00471"></a>00471 {}
-<a name="l00472"></a>00472 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00474"></a>00474 <span class="preprocessor"> hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) : </span>
-<a name="l00475"></a>00475 <span class="preprocessor"></span> my_begin(begin_),
-<a name="l00476"></a>00476 my_end(end_),
-<a name="l00477"></a>00477 my_grainsize(grainsize_)
-<a name="l00478"></a>00478 {
-<a name="l00479"></a>00479 <span class="keywordflow">if</span>(!my_end.my_index && !my_end.my_bucket) <span class="comment">// end</span>
-<a name="l00480"></a>00480 my_end.my_index = my_end.my_map->my_mask + 1;
-<a name="l00481"></a>00481 set_midpoint();
-<a name="l00482"></a>00482 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00483"></a>00483 }
-<a name="l00484"></a>00484 <span class="preprocessor">#endif</span>
-<a name="l00486"></a>00486 <span class="preprocessor"> hash_map_range( const map_type &map, size_type grainsize_ = 1 ) : </span>
-<a name="l00487"></a>00487 <span class="preprocessor"></span> my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
-<a name="l00488"></a>00488 my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
-<a name="l00489"></a>00489 my_grainsize( grainsize_ )
-<a name="l00490"></a>00490 {
-<a name="l00491"></a>00491 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00492"></a>00492 set_midpoint();
-<a name="l00493"></a>00493 }
-<a name="l00494"></a>00494 <span class="keyword">const</span> Iterator& begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
-<a name="l00495"></a>00495 <span class="keyword">const</span> Iterator& end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00497"></a>00497 size_type grainsize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00498"></a>00498 };
-<a name="l00499"></a>00499
-<a name="l00500"></a>00500 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00501"></a>00501 <span class="keywordtype">void</span> hash_map_range<Iterator>::set_midpoint()<span class="keyword"> const </span>{
-<a name="l00502"></a>00502 <span class="comment">// Split by groups of nodes</span>
-<a name="l00503"></a>00503 size_t m = my_end.my_index-my_begin.my_index;
-<a name="l00504"></a>00504 <span class="keywordflow">if</span>( m > my_grainsize ) {
-<a name="l00505"></a>00505 m = my_begin.my_index + m/2u;
-<a name="l00506"></a>00506 hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
-<a name="l00507"></a>00507 my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
-<a name="l00508"></a>00508 } <span class="keywordflow">else</span> {
-<a name="l00509"></a>00509 my_midpoint = my_end;
-<a name="l00510"></a>00510 }
-<a name="l00511"></a>00511 __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
-<a name="l00512"></a>00512 <span class="stringliteral">"my_begin is after my_midpoint"</span> );
-<a name="l00513"></a>00513 __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
-<a name="l00514"></a>00514 <span class="stringliteral">"my_midpoint is after my_end"</span> );
-<a name="l00515"></a>00515 __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
-<a name="l00516"></a>00516 <span class="stringliteral">"[my_begin, my_midpoint) range should not be empty"</span> );
-<a name="l00517"></a>00517 }
-<a name="l00518"></a>00518
-<a name="l00519"></a>00519 } <span class="comment">// internal</span>
-<a name="l00521"></a>00521 <span class="comment"></span>
-<a name="l00523"></a><a class="code" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">00523</a> <span class="keyword">static</span> <span class="keyword">const</span> size_t <a class="code" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">hash_multiplier</a> = <span class="keyword">sizeof</span>(size_t)==4? 2654435769U : 11400714819323198485ULL;
-<a name="l00524"></a>00524
-<a name="l00526"></a>00526 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00527"></a><a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">00527</a> <span class="keyword">inline</span> size_t <a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a>( <span class="keyword">const</span> T& t ) {
-<a name="l00528"></a>00528 <span class="keywordflow">return</span> static_cast<size_t>( t ) * <a class="code" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">hash_multiplier</a>;
-<a name="l00529"></a>00529 }
-<a name="l00530"></a>00530 <span class="keyword">template</span><<span class="keyword">typename</span> P>
-<a name="l00531"></a>00531 <span class="keyword">inline</span> size_t tbb_hasher( P* ptr ) {
-<a name="l00532"></a>00532 size_t <span class="keyword">const</span> h = reinterpret_cast<size_t>( ptr );
-<a name="l00533"></a>00533 <span class="keywordflow">return</span> (h >> 3) ^ h;
-<a name="l00534"></a>00534 }
-<a name="l00535"></a>00535 <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="l00536"></a>00536 <span class="keyword">inline</span> size_t <a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a>( <span class="keyword">const</span> std::basic_string<E,S,A>& s ) {
-<a name="l00537"></a>00537 size_t h = 0;
-<a name="l00538"></a>00538 <span class="keywordflow">for</span>( <span class="keyword">const</span> E* c = s.c_str(); *c; c++ )
-<a name="l00539"></a>00539 h = static_cast<size_t>(*c) ^ (h * <a class="code" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">hash_multiplier</a>);
-<a name="l00540"></a>00540 <span class="keywordflow">return</span> h;
-<a name="l00541"></a>00541 }
-<a name="l00542"></a>00542 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> S>
-<a name="l00543"></a>00543 <span class="keyword">inline</span> size_t <a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a>( <span class="keyword">const</span> std::pair<F,S>& p ) {
-<a name="l00544"></a>00544 <span class="keywordflow">return</span> <a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a>(p.first) ^ <a class="code" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb_hasher</a>(p.second);
+<a name="l00449"></a>00449 <span class="comment">/* override */</span> <span class="keyword">virtual</span> ~concurrent_queue_base_v3() {
+<a name="l00450"></a>00450 <span class="preprocessor">#if __TBB_USE_ASSERT</span>
+<a name="l00451"></a>00451 <span class="preprocessor"></span> size_t nq = my_rep->n_queue;
+<a name="l00452"></a>00452 <span class="keywordflow">for</span>( size_t i=0; i<nq; i++ )
+<a name="l00453"></a>00453 __TBB_ASSERT( my_rep->array[i].tail_page==NULL, <span class="stringliteral">"pages were not freed properly"</span> );
+<a name="l00454"></a>00454 #endif <span class="comment">/* __TBB_USE_ASSERT */</span>
+<a name="l00455"></a>00455 cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);
+<a name="l00456"></a>00456 }
+<a name="l00457"></a>00457
+<a name="l00459"></a>00459 <span class="keywordtype">void</span> internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
+<a name="l00460"></a>00460 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00461"></a>00461 ticket k = r.tail_counter++;
+<a name="l00462"></a>00462 r.choose(k).push( src, k, *<span class="keyword">this</span> );
+<a name="l00463"></a>00463 }
+<a name="l00464"></a>00464
+<a name="l00466"></a>00466
+<a name="l00467"></a>00467 <span class="keywordtype">bool</span> internal_try_pop( <span class="keywordtype">void</span>* dst ) ;
+<a name="l00468"></a>00468
+<a name="l00470"></a>00470 size_t internal_size() <span class="keyword">const </span>;
+<a name="l00471"></a>00471
+<a name="l00473"></a>00473 <span class="keywordtype">bool</span> internal_empty() <span class="keyword">const </span>;
+<a name="l00474"></a>00474
+<a name="l00476"></a>00476 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
+<a name="l00477"></a>00477 <span class="keywordtype">void</span> internal_finish_clear() ;
+<a name="l00478"></a>00478
+<a name="l00480"></a>00480 <span class="keywordtype">void</span> internal_throw_exception()<span class="keyword"> const </span>{
+<a name="l00481"></a>00481 throw_exception( eid_bad_alloc );
+<a name="l00482"></a>00482 }
+<a name="l00483"></a>00483
+<a name="l00485"></a>00485 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
+<a name="l00486"></a>00486 };
+<a name="l00487"></a>00487
+<a name="l00488"></a>00488 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00489"></a>00489 concurrent_queue_base_v3<T>::concurrent_queue_base_v3() {
+<a name="l00490"></a>00490 <span class="keyword">const</span> size_t item_size = <span class="keyword">sizeof</span>(T);
+<a name="l00491"></a>00491 my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
+<a name="l00492"></a>00492 __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
+<a name="l00493"></a>00493 __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
+<a name="l00494"></a>00494 __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
+<a name="l00495"></a>00495 __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
+<a name="l00496"></a>00496 memset(my_rep,0,<span class="keyword">sizeof</span>(concurrent_queue_rep<T>));
+<a name="l00497"></a>00497 my_rep->item_size = item_size;
+<a name="l00498"></a>00498 my_rep->items_per_page = item_size<=8 ? 32 :
+<a name="l00499"></a>00499 item_size<=16 ? 16 :
+<a name="l00500"></a>00500 item_size<=32 ? 8 :
+<a name="l00501"></a>00501 item_size<=64 ? 4 :
+<a name="l00502"></a>00502 item_size<=128 ? 2 :
+<a name="l00503"></a>00503 1;
+<a name="l00504"></a>00504 }
+<a name="l00505"></a>00505
+<a name="l00506"></a>00506 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00507"></a>00507 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_try_pop( <span class="keywordtype">void</span>* dst ) {
+<a name="l00508"></a>00508 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00509"></a>00509 ticket k;
+<a name="l00510"></a>00510 <span class="keywordflow">do</span> {
+<a name="l00511"></a>00511 k = r.head_counter;
+<a name="l00512"></a>00512 <span class="keywordflow">for</span>(;;) {
+<a name="l00513"></a>00513 <span class="keywordflow">if</span>( r.tail_counter<=k ) {
+<a name="l00514"></a>00514 <span class="comment">// Queue is empty </span>
+<a name="l00515"></a>00515 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00516"></a>00516 }
+<a name="l00517"></a>00517 <span class="comment">// Queue had item with ticket k when we looked. Attempt to get that item.</span>
+<a name="l00518"></a>00518 ticket tk=k;
+<a name="l00519"></a>00519 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
+<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
+<a name="l00522"></a>00522 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00523"></a>00523 <span class="preprocessor"></span> k = r.head_counter.compare_and_swap( tk+1, tk );
+<a name="l00524"></a>00524 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
+<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00527"></a>00527 <span class="preprocessor"></span> <span class="keywordflow">if</span>( k==tk )
+<a name="l00528"></a>00528 <span class="keywordflow">break</span>;
+<a name="l00529"></a>00529 <span class="comment">// Another thread snatched the item, retry.</span>
+<a name="l00530"></a>00530 }
+<a name="l00531"></a>00531 } <span class="keywordflow">while</span>( !r.choose( k ).pop( dst, k, *<span class="keyword">this</span> ) );
+<a name="l00532"></a>00532 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00533"></a>00533 }
+<a name="l00534"></a>00534
+<a name="l00535"></a>00535 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00536"></a>00536 size_t concurrent_queue_base_v3<T>::internal_size()<span class="keyword"> const </span>{
+<a name="l00537"></a>00537 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00538"></a>00538 __TBB_ASSERT( <span class="keyword">sizeof</span>(ptrdiff_t)<=<span class="keyword">sizeof</span>(size_t), NULL );
+<a name="l00539"></a>00539 ticket hc = r.head_counter;
+<a name="l00540"></a>00540 size_t nie = r.n_invalid_entries;
+<a name="l00541"></a>00541 ticket tc = r.tail_counter;
+<a name="l00542"></a>00542 __TBB_ASSERT( hc!=tc || !nie, NULL );
+<a name="l00543"></a>00543 ptrdiff_t sz = tc-hc-nie;
+<a name="l00544"></a>00544 <span class="keywordflow">return</span> sz<0 ? 0 : size_t(sz);
<a name="l00545"></a>00545 }
<a name="l00546"></a>00546
-<a name="l00548"></a>00548
-<a name="l00577"></a>00577 <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="l00578"></a><a class="code" href="a00135.html">00578</a> <span class="keyword">class </span><a class="code" href="a00135.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
-<a name="l00579"></a>00579 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00580"></a>00580 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
-<a name="l00581"></a>00581
-<a name="l00582"></a>00582 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00583"></a>00583 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_range;
+<a name="l00547"></a>00547 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00548"></a>00548 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_empty()<span class="keyword"> const </span>{
+<a name="l00549"></a>00549 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00550"></a>00550 ticket tc = r.tail_counter;
+<a name="l00551"></a>00551 ticket hc = r.head_counter;
+<a name="l00552"></a>00552 <span class="comment">// if tc!=r.tail_counter, the queue was not empty at some point between the two reads.</span>
+<a name="l00553"></a>00553 <span class="keywordflow">return</span> tc==r.tail_counter && tc==hc+r.n_invalid_entries ;
+<a name="l00554"></a>00554 }
+<a name="l00555"></a>00555
+<a name="l00556"></a>00556 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00557"></a>00557 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::internal_finish_clear() {
+<a name="l00558"></a>00558 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00559"></a>00559 size_t nq = r.n_queue;
+<a name="l00560"></a>00560 <span class="keywordflow">for</span>( size_t i=0; i<nq; ++i ) {
+<a name="l00561"></a>00561 page* tp = r.array[i].tail_page;
+<a name="l00562"></a>00562 <span class="keywordflow">if</span>( is_valid_page(tp) ) {
+<a name="l00563"></a>00563 __TBB_ASSERT( r.array[i].head_page==tp, <span class="stringliteral">"at most one page should remain"</span> );
+<a name="l00564"></a>00564 deallocate_page( tp );
+<a name="l00565"></a>00565 r.array[i].tail_page = NULL;
+<a name="l00566"></a>00566 } <span class="keywordflow">else</span>
+<a name="l00567"></a>00567 __TBB_ASSERT( !is_valid_page(r.array[i].head_page), <span class="stringliteral">"head page pointer corrupt?"</span> );
+<a name="l00568"></a>00568 }
+<a name="l00569"></a>00569 }
+<a name="l00570"></a>00570
+<a name="l00571"></a>00571 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00572"></a>00572 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) {
+<a name="l00573"></a>00573 concurrent_queue_rep<T>& r = *my_rep;
+<a name="l00574"></a>00574 r.items_per_page = src.my_rep->items_per_page;
+<a name="l00575"></a>00575
+<a name="l00576"></a>00576 <span class="comment">// copy concurrent_queue_rep.</span>
+<a name="l00577"></a>00577 r.head_counter = src.my_rep->head_counter;
+<a name="l00578"></a>00578 r.tail_counter = src.my_rep->tail_counter;
+<a name="l00579"></a>00579 r.n_invalid_entries = src.my_rep->n_invalid_entries;
+<a name="l00580"></a>00580
+<a name="l00581"></a>00581 <span class="comment">// copy micro_queues</span>
+<a name="l00582"></a>00582 <span class="keywordflow">for</span>( size_t i = 0; i<r.n_queue; ++i )
+<a name="l00583"></a>00583 r.array[i].assign( src.my_rep->array[i], *<span class="keyword">this</span>);
<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> Key key_type;
-<a name="l00587"></a>00587 <span class="keyword">typedef</span> T mapped_type;
-<a name="l00588"></a>00588 <span class="keyword">typedef</span> std::pair<const Key,T> value_type;
-<a name="l00589"></a>00589 <span class="keyword">typedef</span> hash_map_base::size_type size_type;
-<a name="l00590"></a>00590 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00591"></a>00591 <span class="keyword">typedef</span> value_type *pointer;
-<a name="l00592"></a>00592 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type *const_pointer;
-<a name="l00593"></a>00593 <span class="keyword">typedef</span> value_type &reference;
-<a name="l00594"></a>00594 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type &const_reference;
-<a name="l00595"></a>00595 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
-<a name="l00596"></a>00596 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
-<a name="l00597"></a>00597 <span class="keyword">typedef</span> internal::hash_map_range<iterator> range_type;
-<a name="l00598"></a>00598 <span class="keyword">typedef</span> internal::hash_map_range<const_iterator> const_range_type;
-<a name="l00599"></a>00599 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00600"></a>00600
-<a name="l00601"></a>00601 <span class="keyword">protected</span>:
-<a name="l00602"></a>00602 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00138.html">const_accessor</a>;
-<a name="l00603"></a>00603 <span class="keyword">struct </span>node;
-<a name="l00604"></a>00604 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
-<a name="l00605"></a>00605 node_allocator_type my_allocator;
-<a name="l00606"></a>00606 HashCompare my_hash_compare;
-<a name="l00607"></a>00607
-<a name="l00608"></a>00608 <span class="keyword">struct </span>node : <span class="keyword">public</span> node_base {
-<a name="l00609"></a>00609 value_type item;
-<a name="l00610"></a>00610 node( <span class="keyword">const</span> Key &key ) : item(key, T()) {}
-<a name="l00611"></a>00611 node( <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T &t ) : item(key, t) {}
-<a name="l00612"></a>00612 <span class="comment">// exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17</span>
-<a name="l00613"></a>00613 <span class="keywordtype">void</span> *operator new( size_t <span class="comment">/*size*/</span>, node_allocator_type &a ) {
-<a name="l00614"></a>00614 <span class="keywordtype">void</span> *ptr = a.allocate(1);
-<a name="l00615"></a>00615 <span class="keywordflow">if</span>(!ptr)
-<a name="l00616"></a>00616 tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
-<a name="l00617"></a>00617 <span class="keywordflow">return</span> ptr;
-<a name="l00618"></a>00618 }
-<a name="l00619"></a>00619 <span class="comment">// match placement-new form above to be called if exception thrown in constructor</span>
-<a name="l00620"></a>00620 <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="l00621"></a>00621 };
-<a name="l00622"></a>00622
-<a name="l00623"></a>00623 <span class="keywordtype">void</span> delete_node( node_base *n ) {
-<a name="l00624"></a>00624 my_allocator.destroy( static_cast<node*>(n) );
-<a name="l00625"></a>00625 my_allocator.deallocate( static_cast<node*>(n), 1);
-<a name="l00626"></a>00626 }
-<a name="l00627"></a>00627
-<a name="l00628"></a>00628 node *search_bucket( <span class="keyword">const</span> key_type &key, bucket *b )<span class="keyword"> const </span>{
-<a name="l00629"></a>00629 node *n = static_cast<node*>( b->node_list );
-<a name="l00630"></a>00630 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
-<a name="l00631"></a>00631 n = static_cast<node*>( n->next );
-<a name="l00632"></a>00632 __TBB_ASSERT(n != internal::rehash_req, <span class="stringliteral">"Search can be executed only for rehashed bucket"</span>);
-<a name="l00633"></a>00633 <span class="keywordflow">return</span> n;
-<a name="l00634"></a>00634 }
-<a name="l00635"></a>00635
-<a name="l00637"></a><a class="code" href="a00137.html">00637</a> <span class="keyword">class </span><a class="code" href="a00137.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
-<a name="l00638"></a>00638 <span class="keywordtype">bool</span> my_is_writer; <span class="comment">// TODO: use it from base type</span>
-<a name="l00639"></a>00639 bucket *my_b;
-<a name="l00640"></a>00640 <span class="keyword">public</span>:
-<a name="l00641"></a>00641 <a class="code" href="a00137.html">bucket_accessor</a>( <a class="code" href="a00135.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="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
-<a name="l00643"></a><a class="code" href="a00137.html#7b75959ce5a971b05cfefcbc1d09a022">00643</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00135.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="l00644"></a>00644 my_b = base->get_bucket( h );
-<a name="l00645"></a>00645 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00646"></a>00646 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00647"></a>00647 <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&my_b->node_list) == internal::rehash_req
-<a name="l00648"></a>00648 #<span class="keywordflow">else</span>
-<a name="l00649"></a>00649 <span class="keywordflow">if</span>( __TBB_load_with_acquire(my_b->node_list) == internal::rehash_req
-<a name="l00650"></a>00650 #endif
-<a name="l00651"></a>00651 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
-<a name="l00652"></a>00652 {
-<a name="l00653"></a>00653 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00135.html#f2fe44bde2158a2f2a315c6457ebd030">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
-<a name="l00654"></a>00654 my_is_writer = <span class="keyword">true</span>;
-<a name="l00655"></a>00655 }
-<a name="l00656"></a>00656 <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, <span class="comment">/*write=*/</span>my_is_writer = writer );
-<a name="l00657"></a>00657 __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
-<a name="l00658"></a>00658 }
-<a name="l00660"></a><a class="code" href="a00137.html#adf8e405df5787351fe816c42042b9ec">00660</a> <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> my_is_writer; }
-<a name="l00662"></a><a class="code" href="a00137.html#7e98ad1b46ed35fb4a92d65c16c6982d">00662</a> bucket *operator() () { <span class="keywordflow">return</span> my_b; }
-<a name="l00663"></a>00663 <span class="comment">// TODO: optimize out</span>
-<a name="l00664"></a>00664 <span class="keywordtype">bool</span> upgrade_to_writer() { my_is_writer = <span class="keyword">true</span>; <span class="keywordflow">return</span> bucket::scoped_t::upgrade_to_writer(); }
-<a name="l00665"></a>00665 };
-<a name="l00666"></a>00666
-<a name="l00667"></a>00667 <span class="comment">// TODO refactor to hash_base</span>
-<a name="l00668"></a>00668 <span class="keywordtype">void</span> rehash_bucket( bucket *b_new, <span class="keyword">const</span> hashcode_t h ) {
-<a name="l00669"></a>00669 __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), <span class="stringliteral">"b_new must be locked (for write)"</span>);
-<a name="l00670"></a>00670 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l00671"></a>00671 __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); <span class="comment">// mark rehashed</span>
-<a name="l00672"></a>00672 hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l00673"></a>00673
-<a name="l00674"></a>00674 bucket_accessor b_old( <span class="keyword">this</span>, h & mask );
-<a name="l00675"></a>00675
-<a name="l00676"></a>00676 mask = (mask<<1) | 1; <span class="comment">// get full mask for new bucket</span>
-<a name="l00677"></a>00677 __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
-<a name="l00678"></a>00678 restart:
-<a name="l00679"></a>00679 <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="l00680"></a>00680 hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l00681"></a>00681 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00682"></a>00682 <span class="preprocessor"></span> hashcode_t bmask = h & (mask>>1);
-<a name="l00683"></a>00683 bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; <span class="comment">// minimal mask of parent bucket</span>
-<a name="l00684"></a>00684 __TBB_ASSERT( (c & bmask) == (h & bmask), <span class="stringliteral">"hash() function changed for key in table"</span> );
-<a name="l00685"></a>00685 <span class="preprocessor">#endif</span>
-<a name="l00686"></a>00686 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (c & mask) == h ) {
-<a name="l00687"></a>00687 <span class="keywordflow">if</span>( !b_old.is_writer() )
-<a name="l00688"></a>00688 <span class="keywordflow">if</span>( !b_old.upgrade_to_writer() ) {
-<a name="l00689"></a>00689 <span class="keywordflow">goto</span> restart; <span class="comment">// node ptr can be invalid due to concurrent erase</span>
-<a name="l00690"></a>00690 }
-<a name="l00691"></a>00691 *p = n->next; <span class="comment">// exclude from b_old</span>
-<a name="l00692"></a>00692 add_to_bucket( b_new, n );
-<a name="l00693"></a>00693 } <span class="keywordflow">else</span> p = &n->next; <span class="comment">// iterate to next item</span>
-<a name="l00694"></a>00694 }
-<a name="l00695"></a>00695 }
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 <span class="keyword">public</span>:
-<a name="l00698"></a>00698
-<a name="l00699"></a>00699 <span class="keyword">class </span>accessor;
-<a name="l00701"></a><a class="code" href="a00138.html">00701</a> <span class="keyword">class </span><a class="code" href="a00138.html">const_accessor</a> {
-<a name="l00702"></a>00702 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00135.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
-<a name="l00703"></a>00703 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00136.html">accessor</a>;
-<a name="l00704"></a>00704 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00136.html">accessor</a> & ) <span class="keyword">const</span>; <span class="comment">// Deny access</span>
-<a name="l00705"></a>00705 <a class="code" href="a00138.html">const_accessor</a>( <span class="keyword">const</span> <a class="code" href="a00136.html">accessor</a> & ); <span class="comment">// Deny access</span>
-<a name="l00706"></a>00706 <span class="keyword">public</span>:
-<a name="l00708"></a><a class="code" href="a00138.html#b5de4197079009b1cfd8bdeb594c6428">00708</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="l00709"></a>00709
-<a name="l00711"></a><a class="code" href="a00138.html#e55c7c3f0acd7fd823a07957e71a7462">00711</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
-<a name="l00712"></a>00712
-<a name="l00714"></a><a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">00714</a> <span class="keywordtype">void</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00715"></a>00715 <span class="keywordflow">if</span>( my_node ) {
-<a name="l00716"></a>00716 my_lock.release();
-<a name="l00717"></a>00717 my_node = 0;
-<a name="l00718"></a>00718 }
-<a name="l00719"></a>00719 }
+<a name="l00585"></a>00585 __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter,
+<a name="l00586"></a>00586 <span class="stringliteral">"the source concurrent queue should not be concurrently modified."</span> );
+<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> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
+<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">class </span>concurrent_queue_iterator_rep: no_assign {
+<a name="l00593"></a>00593 <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
+<a name="l00594"></a>00594 <span class="keyword">public</span>:
+<a name="l00595"></a>00595 ticket head_counter;
+<a name="l00596"></a>00596 <span class="keyword">const</span> concurrent_queue_base_v3<T>& my_queue;
+<a name="l00597"></a>00597 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];
+<a name="l00598"></a>00598 concurrent_queue_iterator_rep( <span class="keyword">const</span> concurrent_queue_base_v3<T>& queue ) :
+<a name="l00599"></a>00599 head_counter(queue.my_rep->head_counter),
+<a name="l00600"></a>00600 my_queue(queue)
+<a name="l00601"></a>00601 {
+<a name="l00602"></a>00602 <span class="keywordflow">for</span>( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )
+<a name="l00603"></a>00603 array[k] = queue.my_rep->array[k].head_page;
+<a name="l00604"></a>00604 }
+<a name="l00605"></a>00605
+<a name="l00607"></a>00607 <span class="keywordtype">bool</span> get_item( T*& item, size_t k ) ;
+<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>
+<a name="l00611"></a>00611 <span class="keywordtype">bool</span> concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
+<a name="l00612"></a>00612 <span class="keywordflow">if</span>( k==my_queue.my_rep->tail_counter ) {
+<a name="l00613"></a>00613 item = NULL;
+<a name="l00614"></a>00614 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00615"></a>00615 } <span class="keywordflow">else</span> {
+<a name="l00616"></a>00616 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
+<a name="l00617"></a>00617 __TBB_ASSERT(p,NULL);
+<a name="l00618"></a>00618 size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
+<a name="l00619"></a>00619 item = µ_queue<T>::get_ref(*p,i);
+<a name="l00620"></a>00620 <span class="keywordflow">return</span> (p->mask & uintptr_t(1)<<i)!=0;
+<a name="l00621"></a>00621 }
+<a name="l00622"></a>00622 }
+<a name="l00623"></a>00623
+<a name="l00625"></a>00625
+<a name="l00626"></a>00626 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
+<a name="l00627"></a>00627 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 : no_assign {
+<a name="l00629"></a>00629
+<a name="l00630"></a>00630 concurrent_queue_iterator_rep<Value>* my_rep;
+<a name="l00631"></a>00631
+<a name="l00632"></a>00632 <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="l00633"></a>00633 <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="l00634"></a>00634
+<a name="l00635"></a>00635 <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="l00636"></a>00636 <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="l00637"></a>00637 <span class="keyword">protected</span>:
+<a name="l00639"></a>00639 Value* my_item;
+<a name="l00640"></a>00640
+<a name="l00642"></a>00642 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
+<a name="l00643"></a>00643 <span class="preprocessor">#if __GNUC__==4&&__GNUC_MINOR__==3</span>
+<a name="l00644"></a>00644 <span class="preprocessor"></span> <span class="comment">// to get around a possible gcc 4.3 bug</span>
+<a name="l00645"></a>00645 __asm__ __volatile__(<span class="stringliteral">""</span>: : :<span class="stringliteral">"memory"</span>);
+<a name="l00646"></a>00646 <span class="preprocessor">#endif</span>
+<a name="l00647"></a>00647 <span class="preprocessor"></span> }
+<a name="l00648"></a>00648
+<a name="l00650"></a>00650 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i )
+<a name="l00651"></a>00651 : no_assign(), my_rep(NULL), my_item(NULL) {
+<a name="l00652"></a>00652 assign(i);
+<a name="l00653"></a>00653 }
+<a name="l00654"></a>00654
+<a name="l00656"></a>00656 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) ;
+<a name="l00657"></a>00657
+<a name="l00659"></a>00659 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) ;
+<a name="l00660"></a>00660
+<a name="l00662"></a>00662 <span class="keywordtype">void</span> advance() ;
+<a name="l00663"></a>00663
+<a name="l00665"></a>00665 ~concurrent_queue_iterator_base_v3() {
+<a name="l00666"></a>00666 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
+<a name="l00667"></a>00667 my_rep = NULL;
+<a name="l00668"></a>00668 }
+<a name="l00669"></a>00669 };
+<a name="l00670"></a>00670
+<a name="l00671"></a>00671 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
+<a name="l00672"></a>00672 concurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) {
+<a name="l00673"></a>00673 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
+<a name="l00674"></a>00674 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>(queue);
+<a name="l00675"></a>00675 size_t k = my_rep->head_counter;
+<a name="l00676"></a>00676 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
+<a name="l00677"></a>00677 }
+<a name="l00678"></a>00678
+<a name="l00679"></a>00679 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
+<a name="l00680"></a>00680 <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="l00681"></a>00681 <span class="keywordflow">if</span>( my_rep!=other.my_rep ) {
+<a name="l00682"></a>00682 <span class="keywordflow">if</span>( my_rep ) {
+<a name="l00683"></a>00683 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
+<a name="l00684"></a>00684 my_rep = NULL;
+<a name="l00685"></a>00685 }
+<a name="l00686"></a>00686 <span class="keywordflow">if</span>( other.my_rep ) {
+<a name="l00687"></a>00687 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
+<a name="l00688"></a>00688 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );
+<a name="l00689"></a>00689 }
+<a name="l00690"></a>00690 }
+<a name="l00691"></a>00691 my_item = other.my_item;
+<a name="l00692"></a>00692 }
+<a name="l00693"></a>00693
+<a name="l00694"></a>00694 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
+<a name="l00695"></a>00695 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::advance() {
+<a name="l00696"></a>00696 __TBB_ASSERT( my_item, <span class="stringliteral">"attempt to increment iterator past end of queue"</span> );
+<a name="l00697"></a>00697 size_t k = my_rep->head_counter;
+<a name="l00698"></a>00698 <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
+<a name="l00699"></a>00699 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00700"></a>00700 <span class="preprocessor"></span> Value* tmp;
+<a name="l00701"></a>00701 my_rep->get_item(tmp,k);
+<a name="l00702"></a>00702 __TBB_ASSERT( my_item==tmp, NULL );
+<a name="l00703"></a>00703 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00704"></a>00704 size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
+<a name="l00705"></a>00705 <span class="keywordflow">if</span>( i==queue.my_rep->items_per_page-1 ) {
+<a name="l00706"></a>00706 <span class="keyword">typename</span> concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
+<a name="l00707"></a>00707 root = root->next;
+<a name="l00708"></a>00708 }
+<a name="l00709"></a>00709 <span class="comment">// advance k</span>
+<a name="l00710"></a>00710 my_rep->head_counter = ++k;
+<a name="l00711"></a>00711 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
+<a name="l00712"></a>00712 }
+<a name="l00713"></a>00713
+<a name="l00715"></a>00715
+<a name="l00716"></a>00716 <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="l00717"></a>00717 <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="l00718"></a>00718 <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="l00719"></a>00719 <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="l00720"></a>00720
-<a name="l00722"></a><a class="code" href="a00138.html#d95b7a39a08b7ab256dfff2ca37cdb75">00722</a> const_reference operator*()<span class="keyword"> const </span>{
-<a name="l00723"></a>00723 __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00724"></a>00724 <span class="keywordflow">return</span> my_node->item;
-<a name="l00725"></a>00725 }
-<a name="l00726"></a>00726
-<a name="l00728"></a><a class="code" href="a00138.html#6fc0491f6420ffe38c48786e7b9ab042">00728</a> const_pointer operator->()<span class="keyword"> const </span>{
-<a name="l00729"></a>00729 <span class="keywordflow">return</span> &operator*();
-<a name="l00730"></a>00730 }
-<a name="l00731"></a>00731
-<a name="l00733"></a><a class="code" href="a00138.html#6eedb35a3ca397dd289ed5ca6fb4d95d">00733</a> <a class="code" href="a00138.html">const_accessor</a>() : my_node(NULL) {}
-<a name="l00734"></a>00734
-<a name="l00736"></a><a class="code" href="a00138.html#e002771760f510e06c03e0a198286172">00736</a> ~<a class="code" href="a00138.html">const_accessor</a>() {
-<a name="l00737"></a>00737 my_node = NULL; <span class="comment">// my_lock.release() is called in scoped_lock destructor</span>
-<a name="l00738"></a>00738 }
-<a name="l00739"></a>00739 <span class="keyword">private</span>:
-<a name="l00740"></a>00740 node *my_node;
-<a name="l00741"></a>00741 <span class="keyword">typename</span> node::scoped_t my_lock;
-<a name="l00742"></a>00742 hashcode_t my_hash;
-<a name="l00743"></a>00743 };
-<a name="l00744"></a>00744
-<a name="l00746"></a><a class="code" href="a00136.html">00746</a> <span class="keyword">class </span><a class="code" href="a00136.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00138.html">const_accessor</a> {
-<a name="l00747"></a>00747 <span class="keyword">public</span>:
-<a name="l00749"></a><a class="code" href="a00136.html#34035ddb9e2a27f2f0a1f6a2a16730cf">00749</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00750"></a>00750
-<a name="l00752"></a><a class="code" href="a00136.html#03a091f7355a3c0c03f839893695f372">00752</a> reference operator*()<span class="keyword"> const </span>{
-<a name="l00753"></a>00753 __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00754"></a>00754 <span class="keywordflow">return</span> this->my_node->item;
-<a name="l00755"></a>00755 }
+<a name="l00722"></a>00722
+<a name="l00724"></a>00724 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00725"></a>00725 <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="l00726"></a>00726 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
+<a name="l00727"></a>00727 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
+<a name="l00728"></a>00728 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00729"></a>00729 <span class="keyword">friend</span> class ::tbb::strict_ppl::concurrent_queue;
+<a name="l00730"></a>00730 <span class="preprocessor">#else</span>
+<a name="l00731"></a>00731 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
+<a name="l00732"></a>00732 <span class="preprocessor">#endif </span>
+<a name="l00734"></a>00734 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :</span>
+<a name="l00735"></a>00735 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)
+<a name="l00736"></a>00736 {
+<a name="l00737"></a>00737 }
+<a name="l00738"></a>00738
+<a name="l00739"></a>00739 <span class="keyword">public</span>:
+<a name="l00740"></a>00740 concurrent_queue_iterator() {}
+<a name="l00741"></a>00741
+<a name="l00742"></a>00742 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
+<a name="l00743"></a>00743 concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)
+<a name="l00744"></a>00744 {}
+<a name="l00745"></a>00745
+<a name="l00747"></a>00747 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
+<a name="l00748"></a>00748 assign(other);
+<a name="l00749"></a>00749 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00750"></a>00750 }
+<a name="l00751"></a>00751
+<a name="l00753"></a>00753 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00754"></a>00754 <span class="keywordflow">return</span> *static_cast<Value*>(this->my_item);
+<a name="l00755"></a>00755 }
<a name="l00756"></a>00756
-<a name="l00758"></a><a class="code" href="a00136.html#302f02e5deec0a67b872e9cfb08d9e60">00758</a> pointer operator->()<span class="keyword"> const </span>{
-<a name="l00759"></a>00759 <span class="keywordflow">return</span> &operator*();
-<a name="l00760"></a>00760 }
-<a name="l00761"></a>00761 };
-<a name="l00762"></a>00762
-<a name="l00764"></a><a class="code" href="a00135.html#342582ba05d9fb893ed80875d2b7a42f">00764</a> <a class="code" href="a00135.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00765"></a>00765 : my_allocator(a)
-<a name="l00766"></a>00766 {}
-<a name="l00767"></a>00767
-<a name="l00769"></a><a class="code" href="a00135.html#c1bf3c669935aceb1dc0169e3a19e0be">00769</a> <a class="code" href="a00135.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00770"></a>00770 : my_allocator(a)
-<a name="l00771"></a>00771 {
-<a name="l00772"></a>00772 reserve( n );
-<a name="l00773"></a>00773 }
-<a name="l00774"></a>00774
-<a name="l00776"></a><a class="code" href="a00135.html#bc50f7bca65d0c27cbf5c31d2fa63eac">00776</a> <a class="code" href="a00135.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00135.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00777"></a>00777 : my_allocator(a)
-<a name="l00778"></a>00778 {
-<a name="l00779"></a>00779 internal_copy(table);
-<a name="l00780"></a>00780 }
-<a name="l00781"></a>00781
-<a name="l00783"></a>00783 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00784"></a><a class="code" href="a00135.html#b5132202dff9ee3d619bef6b1d84edea">00784</a> <a class="code" href="a00135.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00785"></a>00785 : my_allocator(a)
-<a name="l00786"></a>00786 {
-<a name="l00787"></a>00787 reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
-<a name="l00788"></a>00788 internal_copy(first, last);
-<a name="l00789"></a>00789 }
-<a name="l00790"></a>00790
-<a name="l00792"></a><a class="code" href="a00135.html#adadeb9d1acb8c3b34517435666cf297">00792</a> <a class="code" href="a00135.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00135.html">concurrent_hash_map</a>& table ) {
-<a name="l00793"></a>00793 <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
-<a name="l00794"></a>00794 clear();
-<a name="l00795"></a>00795 internal_copy(table);
-<a name="l00796"></a>00796 }
-<a name="l00797"></a>00797 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00798"></a>00798 }
+<a name="l00757"></a>00757 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00758"></a>00758
+<a name="l00760"></a>00760 concurrent_queue_iterator& operator++() {
+<a name="l00761"></a>00761 this->advance();
+<a name="l00762"></a>00762 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00763"></a>00763 }
+<a name="l00764"></a>00764
+<a name="l00766"></a>00766 Value* operator++(<span class="keywordtype">int</span>) {
+<a name="l00767"></a>00767 Value* result = &operator*();
+<a name="l00768"></a>00768 operator++();
+<a name="l00769"></a>00769 <span class="keywordflow">return</span> result;
+<a name="l00770"></a>00770 }
+<a name="l00771"></a>00771 }; <span class="comment">// concurrent_queue_iterator</span>
+<a name="l00772"></a>00772
+<a name="l00773"></a>00773
+<a name="l00774"></a>00774 <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="l00775"></a>00775 <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="l00776"></a>00776 <span class="keywordflow">return</span> i.my_item==j.my_item;
+<a name="l00777"></a>00777 }
+<a name="l00778"></a>00778
+<a name="l00779"></a>00779 <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="l00780"></a>00780 <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="l00781"></a>00781 <span class="keywordflow">return</span> i.my_item!=j.my_item;
+<a name="l00782"></a>00782 }
+<a name="l00783"></a>00783
+<a name="l00784"></a>00784 } <span class="comment">// namespace internal</span>
+<a name="l00785"></a>00785
+<a name="l00787"></a>00787
+<a name="l00788"></a>00788 } <span class="comment">// namespace strict_ppl</span>
+<a name="l00789"></a>00789
+<a name="l00791"></a>00791 <span class="keyword">namespace </span>internal {
+<a name="l00792"></a>00792
+<a name="l00793"></a>00793 <span class="keyword">class </span>concurrent_queue_rep;
+<a name="l00794"></a>00794 <span class="keyword">class </span>concurrent_queue_iterator_rep;
+<a name="l00795"></a>00795 <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
+<a name="l00796"></a>00796 <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="l00797"></a>00797
<a name="l00799"></a>00799
-<a name="l00800"></a>00800
-<a name="l00802"></a>00802
-<a name="l00804"></a>00804 <span class="keywordtype">void</span> rehash(size_type n = 0);
-<a name="l00805"></a>00805
-<a name="l00807"></a>00807 <span class="keywordtype">void</span> clear();
-<a name="l00808"></a>00808
-<a name="l00810"></a><a class="code" href="a00135.html#5e96649f71f68f3b6bf3b1eee6b441a7">00810</a> ~<a class="code" href="a00135.html">concurrent_hash_map</a>() { clear(); }
-<a name="l00811"></a>00811
-<a name="l00812"></a>00812 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00813"></a>00813 <span class="comment">// Parallel algorithm support</span>
-<a name="l00814"></a>00814 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00815"></a>00815 range_type range( size_type grainsize=1 ) {
-<a name="l00816"></a>00816 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00817"></a>00817 }
-<a name="l00818"></a>00818 const_range_type range( size_type grainsize=1 )<span class="keyword"> const </span>{
-<a name="l00819"></a>00819 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00820"></a>00820 }
-<a name="l00821"></a>00821
-<a name="l00822"></a>00822 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00823"></a>00823 <span class="comment">// STL support - not thread-safe methods</span>
-<a name="l00824"></a>00824 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00825"></a>00825 iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00826"></a>00826 iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00827"></a>00827 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="l00828"></a>00828 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="l00829"></a>00829 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="l00830"></a>00830 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="l00831"></a>00831
-<a name="l00833"></a><a class="code" href="a00135.html#25b0e3881038877604c5efc1c14c4afd">00833</a> size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
-<a name="l00834"></a>00834
-<a name="l00836"></a><a class="code" href="a00135.html#3e5d085375320cd3f34faeedc5bba8f6">00836</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
-<a name="l00837"></a>00837
-<a name="l00839"></a><a class="code" href="a00135.html#6ed260e217fb310050928d7bd03f1b5e">00839</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="l00840"></a>00840
-<a name="l00842"></a><a class="code" href="a00135.html#d1c1e23f2a3ba1f943d00d95388d718f">00842</a> size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
-<a name="l00843"></a>00843
-<a name="l00845"></a><a class="code" href="a00135.html#79d1e5c3b975dbd38b43138266fe4c0e">00845</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00846"></a>00846
-<a name="l00848"></a>00848 <span class="keywordtype">void</span> swap(<a class="code" href="a00135.html">concurrent_hash_map</a> &table);
-<a name="l00849"></a>00849
-<a name="l00850"></a>00850 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00851"></a>00851 <span class="comment">// concurrent map operations</span>
-<a name="l00852"></a>00852 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00853"></a>00853
-<a name="l00855"></a><a class="code" href="a00135.html#a3e97a1f3cb66e81a2336b013ef1ae7d">00855</a> size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00856"></a>00856 <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="l00857"></a>00857 }
+<a name="l00801"></a>00801 <span class="keyword">class </span>concurrent_queue_base_v3: no_copy {
+<a name="l00803"></a>00803 concurrent_queue_rep* my_rep;
+<a name="l00804"></a>00804
+<a name="l00805"></a>00805 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_rep;
+<a name="l00806"></a>00806 <span class="keyword">friend</span> <span class="keyword">struct </span>micro_queue;
+<a name="l00807"></a>00807 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer;
+<a name="l00808"></a>00808 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep;
+<a name="l00809"></a>00809 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
+<a name="l00810"></a>00810 <span class="keyword">protected</span>:
+<a name="l00812"></a>00812 <span class="keyword">struct </span>page {
+<a name="l00813"></a>00813 page* next;
+<a name="l00814"></a>00814 uintptr_t mask;
+<a name="l00815"></a>00815 };
+<a name="l00816"></a>00816
+<a name="l00818"></a>00818 ptrdiff_t my_capacity;
+<a name="l00819"></a>00819
+<a name="l00821"></a>00821 size_t items_per_page;
+<a name="l00822"></a>00822
+<a name="l00824"></a>00824 size_t item_size;
+<a name="l00825"></a>00825
+<a name="l00826"></a>00826 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
+<a name="l00827"></a>00827 <span class="preprocessor"></span><span class="keyword">public</span>:
+<a name="l00828"></a>00828 <span class="preprocessor">#endif</span>
+<a name="l00829"></a>00829 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00830"></a>00830 <span class="keyword">struct </span>padded_page: page {
+<a name="l00832"></a>00832 padded_page();
+<a name="l00834"></a>00834 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
+<a name="l00836"></a>00836 T last;
+<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 <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="l00841"></a>00841 <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="l00842"></a>00842 <span class="keyword">protected</span>:
+<a name="l00843"></a>00843 __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );
+<a name="l00844"></a>00844 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();
+<a name="l00845"></a>00845
+<a name="l00847"></a>00847 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
+<a name="l00848"></a>00848
+<a name="l00850"></a>00850 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_pop( <span class="keywordtype">void</span>* dst );
+<a name="l00851"></a>00851
+<a name="l00853"></a>00853 <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="l00854"></a>00854
+<a name="l00856"></a>00856
+<a name="l00857"></a>00857 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_pop_if_present( <span class="keywordtype">void</span>* dst );
<a name="l00858"></a>00858
-<a name="l00860"></a>00860
-<a name="l00861"></a><a class="code" href="a00135.html#9fa1ca60af4ef761a100617b27718585">00861</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00138.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00862"></a>00862 result.<a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>();
-<a name="l00863"></a>00863 <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="l00864"></a>00864 }
-<a name="l00865"></a>00865
+<a name="l00860"></a>00860 ptrdiff_t __TBB_EXPORTED_METHOD internal_size() <span class="keyword">const</span>;
+<a name="l00861"></a>00861
+<a name="l00863"></a>00863 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_empty() <span class="keyword">const</span>;
+<a name="l00864"></a>00864
+<a name="l00866"></a>00866 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );
<a name="l00867"></a>00867
-<a name="l00868"></a><a class="code" href="a00135.html#4f7cc0aab2d8216c0a6e681f32dd48c8">00868</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00136.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00869"></a>00869 result.<a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>();
-<a name="l00870"></a>00870 <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="l00871"></a>00871 }
-<a name="l00872"></a>00872
-<a name="l00874"></a>00874
-<a name="l00875"></a><a class="code" href="a00135.html#67d8c254b1666d89267c8a4a33c864f3">00875</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00138.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00876"></a>00876 result.<a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>();
-<a name="l00877"></a>00877 <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="l00878"></a>00878 }
-<a name="l00879"></a>00879
-<a name="l00881"></a>00881
-<a name="l00882"></a><a class="code" href="a00135.html#8ea81ff7fea044f859273b354c91c185">00882</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00136.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00883"></a>00883 result.<a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>();
-<a name="l00884"></a>00884 <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="l00885"></a>00885 }
-<a name="l00886"></a>00886
-<a name="l00888"></a>00888
-<a name="l00889"></a><a class="code" href="a00135.html#68a46a26bd4308c1780d021ca7e8fc15">00889</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00138.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00890"></a>00890 result.<a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>();
-<a name="l00891"></a>00891 <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="l00892"></a>00892 }
-<a name="l00893"></a>00893
-<a name="l00895"></a>00895
-<a name="l00896"></a><a class="code" href="a00135.html#7bd4dcf6ea74a32299fd57d8d7fc7ed8">00896</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00136.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00897"></a>00897 result.<a class="code" href="a00138.html#09575d1a2dfeb8cd896c27cdd3770517">release</a>();
-<a name="l00898"></a>00898 <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="l00899"></a>00899 }
+<a name="l00869"></a>00869 <span class="keyword">virtual</span> page *allocate_page() = 0;
+<a name="l00870"></a>00870
+<a name="l00872"></a>00872 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) = 0;
+<a name="l00873"></a>00873
+<a name="l00875"></a>00875 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
+<a name="l00876"></a>00876 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_finish_clear() ;
+<a name="l00877"></a>00877
+<a name="l00879"></a>00879 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception() <span class="keyword">const</span>;
+<a name="l00880"></a>00880
+<a name="l00882"></a>00882 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
+<a name="l00883"></a>00883
+<a name="l00884"></a>00884 <span class="keyword">private</span>:
+<a name="l00885"></a>00885 <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="l00886"></a>00886 };
+<a name="l00887"></a>00887
+<a name="l00889"></a>00889
+<a name="l00890"></a>00890 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 {
+<a name="l00892"></a>00892
+<a name="l00893"></a>00893 concurrent_queue_iterator_rep* my_rep;
+<a name="l00894"></a>00894
+<a name="l00895"></a>00895 <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="l00896"></a>00896 <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="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="l00902"></a>00902
-<a name="l00903"></a><a class="code" href="a00135.html#3034a308bc839695a5714a107380c4b9">00903</a> <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
-<a name="l00904"></a>00904 <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="l00905"></a>00905 }
-<a name="l00906"></a>00906
-<a name="l00908"></a>00908 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00909"></a><a class="code" href="a00135.html#7b42dba04d71e1367f0d542087906178">00909</a> <span class="keywordtype">void</span> insert(I first, I last) {
-<a name="l00910"></a>00910 <span class="keywordflow">for</span>(; first != last; ++first)
-<a name="l00911"></a>00911 insert( *first );
+<a name="l00901"></a>00901 <span class="keywordtype">void</span> initialize( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
+<a name="l00902"></a>00902 <span class="keyword">protected</span>:
+<a name="l00904"></a>00904 <span class="keywordtype">void</span>* my_item;
+<a name="l00905"></a>00905
+<a name="l00907"></a>00907 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
+<a name="l00908"></a>00908
+<a name="l00910"></a>00910 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
+<a name="l00911"></a>00911 assign(i);
<a name="l00912"></a>00912 }
<a name="l00913"></a>00913
<a name="l00915"></a>00915
-<a name="l00916"></a>00916 <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
+<a name="l00916"></a>00916 __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue );
<a name="l00917"></a>00917
-<a name="l00919"></a>00919
-<a name="l00920"></a><a class="code" href="a00135.html#fc64086f9f518cef8c368c9429d0064e">00920</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00138.html">const_accessor</a>& item_accessor ) {
-<a name="l00921"></a>00921 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">true</span> );
-<a name="l00922"></a>00922 }
+<a name="l00919"></a>00919 __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="l00920"></a>00920
+<a name="l00922"></a>00922 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i );
<a name="l00923"></a>00923
-<a name="l00925"></a>00925
-<a name="l00926"></a><a class="code" href="a00135.html#b65abfa291da566617dd58dfb349630a">00926</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00136.html">accessor</a>& item_accessor ) {
-<a name="l00927"></a>00927 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">false</span> );
-<a name="l00928"></a>00928 }
-<a name="l00929"></a>00929
-<a name="l00930"></a>00930 <span class="keyword">protected</span>:
-<a name="l00932"></a>00932 <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="l00933"></a>00933
-<a name="l00935"></a>00935 <span class="keywordtype">bool</span> exclude( const_accessor &item_accessor, <span class="keywordtype">bool</span> readonly );
-<a name="l00936"></a>00936
-<a name="l00938"></a>00938 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00939"></a>00939 std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
-<a name="l00940"></a>00940
-<a name="l00942"></a>00942 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00135.html">concurrent_hash_map</a>& source );
+<a name="l00925"></a>00925 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD advance();
+<a name="l00926"></a>00926
+<a name="l00928"></a>00928 __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();
+<a name="l00929"></a>00929 };
+<a name="l00930"></a>00930
+<a name="l00931"></a>00931 <span class="keyword">typedef</span> concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
+<a name="l00932"></a>00932
+<a name="l00934"></a>00934
+<a name="l00936"></a>00936 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00937"></a>00937 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base,
+<a name="l00938"></a>00938 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
+<a name="l00939"></a>00939
+<a name="l00940"></a>00940 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
+<a name="l00941"></a>00941 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00942"></a>00942 <span class="keyword">friend</span> class ::tbb::concurrent_bounded_queue;
<a name="l00943"></a>00943
-<a name="l00944"></a>00944 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00945"></a>00945 <span class="keywordtype">void</span> internal_copy(I first, I last);
-<a name="l00946"></a>00946
-<a name="l00948"></a>00948
-<a name="l00950"></a><a class="code" href="a00135.html#f0cdf5930563a49ffe827c520e948e01">00950</a> const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
-<a name="l00951"></a>00951 hashcode_t h = my_hash_compare.hash( key );
-<a name="l00952"></a>00952 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00953"></a>00953 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l00954"></a>00954 <span class="preprocessor">#else</span>
-<a name="l00955"></a>00955 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l00956"></a>00956 <span class="preprocessor">#endif</span>
-<a name="l00957"></a>00957 <span class="preprocessor"></span> node *n;
-<a name="l00958"></a>00958 restart:
-<a name="l00959"></a>00959 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00960"></a>00960 bucket *b = get_bucket( h & m );
-<a name="l00961"></a>00961 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00962"></a>00962 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00963"></a>00963 <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&b->node_list) == internal::rehash_req )
-<a name="l00964"></a>00964 <span class="preprocessor">#else</span>
-<a name="l00965"></a>00965 <span class="preprocessor"></span> <span class="keywordflow">if</span>( __TBB_load_with_acquire(b->node_list) == internal::rehash_req )
-<a name="l00966"></a>00966 <span class="preprocessor">#endif</span>
-<a name="l00967"></a>00967 <span class="preprocessor"></span> {
-<a name="l00968"></a>00968 bucket::scoped_t lock;
-<a name="l00969"></a>00969 <span class="keywordflow">if</span>( lock.try_acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) ) {
-<a name="l00970"></a>00970 <span class="keywordflow">if</span>( b->node_list == internal::rehash_req)
-<a name="l00971"></a>00971 const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->rehash_bucket( b, h & m ); <span class="comment">//recursive rehashing</span>
-<a name="l00972"></a>00972 }
-<a name="l00973"></a>00973 <span class="keywordflow">else</span> lock.acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00974"></a>00974 __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
-<a name="l00975"></a>00975 }
-<a name="l00976"></a>00976 n = search_bucket( key, b );
-<a name="l00977"></a>00977 <span class="keywordflow">if</span>( n )
-<a name="l00978"></a>00978 <span class="keywordflow">return</span> &n->item;
-<a name="l00979"></a>00979 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l00980"></a>00980 <span class="keywordflow">goto</span> restart;
-<a name="l00981"></a>00981 <span class="keywordflow">return</span> 0;
-<a name="l00982"></a>00982 }
-<a name="l00983"></a>00983 };
-<a name="l00984"></a>00984
-<a name="l00985"></a>00985 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00986"></a>00986 <span class="preprocessor"></span> <span class="comment">// Suppress "conditional expression is constant" warning.</span>
-<a name="l00987"></a>00987 <span class="preprocessor"> #pragma warning( push )</span>
-<a name="l00988"></a>00988 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4127 )</span>
-<a name="l00989"></a>00989 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00990"></a>00990 <span class="preprocessor"></span>
-<a name="l00991"></a>00991 <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="l00992"></a><a class="code" href="a00135.html#0f0ba43d9cb783f12dd01bf5677da097">00992</a> <span class="keywordtype">bool</span> <a class="code" href="a00135.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="a00138.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
-<a name="l00993"></a>00993 __TBB_ASSERT( !result || !result-><a class="code" href="a00138.html#91d596be4465efc2ac2ffd0450b47ca2">my_node</a>, NULL );
-<a name="l00994"></a>00994 segment_index_t grow_segment;
-<a name="l00995"></a>00995 <span class="keywordtype">bool</span> return_value;
-<a name="l00996"></a>00996 node *n, *tmp_n = 0;
-<a name="l00997"></a>00997 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l00998"></a>00998 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00999"></a>00999 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01000"></a>01000 <span class="preprocessor">#else</span>
-<a name="l01001"></a>01001 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l01002"></a>01002 <span class="preprocessor">#endif</span>
-<a name="l01003"></a>01003 <span class="preprocessor"></span> restart:
-<a name="l01004"></a>01004 {<span class="comment">//lock scope</span>
-<a name="l01005"></a>01005 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01006"></a>01006 return_value = <span class="keyword">false</span>;
-<a name="l01007"></a>01007 <span class="comment">// get bucket</span>
-<a name="l01008"></a>01008 <a class="code" href="a00137.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l01009"></a>01009
-<a name="l01010"></a>01010 <span class="comment">// find a node</span>
-<a name="l01011"></a>01011 n = search_bucket( key, b() );
-<a name="l01012"></a>01012 <span class="keywordflow">if</span>( op_insert ) {
-<a name="l01013"></a>01013 <span class="comment">// [opt] insert a key</span>
-<a name="l01014"></a>01014 <span class="keywordflow">if</span>( !n ) {
-<a name="l01015"></a>01015 <span class="keywordflow">if</span>( !tmp_n ) {
-<a name="l01016"></a>01016 <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
-<a name="l01017"></a>01017 <span class="keywordflow">else</span> tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
-<a name="l01018"></a>01018 }
-<a name="l01019"></a>01019 <span class="keywordflow">if</span>( !b.<a class="code" href="a00137.html#adf8e405df5787351fe816c42042b9ec">is_writer</a>() && !b.<a class="code" href="a00137.html#32b2b1c83ca85859bc5276022821152d">upgrade_to_writer</a>() ) { <span class="comment">// TODO: improved insertion</span>
-<a name="l01020"></a>01020 <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
-<a name="l01021"></a>01021 n = search_bucket( key, b() );
-<a name="l01022"></a>01022 <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
-<a name="l01023"></a>01023 b.downgrade_to_reader();
-<a name="l01024"></a>01024 <span class="keywordflow">goto</span> exists;
-<a name="l01025"></a>01025 }
-<a name="l01026"></a>01026 }
-<a name="l01027"></a>01027 <span class="keywordflow">if</span>( check_mask_race(h, m) )
-<a name="l01028"></a>01028 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b().</span>
-<a name="l01029"></a>01029 <span class="comment">// insert and set flag to grow the container</span>
-<a name="l01030"></a>01030 grow_segment = insert_new_node( b(), n = tmp_n, m );
-<a name="l01031"></a>01031 tmp_n = 0;
-<a name="l01032"></a>01032 return_value = <span class="keyword">true</span>;
-<a name="l01033"></a>01033 } <span class="keywordflow">else</span> {
-<a name="l01034"></a>01034 exists: grow_segment = 0;
-<a name="l01035"></a>01035 }
-<a name="l01036"></a>01036 } <span class="keywordflow">else</span> { <span class="comment">// find or count</span>
-<a name="l01037"></a>01037 <span class="keywordflow">if</span>( !n ) {
-<a name="l01038"></a>01038 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01039"></a>01039 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b(). TODO: replace by continue</span>
-<a name="l01040"></a>01040 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01041"></a>01041 }
-<a name="l01042"></a>01042 return_value = <span class="keyword">true</span>;
-<a name="l01043"></a>01043 grow_segment = 0;
-<a name="l01044"></a>01044 }
-<a name="l01045"></a>01045 <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
-<a name="l01046"></a>01046 <span class="comment">// TODO: the following seems as generic/regular operation</span>
-<a name="l01047"></a>01047 <span class="comment">// acquire the item</span>
-<a name="l01048"></a>01048 <span class="keywordflow">if</span>( !result-><a class="code" href="a00138.html#cd19753c8520dd7641f5fc132141fde2">my_lock</a>.try_acquire( n->mutex, write ) ) {
-<a name="l01049"></a>01049 <span class="comment">// we are unlucky, prepare for longer wait</span>
-<a name="l01050"></a>01050 <a class="code" href="a00124.html">tbb::internal::atomic_backoff</a> trials;
-<a name="l01051"></a>01051 <span class="keywordflow">do</span> {
-<a name="l01052"></a>01052 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
-<a name="l01053"></a>01053 <span class="comment">// the wait takes really long, restart the operation</span>
-<a name="l01054"></a>01054 b.release();
-<a name="l01055"></a>01055 __TBB_ASSERT( !op_insert || !return_value, <span class="stringliteral">"Can't acquire new item in locked bucket?"</span> );
-<a name="l01056"></a>01056 __TBB_Yield();
-<a name="l01057"></a>01057 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l01058"></a>01058 <span class="preprocessor"></span> m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01059"></a>01059 <span class="preprocessor">#else</span>
-<a name="l01060"></a>01060 <span class="preprocessor"></span> m = my_mask;
-<a name="l01061"></a>01061 <span class="preprocessor">#endif</span>
-<a name="l01062"></a>01062 <span class="preprocessor"></span> <span class="keywordflow">goto</span> restart;
-<a name="l01063"></a>01063 }
-<a name="l01064"></a>01064 } <span class="keywordflow">while</span>( !result-><a class="code" href="a00138.html#cd19753c8520dd7641f5fc132141fde2">my_lock</a>.try_acquire( n->mutex, write ) );
-<a name="l01065"></a>01065 }
-<a name="l01066"></a>01066 }<span class="comment">//lock scope</span>
-<a name="l01067"></a>01067 result-><a class="code" href="a00138.html#91d596be4465efc2ac2ffd0450b47ca2">my_node</a> = n;
-<a name="l01068"></a>01068 result-><a class="code" href="a00138.html#4ba27b783fcaaab0bab90e60b8c8a614">my_hash</a> = h;
-<a name="l01069"></a>01069 check_growth:
-<a name="l01070"></a>01070 <span class="comment">// [opt] grow the container</span>
-<a name="l01071"></a>01071 <span class="keywordflow">if</span>( grow_segment )
-<a name="l01072"></a>01072 enable_segment( grow_segment );
-<a name="l01073"></a>01073 <span class="keywordflow">if</span>( tmp_n ) <span class="comment">// if op_insert only</span>
-<a name="l01074"></a>01074 delete_node( tmp_n );
-<a name="l01075"></a>01075 <span class="keywordflow">return</span> return_value;
-<a name="l01076"></a>01076 }
-<a name="l01077"></a>01077
-<a name="l01078"></a>01078 <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="l01079"></a>01079 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01080"></a><a class="code" href="a00135.html#308ec5ad19fdd1be4d345f8013070150">01080</a> std::pair<I, I> <a class="code" href="a00135.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="l01081"></a>01081 hashcode_t h = my_hash_compare.hash( key );
-<a name="l01082"></a>01082 hashcode_t m = my_mask;
-<a name="l01083"></a>01083 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01084"></a>01084 h &= m;
-<a name="l01085"></a>01085 bucket *b = get_bucket( h );
-<a name="l01086"></a>01086 <span class="keywordflow">while</span>( b->node_list == internal::rehash_req ) {
-<a name="l01087"></a>01087 m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01088"></a>01088 b = get_bucket( h &= m );
-<a name="l01089"></a>01089 }
-<a name="l01090"></a>01090 node *n = search_bucket( key, b );
-<a name="l01091"></a>01091 <span class="keywordflow">if</span>( !n )
-<a name="l01092"></a>01092 <span class="keywordflow">return</span> std::make_pair(end_, end_);
-<a name="l01093"></a>01093 iterator lower(*<span class="keyword">this</span>, h, b, n), upper(lower);
-<a name="l01094"></a>01094 <span class="keywordflow">return</span> std::make_pair(lower, ++upper);
-<a name="l01095"></a>01095 }
-<a name="l01096"></a>01096
-<a name="l01097"></a>01097 <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="l01098"></a><a class="code" href="a00135.html#671965989ffb5f6084c776cb0bb6cdab">01098</a> <span class="keywordtype">bool</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00138.html">const_accessor</a> &item_accessor, <span class="keywordtype">bool</span> readonly ) {
-<a name="l01099"></a>01099 __TBB_ASSERT( item_accessor.<a class="code" href="a00138.html#91d596be4465efc2ac2ffd0450b47ca2">my_node</a>, NULL );
-<a name="l01100"></a>01100 node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00138.html#91d596be4465efc2ac2ffd0450b47ca2">my_node</a>;
-<a name="l01101"></a>01101 item_accessor.<a class="code" href="a00138.html#91d596be4465efc2ac2ffd0450b47ca2">my_node</a> = NULL; <span class="comment">// we ought release accessor anyway</span>
-<a name="l01102"></a>01102 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00138.html#4ba27b783fcaaab0bab90e60b8c8a614">my_hash</a>;
-<a name="l01103"></a>01103 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l01104"></a>01104 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01105"></a>01105 <span class="preprocessor">#else</span>
-<a name="l01106"></a>01106 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l01107"></a>01107 <span class="preprocessor">#endif</span>
-<a name="l01108"></a>01108 <span class="preprocessor"></span> <span class="keywordflow">do</span> {
-<a name="l01109"></a>01109 <span class="comment">// get bucket</span>
-<a name="l01110"></a>01110 <a class="code" href="a00137.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
-<a name="l01111"></a>01111 node_base **p = &b()->node_list;
-<a name="l01112"></a>01112 <span class="keywordflow">while</span>( *p && *p != n )
-<a name="l01113"></a>01113 p = &(*p)->next;
-<a name="l01114"></a>01114 <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was the first</span>
-<a name="l01115"></a>01115 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01116"></a>01116 <span class="keywordflow">continue</span>;
-<a name="l01117"></a>01117 item_accessor.<a class="code" href="a00138.html#cd19753c8520dd7641f5fc132141fde2">my_lock</a>.release();
-<a name="l01118"></a>01118 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01119"></a>01119 }
-<a name="l01120"></a>01120 __TBB_ASSERT( *p == n, NULL );
-<a name="l01121"></a>01121 *p = n->next; <span class="comment">// remove from container</span>
-<a name="l01122"></a>01122 my_size--;
-<a name="l01123"></a>01123 <span class="keywordflow">break</span>;
-<a name="l01124"></a>01124 } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
-<a name="l01125"></a>01125 <span class="keywordflow">if</span>( readonly ) <span class="comment">// need to get exclusive lock</span>
-<a name="l01126"></a>01126 item_accessor.<a class="code" href="a00138.html#cd19753c8520dd7641f5fc132141fde2">my_lock</a>.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
-<a name="l01127"></a>01127 item_accessor.<a class="code" href="a00138.html#cd19753c8520dd7641f5fc132141fde2">my_lock</a>.release();
-<a name="l01128"></a>01128 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the chain_mutex</span>
-<a name="l01129"></a>01129 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01130"></a>01130 }
-<a name="l01131"></a>01131
-<a name="l01132"></a>01132 <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="l01133"></a><a class="code" href="a00135.html#58df7a1e4373c55eb4c2fa9dc69516b1">01133</a> <span class="keywordtype">bool</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
-<a name="l01134"></a>01134 node_base *n;
-<a name="l01135"></a>01135 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l01136"></a>01136 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l01137"></a>01137 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01138"></a>01138 <span class="preprocessor">#else</span>
-<a name="l01139"></a>01139 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l01140"></a>01140 <span class="preprocessor">#endif</span>
-<a name="l01141"></a>01141 <span class="preprocessor"></span>restart:
-<a name="l01142"></a>01142 {<span class="comment">//lock scope</span>
-<a name="l01143"></a>01143 <span class="comment">// get bucket</span>
-<a name="l01144"></a>01144 <a class="code" href="a00137.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l01145"></a>01145 search:
-<a name="l01146"></a>01146 node_base **p = &b()->node_list;
-<a name="l01147"></a>01147 n = *p;
-<a name="l01148"></a>01148 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
-<a name="l01149"></a>01149 p = &n->next;
-<a name="l01150"></a>01150 n = *p;
-<a name="l01151"></a>01151 }
-<a name="l01152"></a>01152 <span class="keywordflow">if</span>( !n ) { <span class="comment">// not found, but mask could be changed</span>
-<a name="l01153"></a>01153 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01154"></a>01154 <span class="keywordflow">goto</span> restart;
-<a name="l01155"></a>01155 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01156"></a>01156 }
-<a name="l01157"></a>01157 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00137.html#adf8e405df5787351fe816c42042b9ec">is_writer</a>() && !b.<a class="code" href="a00137.html#32b2b1c83ca85859bc5276022821152d">upgrade_to_writer</a>() ) {
-<a name="l01158"></a>01158 <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
-<a name="l01159"></a>01159 <span class="keywordflow">goto</span> restart;
-<a name="l01160"></a>01160 <span class="keywordflow">goto</span> search;
-<a name="l01161"></a>01161 }
-<a name="l01162"></a>01162 *p = n->next;
-<a name="l01163"></a>01163 my_size--;
-<a name="l01164"></a>01164 }
-<a name="l01165"></a>01165 {
-<a name="l01166"></a>01166 <span class="keyword">typename</span> node::scoped_t item_locker( n->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l01167"></a>01167 }
-<a name="l01168"></a>01168 <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="l01169"></a>01169 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the bucket</span>
-<a name="l01170"></a>01170 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01171"></a>01171 }
-<a name="l01172"></a>01172
-<a name="l01173"></a>01173 <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="l01174"></a>01174 <span class="keywordtype">void</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
-<a name="l01175"></a>01175 std::swap(this->my_allocator, table.<a class="code" href="a00135.html#964dbe9bfcb2ac0157f8b77f252f951b">my_allocator</a>);
-<a name="l01176"></a>01176 std::swap(this->my_hash_compare, table.<a class="code" href="a00135.html#1d13c1f34b3826f9235b82ea90818169">my_hash_compare</a>);
-<a name="l01177"></a>01177 internal_swap(table);
-<a name="l01178"></a>01178 }
-<a name="l01179"></a>01179
-<a name="l01180"></a>01180 <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="l01181"></a><a class="code" href="a00135.html#9ba53dc3a98d81331ded7c6c2b17f58f">01181</a> <span class="keywordtype">void</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
-<a name="l01182"></a>01182 reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
-<a name="l01183"></a>01183 hashcode_t mask = my_mask;
-<a name="l01184"></a>01184 hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
-<a name="l01185"></a>01185 __TBB_ASSERT((b&(b-1))==0, NULL);
-<a name="l01186"></a>01186 bucket *bp = get_bucket( b ); <span class="comment">// only the last segment should be scanned for rehashing</span>
-<a name="l01187"></a>01187 <span class="keywordflow">for</span>(; b <= mask; b++, bp++ ) {
-<a name="l01188"></a>01188 node_base *n = bp->node_list;
-<a name="l01189"></a>01189 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01190"></a>01190 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01191"></a>01191 <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="l01192"></a>01192 hashcode_t h = b; bucket *b_old = bp;
-<a name="l01193"></a>01193 <span class="keywordflow">do</span> {
-<a name="l01194"></a>01194 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l01195"></a>01195 hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01196"></a>01196 b_old = get_bucket( h &= m );
-<a name="l01197"></a>01197 } <span class="keywordflow">while</span>( b_old->node_list == internal::rehash_req );
-<a name="l01198"></a>01198 <span class="comment">// now h - is index of the root rehashed bucket b_old</span>
-<a name="l01199"></a>01199 mark_rehashed_levels( h ); <span class="comment">// mark all non-rehashed children recursively across all segments</span>
-<a name="l01200"></a>01200 <span class="keywordflow">for</span>( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
-<a name="l01201"></a>01201 hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
-<a name="l01202"></a>01202 <span class="keywordflow">if</span>( (c & mask) != h ) { <span class="comment">// should be rehashed</span>
-<a name="l01203"></a>01203 *p = q->next; <span class="comment">// exclude from b_old</span>
-<a name="l01204"></a>01204 bucket *b_new = get_bucket( c & mask );
-<a name="l01205"></a>01205 __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="l01206"></a>01206 add_to_bucket( b_new, q );
-<a name="l01207"></a>01207 } <span class="keywordflow">else</span> p = &q->next; <span class="comment">// iterate to next item</span>
-<a name="l01208"></a>01208 }
-<a name="l01209"></a>01209 }
-<a name="l01210"></a>01210 }
-<a name="l01211"></a>01211 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01212"></a>01212 <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="l01213"></a>01213 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01214"></a>01214 <span class="preprocessor">#endif</span>
-<a name="l01215"></a>01215 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01216"></a>01216 <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="l01217"></a>01217 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01218"></a>01218 <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01219"></a>01219 node_base *n = bp->node_list;
-<a name="l01220"></a>01220 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01221"></a>01221 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01222"></a>01222 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01223"></a>01223 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01224"></a>01224 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01225"></a>01225 <span class="preprocessor">#endif</span>
-<a name="l01226"></a>01226 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l01227"></a>01227 <span class="preprocessor"></span> <span class="keywordflow">for</span>( ; is_valid(n); n = n->next ) {
-<a name="l01228"></a>01228 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
-<a name="l01229"></a>01229 __TBB_ASSERT( h == b, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01230"></a>01230 }
-<a name="l01231"></a>01231 <span class="preprocessor">#endif</span>
-<a name="l01232"></a>01232 <span class="preprocessor"></span> }
-<a name="l01233"></a>01233 <span class="preprocessor">#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01234"></a>01234 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01235"></a>01235 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01236"></a>01236 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01237"></a>01237 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01238"></a>01238 tbb::internal::runtime_warning(
-<a name="l01239"></a>01239 <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="l01240"></a>01240 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01241"></a>01241 reported = <span class="keyword">true</span>;
-<a name="l01242"></a>01242 }
-<a name="l01243"></a>01243 <span class="preprocessor">#endif</span>
-<a name="l01244"></a>01244 <span class="preprocessor"></span>}
-<a name="l01245"></a>01245
-<a name="l01246"></a>01246 <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="l01247"></a><a class="code" href="a00135.html#36bcd50fd5383f3682032323b2d74333">01247</a> <span class="keywordtype">void</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
-<a name="l01248"></a>01248 hashcode_t m = my_mask;
-<a name="l01249"></a>01249 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01250"></a>01250 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01251"></a>01251 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01252"></a>01252 <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="l01253"></a>01253 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01254"></a>01254 <span class="preprocessor">#endif</span>
-<a name="l01255"></a>01255 <span class="preprocessor"></span> bucket *bp = 0;
-<a name="l01256"></a>01256 <span class="comment">// check consistency</span>
-<a name="l01257"></a>01257 <span class="keywordflow">for</span>( segment_index_t b = 0; b <= m; b++ ) {
-<a name="l01258"></a>01258 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01259"></a>01259 <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01260"></a>01260 node_base *n = bp->node_list;
-<a name="l01261"></a>01261 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01262"></a>01262 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during clear() execution"</span> );
-<a name="l01263"></a>01263 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01264"></a>01264 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01265"></a>01265 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n == internal::rehash_req ) buckets--;
-<a name="l01266"></a>01266 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01267"></a>01267 <span class="preprocessor">#endif</span>
-<a name="l01268"></a>01268 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l01269"></a>01269 <span class="preprocessor"></span> <span class="keywordflow">for</span>(; is_valid(n); n = n->next ) {
-<a name="l01270"></a>01270 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l01271"></a>01271 h &= m;
-<a name="l01272"></a>01272 __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="l01273"></a>01273 }
-<a name="l01274"></a>01274 <span class="preprocessor">#endif</span>
-<a name="l01275"></a>01275 <span class="preprocessor"></span> }
-<a name="l01276"></a>01276 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01277"></a>01277 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01278"></a>01278 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01279"></a>01279 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01280"></a>01280 tbb::internal::runtime_warning(
-<a name="l01281"></a>01281 <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="l01282"></a>01282 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01283"></a>01283 reported = <span class="keyword">true</span>;
-<a name="l01284"></a>01284 }
-<a name="l01285"></a>01285 <span class="preprocessor">#endif</span>
-<a name="l01286"></a>01286 <span class="preprocessor"></span><span class="preprocessor">#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01287"></a>01287 <span class="preprocessor"></span> my_size = 0;
-<a name="l01288"></a>01288 segment_index_t s = segment_index_of( m );
-<a name="l01289"></a>01289 __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01290"></a>01290 <a class="code" href="a00130.html">cache_aligned_allocator<bucket></a> alloc;
-<a name="l01291"></a>01291 <span class="keywordflow">do</span> {
-<a name="l01292"></a>01292 __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01293"></a>01293 segment_ptr_t buckets_ptr = my_table[s];
-<a name="l01294"></a>01294 size_type sz = segment_size( s ? s : 1 );
-<a name="l01295"></a>01295 <span class="keywordflow">for</span>( segment_index_t i = 0; i < sz; i++ )
-<a name="l01296"></a>01296 <span class="keywordflow">for</span>( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
-<a name="l01297"></a>01297 buckets_ptr[i].node_list = n->next;
-<a name="l01298"></a>01298 delete_node( n );
-<a name="l01299"></a>01299 }
-<a name="l01300"></a>01300 <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
-<a name="l01301"></a>01301 alloc.<a class="code" href="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
-<a name="l01302"></a>01302 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
-<a name="l01303"></a>01303 alloc.<a class="code" href="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
-<a name="l01304"></a>01304 <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
-<a name="l01305"></a>01305 } <span class="keywordflow">while</span>(s-- > 0);
-<a name="l01306"></a>01306 my_mask = embedded_buckets - 1;
-<a name="l01307"></a>01307 }
-<a name="l01308"></a>01308
-<a name="l01309"></a>01309 <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="l01310"></a><a class="code" href="a00135.html#7973cd92f57dcb092ab757f8d9e089f9">01310</a> <span class="keywordtype">void</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00135.html">concurrent_hash_map</a>& source ) {
-<a name="l01311"></a>01311 reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
-<a name="l01312"></a>01312 hashcode_t mask = source.my_mask;
-<a name="l01313"></a>01313 <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
-<a name="l01314"></a>01314 bucket *dst = 0, *src = 0;
-<a name="l01315"></a>01315 <span class="keywordtype">bool</span> rehash_required = <span class="keyword">false</span>;
-<a name="l01316"></a>01316 <span class="keywordflow">for</span>( hashcode_t k = 0; k <= mask; k++ ) {
-<a name="l01317"></a>01317 <span class="keywordflow">if</span>( k & (k-2) ) ++dst,src++; <span class="comment">// not the beginning of a segment</span>
-<a name="l01318"></a>01318 <span class="keywordflow">else</span> { dst = get_bucket( k ); src = source.get_bucket( k ); }
-<a name="l01319"></a>01319 __TBB_ASSERT( dst->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01320"></a>01320 node *n = static_cast<node*>( src->node_list );
-<a name="l01321"></a>01321 <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// source is not rehashed, items are in previous buckets</span>
-<a name="l01322"></a>01322 rehash_required = <span class="keyword">true</span>;
-<a name="l01323"></a>01323 dst->node_list = internal::rehash_req;
-<a name="l01324"></a>01324 } <span class="keywordflow">else</span> <span class="keywordflow">for</span>(; n; n = static_cast<node*>( n->next ) ) {
-<a name="l01325"></a>01325 add_to_bucket( dst, <span class="keyword">new</span>( my_allocator ) node(n->item.first, n->item.second) );
-<a name="l01326"></a>01326 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01327"></a>01327 }
-<a name="l01328"></a>01328 }
-<a name="l01329"></a>01329 <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00135.html#9ba53dc3a98d81331ded7c6c2b17f58f">rehash</a>();
-<a name="l01330"></a>01330 } <span class="keywordflow">else</span> <a class="code" href="a00135.html#7973cd92f57dcb092ab757f8d9e089f9">internal_copy</a>( source.<a class="code" href="a00135.html#dfb7ab010b46fc194673256479c2ea48">begin</a>(), source.<a class="code" href="a00135.html#7e2dd7c8b3d37a93ba551e4de33bb73d">end</a>() );
-<a name="l01331"></a>01331 }
-<a name="l01332"></a>01332
-<a name="l01333"></a>01333 <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="l01334"></a>01334 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01335"></a>01335 <span class="keywordtype">void</span> <a class="code" href="a00135.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
-<a name="l01336"></a>01336 hashcode_t m = my_mask;
-<a name="l01337"></a>01337 <span class="keywordflow">for</span>(; first != last; ++first) {
-<a name="l01338"></a>01338 hashcode_t h = my_hash_compare.hash( first->first );
-<a name="l01339"></a>01339 bucket *b = get_bucket( h & m );
-<a name="l01340"></a>01340 __TBB_ASSERT( b->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01341"></a>01341 node *n = <span class="keyword">new</span>( my_allocator ) node(first->first, first->second);
-<a name="l01342"></a>01342 add_to_bucket( b, n );
-<a name="l01343"></a>01343 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01344"></a>01344 }
-<a name="l01345"></a>01345 }
-<a name="l01346"></a>01346
-<a name="l01347"></a>01347 } <span class="comment">// namespace interface4</span>
-<a name="l01348"></a>01348
-<a name="l01349"></a>01349 <span class="keyword">using</span> interface4::tbb_hasher;
-<a name="l01350"></a>01350 <span class="keyword">using</span> interface4::concurrent_hash_map;
-<a name="l01351"></a>01351
-<a name="l01352"></a>01352
-<a name="l01353"></a>01353 <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="l01354"></a>01354 <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="l01355"></a>01355 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01356"></a>01356 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
-<a name="l01357"></a>01357 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
-<a name="l01358"></a>01358 <span class="keywordflow">for</span>(; i != i_end; ++i) {
-<a name="l01359"></a>01359 j = b.equal_range(i->first).first;
-<a name="l01360"></a>01360 <span class="keywordflow">if</span>( j == j_end || !(i->second == j->second) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01361"></a>01361 }
-<a name="l01362"></a>01362 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01363"></a>01363 }
-<a name="l01364"></a>01364
-<a name="l01365"></a>01365 <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="l01366"></a>01366 <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="l01367"></a>01367 { <span class="keywordflow">return</span> !(a == b); }
-<a name="l01368"></a>01368
-<a name="l01369"></a>01369 <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="l01370"></a>01370 <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="l01371"></a>01371 { a.swap( b ); }
-<a name="l01372"></a>01372
-<a name="l01373"></a>01373 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l01374"></a>01374 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</span>
-<a name="l01375"></a>01375 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4127 is back</span>
-<a name="l01376"></a>01376 <span class="preprocessor"></span>
-<a name="l01377"></a>01377 } <span class="comment">// namespace tbb</span>
-<a name="l01378"></a>01378
-<a name="l01379"></a>01379 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_hash_map_H */</span>
+<a name="l00944"></a>00944 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00945"></a>00945 <span class="keyword">friend</span> class ::tbb::deprecated::concurrent_queue;
+<a name="l00946"></a>00946 <span class="preprocessor">#else</span>
+<a name="l00947"></a>00947 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
+<a name="l00948"></a>00948 <span class="preprocessor">#endif </span>
+<a name="l00950"></a>00950 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :</span>
+<a name="l00951"></a>00951 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))
+<a name="l00952"></a>00952 {
+<a name="l00953"></a>00953 }
+<a name="l00954"></a>00954
+<a name="l00955"></a>00955 <span class="keyword">public</span>:
+<a name="l00956"></a>00956 concurrent_queue_iterator() {}
+<a name="l00957"></a>00957
+<a name="l00960"></a>00960 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
+<a name="l00961"></a>00961 concurrent_queue_iterator_base_v3(other)
+<a name="l00962"></a>00962 {}
+<a name="l00963"></a>00963
+<a name="l00965"></a>00965 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
+<a name="l00966"></a>00966 assign(other);
+<a name="l00967"></a>00967 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00968"></a>00968 }
+<a name="l00969"></a>00969
+<a name="l00971"></a>00971 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00972"></a>00972 <span class="keywordflow">return</span> *static_cast<Value*>(my_item);
+<a name="l00973"></a>00973 }
+<a name="l00974"></a>00974
+<a name="l00975"></a>00975 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00976"></a>00976
+<a name="l00978"></a>00978 concurrent_queue_iterator& operator++() {
+<a name="l00979"></a>00979 advance();
+<a name="l00980"></a>00980 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00981"></a>00981 }
+<a name="l00982"></a>00982
+<a name="l00984"></a>00984 Value* operator++(<span class="keywordtype">int</span>) {
+<a name="l00985"></a>00985 Value* result = &operator*();
+<a name="l00986"></a>00986 operator++();
+<a name="l00987"></a>00987 <span class="keywordflow">return</span> result;
+<a name="l00988"></a>00988 }
+<a name="l00989"></a>00989 }; <span class="comment">// concurrent_queue_iterator</span>
+<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> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00993"></a>00993 <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="l00994"></a>00994 <span class="keywordflow">return</span> i.my_item==j.my_item;
+<a name="l00995"></a>00995 }
+<a name="l00996"></a>00996
+<a name="l00997"></a>00997 <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="l00998"></a>00998 <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="l00999"></a>00999 <span class="keywordflow">return</span> i.my_item!=j.my_item;
+<a name="l01000"></a>01000 }
+<a name="l01001"></a>01001
+<a name="l01002"></a>01002 } <span class="comment">// namespace internal;</span>
+<a name="l01003"></a>01003
+<a name="l01005"></a>01005
+<a name="l01006"></a>01006 } <span class="comment">// namespace tbb</span>
+<a name="l01007"></a>01007
+<a name="l01008"></a>01008 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_internal_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00293.html b/doc/html/a00293.html
deleted file mode 100644
index 124495c..0000000
--- a/doc/html/a00293.html
+++ /dev/null
@@ -1,914 +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-2010 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 <algorithm></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <iterator></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="l00029"></a>00029 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "blocked_range.h"</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 _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span> <span class="comment">// VS2008/VC9 seems to have an issue; limits pull in math.h</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: 4985 )</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">#include <limits></span> <span class="comment">/* std::numeric_limits */</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</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">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings in /Wp64 mode</span>
-<a name="l00047"></a>00047 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span>
-<a name="l00051"></a>00051 <span class="keyword">namespace </span>tbb {
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00054"></a>00054 <span class="keyword">class </span>concurrent_vector;
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keyword">namespace </span>internal {
-<a name="l00058"></a>00058
-<a name="l00060"></a>00060 <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="l00061"></a>00061
-<a name="l00063"></a>00063 <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="l00064"></a>00064
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">class </span>concurrent_vector_base_v3 {
-<a name="l00068"></a>00068 <span class="keyword">protected</span>:
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <span class="comment">// Basic types declarations</span>
-<a name="l00071"></a>00071 <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00072"></a>00072 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 <span class="comment">// Using enumerations due to Mac linking problems of static const variables</span>
-<a name="l00075"></a>00075 <span class="keyword">enum</span> {
-<a name="l00076"></a>00076 <span class="comment">// Size constants</span>
-<a name="l00077"></a>00077 default_initial_segments = 1, <span class="comment">// 2 initial items</span>
-<a name="l00079"></a>00079 <span class="comment"></span> pointers_per_short_table = 3, <span class="comment">// to fit into 8 words of entire structure</span>
-<a name="l00080"></a>00080 pointers_per_long_table = <span class="keyword">sizeof</span>(segment_index_t) * 8 <span class="comment">// one segment per bit</span>
-<a name="l00081"></a>00081 };
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="comment">// Segment pointer. Can be zero-initialized</span>
-<a name="l00084"></a>00084 <span class="keyword">struct </span>segment_t {
-<a name="l00085"></a>00085 <span class="keywordtype">void</span>* array;
-<a name="l00086"></a>00086 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00087"></a>00087 <span class="preprocessor"></span> ~segment_t() {
-<a name="l00088"></a>00088 __TBB_ASSERT( array <= internal::vector_allocation_error_flag, <span class="stringliteral">"should have been freed by clear"</span> );
-<a name="l00089"></a>00089 }
-<a name="l00090"></a>00090 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00091"></a>00091 };
-<a name="l00092"></a>00092
-<a name="l00093"></a>00093 <span class="comment">// Data fields</span>
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 <span class="keywordtype">void</span>* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
-<a name="l00097"></a>00097
-<a name="l00099"></a>00099 atomic<size_type> my_first_block;
-<a name="l00100"></a>00100
-<a name="l00102"></a>00102 atomic<size_type> my_early_size;
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105 atomic<segment_t*> my_segment;
-<a name="l00106"></a>00106
-<a name="l00108"></a>00108 segment_t my_storage[pointers_per_short_table];
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="comment">// Methods</span>
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 concurrent_vector_base_v3() {
-<a name="l00113"></a>00113 my_early_size = 0;
-<a name="l00114"></a>00114 my_first_block = 0; <span class="comment">// here is not default_initial_segments</span>
-<a name="l00115"></a>00115 <span class="keywordflow">for</span>( segment_index_t i = 0; i < pointers_per_short_table; i++)
-<a name="l00116"></a>00116 my_storage[i].array = NULL;
-<a name="l00117"></a>00117 my_segment = my_storage;
-<a name="l00118"></a>00118 }
-<a name="l00119"></a>00119 __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00122"></a>00122 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00123"></a>00123 }
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00126"></a>00126 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00127"></a>00127 }
-<a name="l00128"></a>00128
-<a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keyword">inline</span> segment_index_t segment_base_index_of( segment_index_t &index ) {
-<a name="l00130"></a>00130 segment_index_t k = segment_index_of( index );
-<a name="l00131"></a>00131 index -= segment_base(k);
-<a name="l00132"></a>00132 <span class="keywordflow">return</span> k;
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00136"></a>00136 <span class="keywordflow">return</span> segment_index_t(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00137"></a>00137 }
-<a name="l00138"></a>00138
-<a name="l00140"></a>00140 <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op1)(<span class="keywordtype">void</span>* begin, size_type n );
-<a name="l00141"></a>00141
-<a name="l00143"></a>00143 <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="l00144"></a>00144
-<a name="l00146"></a>00146 <span class="keyword">struct </span>internal_segments_table {
-<a name="l00147"></a>00147 segment_index_t first_block;
-<a name="l00148"></a>00148 <span class="keywordtype">void</span>* table[pointers_per_long_table];
-<a name="l00149"></a>00149 };
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
-<a name="l00152"></a>00152 size_type __TBB_EXPORTED_METHOD internal_capacity() <span class="keyword">const</span>;
-<a name="l00153"></a>00153 <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="l00154"></a>00154 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="l00155"></a>00155 <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
-<a name="l00156"></a>00156 segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
-<a name="l00157"></a>00157 <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="l00158"></a>00158 <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="l00159"></a>00159 <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="l00160"></a>00160 internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception(size_type) <span class="keyword">const</span>;
-<a name="l00163"></a>00163 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <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="l00166"></a>00166 internal_array_op1 destroy, internal_array_op2 init );
-<a name="l00167"></a>00167 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="l00168"></a>00168
-<a name="l00170"></a>00170 <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="l00171"></a>00171 <span class="keyword">private</span>:
-<a name="l00173"></a>00173 <span class="keyword">class </span>helper;
-<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span>helper;
-<a name="l00175"></a>00175 };
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="keyword">typedef</span> concurrent_vector_base_v3 concurrent_vector_base;
-<a name="l00178"></a>00178
-<a name="l00180"></a>00180
-<a name="l00182"></a>00182 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00183"></a>00183 <span class="keyword">class </span>vector_iterator
-<a name="l00184"></a>00184 {
-<a name="l00186"></a>00186 Container* my_vector;
-<a name="l00187"></a>00187
-<a name="l00189"></a>00189 size_t my_index;
-<a name="l00190"></a>00190
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 <span class="keyword">mutable</span> Value* my_item;
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00196"></a>00196 <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="l00197"></a>00197
-<a name="l00198"></a>00198 <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="l00199"></a>00199 <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="l00200"></a>00200
-<a name="l00201"></a>00201 <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="l00202"></a>00202 <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="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, <span class="keyword">typename</span> U>
-<a name="l00205"></a>00205 <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="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00208"></a>00208 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00211"></a>00211 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00212"></a>00212 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00141.html">tbb::concurrent_vector</a>;
-<a name="l00213"></a>00213 <span class="preprocessor">#else</span>
-<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00215"></a>00215 <span class="preprocessor">#endif </span>
-<a name="l00216"></a>00216 <span class="preprocessor"></span>
-<a name="l00217"></a>00217 vector_iterator( <span class="keyword">const</span> Container& vector, size_t index, <span class="keywordtype">void</span> *ptr = 0 ) :
-<a name="l00218"></a>00218 my_vector(const_cast<Container*>(&vector)),
-<a name="l00219"></a>00219 my_index(index),
-<a name="l00220"></a>00220 my_item(static_cast<Value*>(ptr))
-<a name="l00221"></a>00221 {}
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 <span class="keyword">public</span>:
-<a name="l00225"></a>00225 vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 vector_iterator( <span class="keyword">const</span> vector_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00228"></a>00228 my_vector(other.my_vector),
-<a name="l00229"></a>00229 my_index(other.my_index),
-<a name="l00230"></a>00230 my_item(other.my_item)
-<a name="l00231"></a>00231 {}
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 vector_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00234"></a>00234 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index+offset );
-<a name="l00235"></a>00235 }
-<a name="l00236"></a>00236 vector_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00237"></a>00237 my_index+=offset;
-<a name="l00238"></a>00238 my_item = NULL;
-<a name="l00239"></a>00239 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<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 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00250"></a>00250 Value* item = my_item;
-<a name="l00251"></a>00251 <span class="keywordflow">if</span>( !item ) {
-<a name="l00252"></a>00252 item = my_item = &my_vector->internal_subscript(my_index);
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00255"></a>00255 <span class="keywordflow">return</span> *item;
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257 Value& <a class="code" href="a00141.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00258"></a>00258 <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
-<a name="l00259"></a>00259 }
-<a name="l00260"></a>00260 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00261"></a>00261
-<a name="l00263"></a>00263 vector_iterator& operator++() {
-<a name="l00264"></a>00264 size_t k = ++my_index;
-<a name="l00265"></a>00265 <span class="keywordflow">if</span>( my_item ) {
-<a name="l00266"></a>00266 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00267"></a>00267 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00268"></a>00268 <span class="comment">// k is a power of two that is at least k-2</span>
-<a name="l00269"></a>00269 my_item= NULL;
-<a name="l00270"></a>00270 } <span class="keywordflow">else</span> {
-<a name="l00271"></a>00271 ++my_item;
-<a name="l00272"></a>00272 }
-<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="l00278"></a>00278 vector_iterator& operator--() {
-<a name="l00279"></a>00279 __TBB_ASSERT( my_index>0, <span class="stringliteral">"operator--() applied to iterator already at beginning of concurrent_vector"</span> );
-<a name="l00280"></a>00280 size_t k = my_index--;
-<a name="l00281"></a>00281 <span class="keywordflow">if</span>( my_item ) {
-<a name="l00282"></a>00282 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00283"></a>00283 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00284"></a>00284 <span class="comment">// k is a power of two that is at least k-2 </span>
-<a name="l00285"></a>00285 my_item= NULL;
-<a name="l00286"></a>00286 } <span class="keywordflow">else</span> {
-<a name="l00287"></a>00287 --my_item;
-<a name="l00288"></a>00288 }
-<a name="l00289"></a>00289 }
-<a name="l00290"></a>00290 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00291"></a>00291 }
-<a name="l00292"></a>00292
-<a name="l00294"></a>00294 vector_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00295"></a>00295 vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00296"></a>00296 operator++();
-<a name="l00297"></a>00297 <span class="keywordflow">return</span> result;
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299
-<a name="l00301"></a>00301 vector_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00302"></a>00302 vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00303"></a>00303 operator--();
-<a name="l00304"></a>00304 <span class="keywordflow">return</span> result;
-<a name="l00305"></a>00305 }
-<a name="l00306"></a>00306
-<a name="l00307"></a>00307 <span class="comment">// STL support</span>
-<a name="l00308"></a>00308
-<a name="l00309"></a>00309 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00310"></a>00310 <span class="keyword">typedef</span> Value value_type;
-<a name="l00311"></a>00311 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00312"></a>00312 <span class="keyword">typedef</span> Value& reference;
-<a name="l00313"></a>00313 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00314"></a>00314 };
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00317"></a>00317 vector_iterator<Container,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<Container,T>& v ) {
-<a name="l00318"></a>00318 <span class="keywordflow">return</span> vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320
-<a name="l00321"></a>00321 <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="l00322"></a>00322 <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="l00323"></a>00323 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_vector == j.my_vector;
-<a name="l00324"></a>00324 }
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 <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="l00327"></a>00327 <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="l00328"></a>00328 <span class="keywordflow">return</span> !(i==j);
-<a name="l00329"></a>00329 }
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00332"></a>00332 <span class="keywordtype">bool</span> operator<( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00333"></a>00333 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00334"></a>00334 }
-<a name="l00335"></a>00335
-<a name="l00336"></a>00336 <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="l00337"></a>00337 <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="l00338"></a>00338 <span class="keywordflow">return</span> j<i;
-<a name="l00339"></a>00339 }
-<a name="l00340"></a>00340
-<a name="l00341"></a>00341 <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="l00342"></a>00342 <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="l00343"></a>00343 <span class="keywordflow">return</span> !(i<j);
-<a name="l00344"></a>00344 }
-<a name="l00345"></a>00345
-<a name="l00346"></a>00346 <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="l00347"></a>00347 <span class="keywordtype">bool</span> operator<=( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00348"></a>00348 <span class="keywordflow">return</span> !(j<i);
-<a name="l00349"></a>00349 }
-<a name="l00350"></a>00350
-<a name="l00351"></a>00351 <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="l00352"></a>00352 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="l00353"></a>00353 <span class="keywordflow">return</span> ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
-<a name="l00354"></a>00354 }
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00357"></a>00357 <span class="keyword">class </span>allocator_base {
-<a name="l00358"></a>00358 <span class="keyword">public</span>:
-<a name="l00359"></a>00359 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template
-<a name="l00360"></a>00360 rebind<T>::other allocator_type;
-<a name="l00361"></a>00361 allocator_type my_allocator;
-<a name="l00362"></a>00362
-<a name="l00363"></a>00363 allocator_base(<span class="keyword">const</span> allocator_type &a = allocator_type() ) : my_allocator(a) {}
-<a name="l00364"></a>00364 };
-<a name="l00365"></a>00365
-<a name="l00366"></a>00366 } <span class="comment">// namespace internal</span>
-<a name="l00368"></a>00368 <span class="comment"></span>
-<a name="l00370"></a>00370
-<a name="l00431"></a>00431 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00432"></a><a class="code" href="a00141.html">00432</a> <span class="keyword">class </span><a class="code" href="a00141.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
-<a name="l00433"></a>00433 <span class="keyword">private</span> internal::concurrent_vector_base {
-<a name="l00434"></a>00434 <span class="keyword">private</span>:
-<a name="l00435"></a>00435 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00436"></a>00436 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00127.html">blocked_range</a><I> {
-<a name="l00437"></a>00437 <span class="keyword">public</span>:
-<a name="l00438"></a>00438 <span class="keyword">typedef</span> T value_type;
-<a name="l00439"></a>00439 <span class="keyword">typedef</span> T& reference;
-<a name="l00440"></a>00440 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00441"></a>00441 <span class="keyword">typedef</span> I iterator;
-<a name="l00442"></a>00442 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00443"></a>00443 generic_range_type( I begin_, I end_, size_t grainsize = 1) : <a class="code" href="a00127.html">blocked_range<I></a>(begin_,end_,grainsize) {}
-<a name="l00444"></a>00444 template<typename U>
-<a name="l00445"></a>00445 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00127.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00446"></a>00446 generic_range_type( generic_range_type& r, <a class="code" href="a00173.html">split</a> ) : <a class="code" href="a00127.html">blocked_range<I></a>(r,<a class="code" href="a00173.html">split</a>()) {}
-<a name="l00447"></a>00447 };
-<a name="l00448"></a>00448
-<a name="l00449"></a>00449 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00450"></a>00450 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00451"></a>00451 <span class="keyword">public</span>:
-<a name="l00452"></a>00452 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00453"></a>00453 <span class="comment">// STL compatible types</span>
-<a name="l00454"></a>00454 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00455"></a>00455 <span class="keyword">typedef</span> internal::concurrent_vector_base_v3::size_type size_type;
-<a name="l00456"></a>00456 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_base<T, A>::allocator_type allocator_type;
-<a name="l00457"></a>00457
-<a name="l00458"></a>00458 <span class="keyword">typedef</span> T value_type;
-<a name="l00459"></a>00459 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00460"></a>00460 <span class="keyword">typedef</span> T& reference;
-<a name="l00461"></a>00461 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00462"></a>00462 <span class="keyword">typedef</span> T *pointer;
-<a name="l00463"></a>00463 <span class="keyword">typedef</span> <span class="keyword">const</span> T *const_pointer;
-<a name="l00464"></a>00464
-<a name="l00465"></a>00465 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,T> iterator;
-<a name="l00466"></a>00466 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,const T> const_iterator;
-<a name="l00467"></a>00467
-<a name="l00468"></a>00468 <span class="preprocessor">#if !defined(_MSC_VER) || _CPPLIB_VER>=300 </span>
-<a name="l00469"></a>00469 <span class="preprocessor"></span> <span class="comment">// Assume ISO standard definition of std::reverse_iterator</span>
-<a name="l00470"></a>00470 <span class="keyword">typedef</span> std::reverse_iterator<iterator> reverse_iterator;
-<a name="l00471"></a>00471 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator> const_reverse_iterator;
-<a name="l00472"></a>00472 <span class="preprocessor">#else</span>
-<a name="l00473"></a>00473 <span class="preprocessor"></span> <span class="comment">// Use non-standard std::reverse_iterator</span>
-<a name="l00474"></a>00474 <span class="keyword">typedef</span> std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
-<a name="l00475"></a>00475 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
-<a name="l00476"></a>00476 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && (_MSC_VER<1300) */</span>
-<a name="l00477"></a>00477
-<a name="l00478"></a>00478 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00479"></a>00479 <span class="comment">// Parallel algorithm support</span>
-<a name="l00480"></a>00480 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00481"></a>00481 <span class="keyword">typedef</span> generic_range_type<iterator> range_type;
-<a name="l00482"></a>00482 <span class="keyword">typedef</span> generic_range_type<const_iterator> const_range_type;
-<a name="l00483"></a>00483
-<a name="l00484"></a>00484 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00485"></a>00485 <span class="comment">// STL compatible constructors & destructors</span>
-<a name="l00486"></a>00486 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00487"></a>00487
-<a name="l00489"></a><a class="code" href="a00141.html#2c8ca9cabfcd30ad5943324c853664b5">00489</a> <span class="keyword">explicit</span> <a class="code" href="a00141.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00490"></a>00490 : internal::allocator_base<T, A>(a)
-<a name="l00491"></a>00491 {
-<a name="l00492"></a>00492 vector_allocator_ptr = &internal_allocator;
-<a name="l00493"></a>00493 }
-<a name="l00494"></a>00494
-<a name="l00496"></a><a class="code" href="a00141.html#dd8a200b99a8088435a37934b58fe335">00496</a> <a class="code" href="a00141.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00141.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00497"></a>00497 : internal::allocator_base<T, A>(a)
-<a name="l00498"></a>00498 {
-<a name="l00499"></a>00499 vector_allocator_ptr = &internal_allocator;
-<a name="l00500"></a>00500 <span class="keywordflow">try</span> {
-<a name="l00501"></a>00501 internal_copy(vector, <span class="keyword">sizeof</span>(T), ©_array);
-<a name="l00502"></a>00502 } <span class="keywordflow">catch</span>(...) {
-<a name="l00503"></a>00503 segment_t *table = my_segment;
-<a name="l00504"></a>00504 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00505"></a>00505 <span class="keywordflow">throw</span>;
-<a name="l00506"></a>00506 }
-<a name="l00507"></a>00507 }
-<a name="l00508"></a>00508
-<a name="l00510"></a>00510 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00511"></a><a class="code" href="a00141.html#64432f13f7b29bfe4acfb5568f34f3a8">00511</a> <a class="code" href="a00141.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00141.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00512"></a>00512 : internal::allocator_base<T, A>(a)
-<a name="l00513"></a>00513 {
-<a name="l00514"></a>00514 vector_allocator_ptr = &internal_allocator;
-<a name="l00515"></a>00515 <span class="keywordflow">try</span> {
-<a name="l00516"></a>00516 internal_copy(vector.<a class="code" href="a00141.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), ©_array);
-<a name="l00517"></a>00517 } <span class="keywordflow">catch</span>(...) {
-<a name="l00518"></a>00518 segment_t *table = my_segment;
-<a name="l00519"></a>00519 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00520"></a>00520 <span class="keywordflow">throw</span>;
-<a name="l00521"></a>00521 }
-<a name="l00522"></a>00522 }
-<a name="l00523"></a>00523
-<a name="l00525"></a><a class="code" href="a00141.html#2a2e261dfe1cab3f73f7b1a94137cfca">00525</a> <span class="keyword">explicit</span> <a class="code" href="a00141.html">concurrent_vector</a>(size_type n)
-<a name="l00526"></a>00526 {
-<a name="l00527"></a>00527 vector_allocator_ptr = &internal_allocator;
-<a name="l00528"></a>00528 <span class="keywordflow">try</span> {
-<a name="l00529"></a>00529 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00530"></a>00530 } <span class="keywordflow">catch</span>(...) {
-<a name="l00531"></a>00531 segment_t *table = my_segment;
-<a name="l00532"></a>00532 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00533"></a>00533 <span class="keywordflow">throw</span>;
-<a name="l00534"></a>00534 }
-<a name="l00535"></a>00535 }
-<a name="l00536"></a>00536
-<a name="l00538"></a><a class="code" href="a00141.html#3883a8a908b44e249a57f454de3f55d8">00538</a> <a class="code" href="a00141.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00539"></a>00539 : internal::allocator_base<T, A>(a)
-<a name="l00540"></a>00540 {
-<a name="l00541"></a>00541 vector_allocator_ptr = &internal_allocator;
-<a name="l00542"></a>00542 <span class="keywordflow">try</span> {
-<a name="l00543"></a>00543 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00544"></a>00544 } <span class="keywordflow">catch</span>(...) {
-<a name="l00545"></a>00545 segment_t *table = my_segment;
-<a name="l00546"></a>00546 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00547"></a>00547 <span class="keywordflow">throw</span>;
-<a name="l00548"></a>00548 }
-<a name="l00549"></a>00549 }
-<a name="l00550"></a>00550
-<a name="l00552"></a>00552 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00553"></a><a class="code" href="a00141.html#4450de83c5862ea4bcd9443fd7e67419">00553</a> <a class="code" href="a00141.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00554"></a>00554 : internal::allocator_base<T, A>(a)
-<a name="l00555"></a>00555 {
-<a name="l00556"></a>00556 vector_allocator_ptr = &internal_allocator;
-<a name="l00557"></a>00557 <span class="keywordflow">try</span> {
-<a name="l00558"></a>00558 internal_assign_range(first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00559"></a>00559 } <span class="keywordflow">catch</span>(...) {
-<a name="l00560"></a>00560 segment_t *table = my_segment;
-<a name="l00561"></a>00561 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00562"></a>00562 <span class="keywordflow">throw</span>;
-<a name="l00563"></a>00563 }
-<a name="l00564"></a>00564 }
-<a name="l00565"></a>00565
-<a name="l00567"></a><a class="code" href="a00141.html#691f0f3cda3e489c37a657016e375eaf">00567</a> <a class="code" href="a00141.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00141.html">concurrent_vector</a>& vector ) {
-<a name="l00568"></a>00568 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
-<a name="l00569"></a>00569 internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
-<a name="l00570"></a>00570 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00571"></a>00571 }
-<a name="l00572"></a>00572
-<a name="l00574"></a>00574 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00575"></a><a class="code" href="a00141.html#19f4ab88a01b0fd056af3bba463e7bd6">00575</a> <a class="code" href="a00141.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00141.html">concurrent_vector<T, M></a>& vector ) {
-<a name="l00576"></a>00576 <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
-<a name="l00577"></a>00577 internal_assign(vector.internal_vector_base(),
-<a name="l00578"></a>00578 <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="l00582"></a>00582 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00583"></a>00583 <span class="comment">// Concurrent operations</span>
-<a name="l00584"></a>00584 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00586"></a>00586 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00587"></a>00587 <span class="preprocessor"></span>
-<a name="l00588"></a><a class="code" href="a00141.html#30484e3959892fd5392fa93c873c31f0">00588</a> size_type grow_by( size_type delta ) {
-<a name="l00589"></a>00589 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
-<a name="l00590"></a>00590 }
-<a name="l00591"></a>00591 <span class="preprocessor">#else</span>
-<a name="l00592"></a>00592 <span class="preprocessor"></span>
-<a name="l00593"></a><a class="code" href="a00141.html#c8177b1865270ea68aa1ab9148e5e35e">00593</a> iterator grow_by( size_type delta ) {
-<a name="l00594"></a>00594 <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="l00595"></a>00595 }
-<a name="l00596"></a>00596 <span class="preprocessor">#endif</span>
-<a name="l00597"></a>00597 <span class="preprocessor"></span>
-<a name="l00599"></a>00599 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00600"></a>00600 <span class="preprocessor"></span>
-<a name="l00601"></a><a class="code" href="a00141.html#38274ab3f772ecba600c7daca7690102">00601</a> size_type grow_by( size_type delta, const_reference t ) {
-<a name="l00602"></a>00602 <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="l00603"></a>00603 }
-<a name="l00604"></a>00604 <span class="preprocessor">#else</span>
-<a name="l00605"></a>00605 <span class="preprocessor"></span>
-<a name="l00606"></a><a class="code" href="a00141.html#473a59a4c9308b93411b898b3110d26c">00606</a> iterator grow_by( size_type delta, const_reference t ) {
-<a name="l00607"></a>00607 <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="l00608"></a>00608 }
-<a name="l00609"></a>00609 <span class="preprocessor">#endif</span>
-<a name="l00610"></a>00610 <span class="preprocessor"></span>
-<a name="l00612"></a>00612 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00613"></a>00613 <span class="preprocessor"></span>
-<a name="l00615"></a><a class="code" href="a00141.html#47fe588214dd5fa06ab6e8ab78d83874">00615</a> <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
-<a name="l00616"></a>00616 <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="l00617"></a>00617 };
-<a name="l00618"></a>00618 <span class="preprocessor">#else</span>
-<a name="l00619"></a>00619 <span class="preprocessor"></span>
-<a name="l00623"></a><a class="code" href="a00141.html#a7e3b67c8ccab16d0aecc80899ae799d">00623</a> iterator grow_to_at_least( size_type n ) {
-<a name="l00624"></a>00624 size_type m=0;
-<a name="l00625"></a>00625 <span class="keywordflow">if</span>( n ) {
-<a name="l00626"></a>00626 m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
-<a name="l00627"></a>00627 <span class="keywordflow">if</span>( m>n ) m=n;
-<a name="l00628"></a>00628 }
-<a name="l00629"></a>00629 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, m);
-<a name="l00630"></a>00630 };
-<a name="l00631"></a>00631 <span class="preprocessor">#endif</span>
-<a name="l00632"></a>00632 <span class="preprocessor"></span>
-<a name="l00634"></a>00634 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00635"></a><a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">00635</a> <span class="preprocessor"></span> size_type push_back( const_reference item )
-<a name="l00636"></a>00636 <span class="preprocessor">#else</span>
-<a name="l00637"></a>00637 <span class="preprocessor"></span>
-<a name="l00638"></a>00638 iterator push_back( const_reference item )
-<a name="l00639"></a>00639 <span class="preprocessor">#endif</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span> {
-<a name="l00641"></a>00641 size_type k;
-<a name="l00642"></a>00642 <span class="keywordtype">void</span> *ptr = internal_push_back(<span class="keyword">sizeof</span>(T),k);
-<a name="l00643"></a>00643 internal_loop_guide loop(1, ptr);
-<a name="l00644"></a>00644 loop.init(&item);
-<a name="l00645"></a>00645 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00646"></a>00646 <span class="preprocessor"></span> <span class="keywordflow">return</span> k;
-<a name="l00647"></a>00647 <span class="preprocessor">#else</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span> <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, k, ptr);
-<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
-<a name="l00655"></a><a class="code" href="a00141.html#4c52f2950bb1832886bd4458eb09d7eb">00655</a> reference operator[]( size_type index ) {
-<a name="l00656"></a>00656 <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00657"></a>00657 }
-<a name="l00658"></a>00658
-<a name="l00660"></a><a class="code" href="a00141.html#c6fade5c732cc95274d1d8277ea619d1">00660</a> const_reference operator[]( size_type index )<span class="keyword"> const </span>{
-<a name="l00661"></a>00661 <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00662"></a>00662 }
-<a name="l00663"></a>00663
-<a name="l00665"></a><a class="code" href="a00141.html#0c073ca43e787c7cbf7b0e26d2221748">00665</a> reference at( size_type index ) {
-<a name="l00666"></a>00666 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00667"></a>00667 }
-<a name="l00668"></a>00668
-<a name="l00670"></a><a class="code" href="a00141.html#23e14a38af748edff96a7adc3a0f1c58">00670</a> const_reference at( size_type index )<span class="keyword"> const </span>{
-<a name="l00671"></a>00671 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00672"></a>00672 }
-<a name="l00673"></a>00673
-<a name="l00675"></a><a class="code" href="a00141.html#a4c6ffff3bf08b92939aa2fc516edfba">00675</a> range_type range( size_t grainsize = 1) {
-<a name="l00676"></a>00676 <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
-<a name="l00677"></a>00677 }
-<a name="l00678"></a>00678
-<a name="l00680"></a><a class="code" href="a00141.html#3d09ccfb581b879ae64203741035e193">00680</a> const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
-<a name="l00681"></a>00681 <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
-<a name="l00682"></a>00682 }
-<a name="l00683"></a>00683 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00684"></a>00684 <span class="comment">// Capacity</span>
-<a name="l00685"></a>00685 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00687"></a><a class="code" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">00687</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
-<a name="l00688"></a>00688 size_type sz = my_early_size, cp = internal_capacity();
-<a name="l00689"></a>00689 <span class="keywordflow">return</span> cp < sz ? cp : sz;
-<a name="l00690"></a>00690 }
-<a name="l00691"></a>00691
-<a name="l00693"></a><a class="code" href="a00141.html#c6426cb93cf20d3af40f3c90f1f0481a">00693</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
-<a name="l00694"></a>00694
-<a name="l00696"></a><a class="code" href="a00141.html#3ed6b9ae7217af5103d974045b6f5cd5">00696</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
-<a name="l00697"></a>00697
-<a name="l00699"></a>00699
-<a name="l00701"></a><a class="code" href="a00141.html#5a0ce05026994b010018f72cfdeb72c1">00701</a> <span class="keywordtype">void</span> reserve( size_type n ) {
-<a name="l00702"></a>00702 <span class="keywordflow">if</span>( n )
-<a name="l00703"></a>00703 internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
-<a name="l00704"></a>00704 }
-<a name="l00705"></a>00705
-<a name="l00707"></a><a class="code" href="a00141.html#8dfb0cb0eef96d440b4dcf801807a718">00707</a> <span class="keywordtype">void</span> resize( size_type n ) {
-<a name="l00708"></a>00708 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00709"></a>00709 }
-<a name="l00710"></a>00710
-<a name="l00712"></a><a class="code" href="a00141.html#98ce6b2c6d2622f0c030b46dfac3880c">00712</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
-<a name="l00713"></a>00713 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00714"></a>00714 }
-<a name="l00715"></a>00715
-<a name="l00716"></a>00716 <span class="preprocessor">#if TBB_DEPRECATED </span>
-<a name="l00718"></a><a class="code" href="a00141.html#1693d1da41b1a8235871be9c6633be35">00718</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
-<a name="l00719"></a>00719 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00720"></a>00720
-<a name="l00722"></a>00722 <span class="keywordtype">void</span> shrink_to_fit();
-<a name="l00723"></a>00723
-<a name="l00725"></a><a class="code" href="a00141.html#2c248a017f0576df3e7cd99627836fd6">00725</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="l00726"></a>00726
-<a name="l00727"></a>00727 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00728"></a>00728 <span class="comment">// STL support</span>
-<a name="l00729"></a>00729 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00730"></a>00730
-<a name="l00732"></a><a class="code" href="a00141.html#730b23a251ecb6d37f692fb22f38e029">00732</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
-<a name="l00734"></a><a class="code" href="a00141.html#c0b51160e5a764982ec97a455f94f2c6">00734</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
-<a name="l00736"></a><a class="code" href="a00141.html#78a06182276ff758788d4c0623ae0d71">00736</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00738"></a><a class="code" href="a00141.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00738</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00740"></a><a class="code" href="a00141.html#f88fcf1c920693c39bd9709db33c199f">00740</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00742"></a><a class="code" href="a00141.html#0c15a5d0f1cf75d687dabba07da1d46b">00742</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00744"></a><a class="code" href="a00141.html#5e220926d09236d98f04fe0721e5f9a1">00744</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
-<a name="l00746"></a><a class="code" href="a00141.html#290119a4eb43cd6a9e98fa17016ba3c2">00746</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
-<a name="l00748"></a><a class="code" href="a00141.html#9f9c103e18d5f212703805354074ad44">00748</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00750"></a><a class="code" href="a00141.html#d438b9b32ea3a8ffb703015b6dce055b">00750</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00752"></a><a class="code" href="a00141.html#db78a1d28c9c966050e8a2926d834a33">00752</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00754"></a><a class="code" href="a00141.html#fff9cece89438587997ebedf93c5e962">00754</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00756"></a><a class="code" href="a00141.html#15181759c0bfa2ddce5d10c7550e0002">00756</a> reference front() {
-<a name="l00757"></a>00757 __TBB_ASSERT( size()>0, NULL);
-<a name="l00758"></a>00758 <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
-<a name="l00759"></a>00759 }
-<a name="l00761"></a><a class="code" href="a00141.html#502615a858eb9fa0390ee59169065e90">00761</a> const_reference front()<span class="keyword"> const </span>{
-<a name="l00762"></a>00762 __TBB_ASSERT( size()>0, NULL);
-<a name="l00763"></a>00763 <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
-<a name="l00764"></a>00764 }
-<a name="l00766"></a><a class="code" href="a00141.html#41ce48d6015a1a2812d41cf620ec3476">00766</a> reference back() {
-<a name="l00767"></a>00767 __TBB_ASSERT( size()>0, NULL);
-<a name="l00768"></a>00768 <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00769"></a>00769 }
-<a name="l00771"></a><a class="code" href="a00141.html#bd518e204107d07fd08d0ec5bdfd383d">00771</a> const_reference back()<span class="keyword"> const </span>{
-<a name="l00772"></a>00772 __TBB_ASSERT( size()>0, NULL);
-<a name="l00773"></a>00773 <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00774"></a>00774 }
-<a name="l00776"></a><a class="code" href="a00141.html#2fdba8e90de6a4d2300222236d46758e">00776</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00777"></a>00777
-<a name="l00779"></a><a class="code" href="a00141.html#423e5aa15e0e3309ad86d026fd85f6f6">00779</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
-<a name="l00780"></a>00780 clear();
-<a name="l00781"></a>00781 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00782"></a>00782 }
-<a name="l00783"></a>00783
-<a name="l00785"></a>00785 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00786"></a><a class="code" href="a00141.html#93a06b3112cb804f42f40efb5e7387b4">00786</a> <span class="keywordtype">void</span> assign(I first, I last) {
-<a name="l00787"></a>00787 clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00788"></a>00788 }
-<a name="l00789"></a>00789
-<a name="l00791"></a><a class="code" href="a00141.html#96c9c4bd968ed3edb8dd276854d2dae0">00791</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00141.html">concurrent_vector</a> &vector) {
-<a name="l00792"></a>00792 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
-<a name="l00793"></a>00793 concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
-<a name="l00794"></a>00794 std::swap(this->my_allocator, vector.my_allocator);
-<a name="l00795"></a>00795 }
-<a name="l00796"></a>00796 }
-<a name="l00797"></a>00797
-<a name="l00799"></a>00799
-<a name="l00800"></a><a class="code" href="a00141.html#26f937a359a66b6aae904c3cd9a3c444">00800</a> <span class="keywordtype">void</span> clear() {
-<a name="l00801"></a>00801 internal_clear(&destroy_array);
-<a name="l00802"></a>00802 }
-<a name="l00803"></a>00803
-<a name="l00805"></a><a class="code" href="a00141.html#da2444b28bb840d38f60d0030333a5fc">00805</a> ~<a class="code" href="a00141.html">concurrent_vector</a>() {
-<a name="l00806"></a>00806 segment_t *table = my_segment;
-<a name="l00807"></a>00807 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00808"></a>00808 <span class="comment">// base class destructor call should be then</span>
-<a name="l00809"></a>00809 }
-<a name="l00810"></a>00810
-<a name="l00811"></a>00811 <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="l00812"></a>00812 <span class="keyword">private</span>:
-<a name="l00814"></a>00814 <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
-<a name="l00815"></a>00815 <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
-<a name="l00816"></a>00816 }
-<a name="l00818"></a>00818 <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="l00819"></a>00819
-<a name="l00821"></a>00821 T& internal_subscript( size_type index ) <span class="keyword">const</span>;
-<a name="l00822"></a>00822
-<a name="l00824"></a>00824 T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
-<a name="l00825"></a>00825
-<a name="l00827"></a>00827 <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
-<a name="l00828"></a>00828 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="l00829"></a>00829 }
-<a name="l00830"></a>00830
-<a name="l00832"></a>00832 <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
-<a name="l00833"></a>00833
-<a name="l00835"></a>00835 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00836"></a>00836 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
-<a name="l00837"></a>00837 internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
-<a name="l00838"></a>00838 }
-<a name="l00840"></a>00840 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00841"></a>00841 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
-<a name="l00842"></a>00842 internal_assign_iterators(first, last);
-<a name="l00843"></a>00843 }
-<a name="l00845"></a>00845 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00846"></a>00846 <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
-<a name="l00847"></a>00847
-<a name="l00849"></a>00849 <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="l00850"></a>00850
-<a name="l00852"></a>00852 <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="l00853"></a>00853
-<a name="l00855"></a>00855 <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="l00856"></a>00856
-<a name="l00858"></a>00858 <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="l00859"></a>00859
-<a name="l00861"></a>00861 <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="l00862"></a>00862
-<a name="l00864"></a>00864 <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
-<a name="l00865"></a>00865 <span class="keyword">public</span>:
-<a name="l00866"></a>00866 <span class="keyword">const</span> pointer array;
-<a name="l00867"></a>00867 <span class="keyword">const</span> size_type n;
-<a name="l00868"></a>00868 size_type i;
-<a name="l00869"></a>00869 internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
-<a name="l00870"></a>00870 : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
-<a name="l00871"></a>00871 <span class="keywordtype">void</span> init() { <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
-<a name="l00872"></a>00872 <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="l00873"></a>00873 <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="l00874"></a>00874 <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="l00875"></a>00875 <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="l00876"></a>00876 ~internal_loop_guide() {
-<a name="l00877"></a>00877 <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zerroing on the rest of items</span>
-<a name="l00878"></a>00878 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
-<a name="l00879"></a>00879 }
-<a name="l00880"></a>00880 };
-<a name="l00881"></a>00881 };
-<a name="l00882"></a>00882
-<a name="l00883"></a>00883 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00884"></a><a class="code" href="a00141.html#03c6f4cf66532bf4cc907ee738a9a186">00884</a> <span class="keywordtype">void</span> <a class="code" href="a00141.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
-<a name="l00885"></a>00885 internal_segments_table old;
-<a name="l00886"></a>00886 <span class="keywordflow">try</span> {
-<a name="l00887"></a>00887 <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, ©_array ) )
-<a name="l00888"></a>00888 internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
-<a name="l00889"></a>00889 } <span class="keywordflow">catch</span>(...) {
-<a name="l00890"></a>00890 <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="l00891"></a>00891 internal_free_segments( old.table, 1, old.first_block );
-<a name="l00892"></a>00892 <span class="keywordflow">throw</span>;
-<a name="l00893"></a>00893 }
-<a name="l00894"></a>00894 }
-<a name="l00895"></a>00895
-<a name="l00896"></a>00896 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00897"></a>00897 <span class="keywordtype">void</span> <a class="code" href="a00141.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="l00898"></a>00898 <span class="comment">// Free the arrays</span>
-<a name="l00899"></a>00899 <span class="keywordflow">while</span>( k > first_block ) {
-<a name="l00900"></a>00900 --k;
-<a name="l00901"></a>00901 T* array = static_cast<T*>(table[k]);
-<a name="l00902"></a>00902 table[k] = NULL;
-<a name="l00903"></a>00903 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00904"></a>00904 this->my_allocator.deallocate( array, segment_size(k) );
-<a name="l00905"></a>00905 }
-<a name="l00906"></a>00906 T* array = static_cast<T*>(table[0]);
-<a name="l00907"></a>00907 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
-<a name="l00908"></a>00908 __TBB_ASSERT( first_block > 0, NULL );
-<a name="l00909"></a>00909 <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
-<a name="l00910"></a>00910 this->my_allocator.deallocate( array, segment_size(first_block) );
-<a name="l00911"></a>00911 }
-<a name="l00912"></a>00912 }
-<a name="l00913"></a>00913
-<a name="l00914"></a>00914 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00915"></a>00915 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
-<a name="l00916"></a>00916 __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
-<a name="l00917"></a>00917 size_type j = index;
-<a name="l00918"></a>00918 segment_index_t k = segment_base_index_of( j );
-<a name="l00919"></a>00919 __TBB_ASSERT( my_segment != (segment_t*)my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00920"></a>00920 <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
-<a name="l00921"></a>00921 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00922"></a>00922 <span class="preprocessor"></span> T* array = static_cast<T*>( tbb::internal::itt_load_pointer_v3(&my_segment[k].array));
-<a name="l00923"></a>00923 <span class="preprocessor">#else</span>
-<a name="l00924"></a>00924 <span class="preprocessor"></span> T* array = static_cast<T*>(my_segment[k].array);
-<a name="l00925"></a>00925 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00926"></a>00926 __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
-<a name="l00927"></a>00927 __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00928"></a>00928 <span class="keywordflow">return</span> array[j];
-<a name="l00929"></a>00929 }
-<a name="l00930"></a>00930
-<a name="l00931"></a>00931 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00932"></a>00932 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
-<a name="l00933"></a>00933 <span class="keywordflow">if</span>( index >= my_early_size )
-<a name="l00934"></a>00934 internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
-<a name="l00935"></a>00935 size_type j = index;
-<a name="l00936"></a>00936 segment_index_t k = segment_base_index_of( j );
-<a name="l00937"></a>00937 <span class="keywordflow">if</span>( my_segment == (segment_t*)my_storage && k >= pointers_per_short_table )
-<a name="l00938"></a>00938 internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00939"></a>00939 <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
-<a name="l00940"></a>00940 <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00941"></a>00941 internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00942"></a>00942 <span class="keywordflow">return</span> static_cast<T*>(array)[j];
-<a name="l00943"></a>00943 }
-<a name="l00944"></a>00944
-<a name="l00945"></a>00945 <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="l00946"></a>00946 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
-<a name="l00947"></a>00947 __TBB_ASSERT(my_early_size == 0, NULL);
-<a name="l00948"></a>00948 size_type n = std::distance(first, last);
-<a name="l00949"></a>00949 <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
-<a name="l00950"></a>00950 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00141.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
-<a name="l00951"></a>00951 my_early_size = n;
-<a name="l00952"></a>00952 segment_index_t k = 0;
-<a name="l00953"></a>00953 size_type sz = segment_size( my_first_block );
-<a name="l00954"></a>00954 <span class="keywordflow">while</span>( sz < n ) {
-<a name="l00955"></a>00955 internal_loop_guide loop(sz, my_segment[k].array);
-<a name="l00956"></a>00956 loop.iterate(first);
-<a name="l00957"></a>00957 n -= sz;
-<a name="l00958"></a>00958 <span class="keywordflow">if</span>( !k ) k = my_first_block;
-<a name="l00959"></a>00959 <span class="keywordflow">else</span> { ++k; sz <<= 1; }
-<a name="l00960"></a>00960 }
-<a name="l00961"></a>00961 internal_loop_guide loop(n, my_segment[k].array);
-<a name="l00962"></a>00962 loop.iterate(first);
-<a name="l00963"></a>00963 }
-<a name="l00964"></a>00964
-<a name="l00965"></a>00965 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00966"></a>00966 <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="l00967"></a>00967 internal_loop_guide loop(n, begin); loop.init();
-<a name="l00968"></a>00968 }
-<a name="l00969"></a>00969
-<a name="l00970"></a>00970 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00971"></a>00971 <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="l00972"></a>00972 internal_loop_guide loop(n, begin); loop.init(src);
-<a name="l00973"></a>00973 }
-<a name="l00974"></a>00974
-<a name="l00975"></a>00975 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00976"></a>00976 <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="l00977"></a>00977 internal_loop_guide loop(n, dst); loop.copy(src);
-<a name="l00978"></a>00978 }
-<a name="l00979"></a>00979
-<a name="l00980"></a>00980 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00981"></a>00981 <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="l00982"></a>00982 internal_loop_guide loop(n, dst); loop.assign(src);
-<a name="l00983"></a>00983 }
-<a name="l00984"></a>00984
-<a name="l00985"></a>00985 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00986"></a>00986 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warning</span>
-<a name="l00987"></a>00987 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00988"></a>00988 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4189)</span>
-<a name="l00989"></a>00989 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00990"></a>00990 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00991"></a>00991 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
-<a name="l00992"></a>00992 T* array = static_cast<T*>(begin);
-<a name="l00993"></a>00993 <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
-<a name="l00994"></a>00994 array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
-<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="preprocessor"> #pragma warning (pop)</span>
-<a name="l00998"></a>00998 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back </span>
-<a name="l00999"></a>00999 <span class="preprocessor"></span>
-<a name="l01000"></a>01000 <span class="comment">// concurrent_vector's template functions</span>
-<a name="l01001"></a>01001 <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="l01002"></a>01002 <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="l01003"></a>01003 <span class="comment">// Simply: return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
-<a name="l01004"></a>01004 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01005"></a>01005 <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
-<a name="l01006"></a>01006 <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
-<a name="l01007"></a>01007 <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
-<a name="l01008"></a>01008 <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01009"></a>01009 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01010"></a>01010 }
-<a name="l01011"></a>01011
-<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="keywordflow">return</span> !(a == b); }
-<a name="l01015"></a>01015
-<a name="l01016"></a>01016 <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="l01017"></a>01017 <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="l01018"></a>01018 { <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
-<a name="l01019"></a>01019
-<a name="l01020"></a>01020 <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="l01021"></a>01021 <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="l01022"></a>01022 { <span class="keywordflow">return</span> b < a; }
-<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<=(const 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> !(b < a); }
-<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>=(<span class="keyword">const</span> 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> !(a < b); }
-<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> A>
-<a name="l01033"></a>01033 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
-<a name="l01034"></a>01034 { a.swap( b ); }
-<a name="l01035"></a>01035
-<a name="l01036"></a>01036 } <span class="comment">// namespace tbb</span>
-<a name="l01037"></a>01037
-<a name="l01038"></a>01038 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l01039"></a>01039 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l01040"></a>01040 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
-<a name="l01041"></a>01041 <span class="preprocessor"></span>
-<a name="l01042"></a>01042 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00298.html b/doc/html/a00298.html
new file mode 100644
index 0000000..5dbe7df
--- /dev/null
+++ b/doc/html/a00298.html
@@ -0,0 +1,1446 @@
+<!DOCTYPE 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>
+<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_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-2010 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 "tbb_machine.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_number_of_buckets(n_of_buckets), 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 internal_init();
+<a name="l00689"></a>00689 }
+<a name="l00690"></a>00690
+<a name="l00691"></a>00691 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right, <span class="keyword">const</span> allocator_type& a)
+<a name="l00692"></a>00692 : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
+<a name="l00693"></a>00693 {
+<a name="l00694"></a>00694 internal_copy(right);
+<a name="l00695"></a>00695 }
+<a name="l00696"></a>00696
+<a name="l00697"></a>00697 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right)
+<a name="l00698"></a>00698 : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
+<a name="l00699"></a>00699 {
+<a name="l00700"></a>00700 internal_init();
+<a name="l00701"></a>00701 internal_copy(right);
+<a name="l00702"></a>00702 }
+<a name="l00703"></a>00703
+<a name="l00704"></a>00704 concurrent_unordered_base& operator=(<span class="keyword">const</span> concurrent_unordered_base& right) {
+<a name="l00705"></a>00705 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right)
+<a name="l00706"></a>00706 internal_copy(right);
+<a name="l00707"></a>00707 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
+<a name="l00708"></a>00708 }
+<a name="l00709"></a>00709
+<a name="l00710"></a>00710 ~concurrent_unordered_base() {
+<a name="l00711"></a>00711 <span class="comment">// Delete all node segments</span>
+<a name="l00712"></a>00712 internal_clear();
+<a name="l00713"></a>00713 }
+<a name="l00714"></a>00714
+<a name="l00715"></a>00715 <span class="keyword">public</span>:
+<a name="l00716"></a>00716 allocator_type get_allocator()<span class="keyword"> const </span>{
+<a name="l00717"></a>00717 <span class="keywordflow">return</span> my_solist.get_allocator();
+<a name="l00718"></a>00718 }
+<a name="l00719"></a>00719
+<a name="l00720"></a>00720 <span class="comment">// Size and capacity function</span>
+<a name="l00721"></a>00721 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
+<a name="l00722"></a>00722 <span class="keywordflow">return</span> my_solist.empty();
+<a name="l00723"></a>00723 }
+<a name="l00724"></a>00724
+<a name="l00725"></a>00725 size_type size()<span class="keyword"> const </span>{
+<a name="l00726"></a>00726 <span class="keywordflow">return</span> my_solist.size();
+<a name="l00727"></a>00727 }
+<a name="l00728"></a>00728
+<a name="l00729"></a>00729 size_type max_size()<span class="keyword"> const </span>{
+<a name="l00730"></a>00730 <span class="keywordflow">return</span> my_solist.max_size();
+<a name="l00731"></a>00731 }
+<a name="l00732"></a>00732
+<a name="l00733"></a>00733 <span class="comment">// Iterators </span>
+<a name="l00734"></a>00734 iterator begin() {
+<a name="l00735"></a>00735 <span class="keywordflow">return</span> my_solist.begin();
+<a name="l00736"></a>00736 }
+<a name="l00737"></a>00737
+<a name="l00738"></a>00738 const_iterator begin()<span class="keyword"> const </span>{
+<a name="l00739"></a>00739 <span class="keywordflow">return</span> my_solist.begin();
+<a name="l00740"></a>00740 }
+<a name="l00741"></a>00741
+<a name="l00742"></a>00742 iterator end() {
+<a name="l00743"></a>00743 <span class="keywordflow">return</span> my_solist.end();
+<a name="l00744"></a>00744 }
+<a name="l00745"></a>00745
+<a name="l00746"></a>00746 const_iterator end()<span class="keyword"> const </span>{
+<a name="l00747"></a>00747 <span class="keywordflow">return</span> my_solist.end();
+<a name="l00748"></a>00748 }
+<a name="l00749"></a>00749
+<a name="l00750"></a>00750 const_iterator cbegin()<span class="keyword"> const </span>{
+<a name="l00751"></a>00751 <span class="keywordflow">return</span> my_solist.cbegin();
+<a name="l00752"></a>00752 }
+<a name="l00753"></a>00753
+<a name="l00754"></a>00754 const_iterator cend()<span class="keyword"> const </span>{
+<a name="l00755"></a>00755 <span class="keywordflow">return</span> my_solist.cend();
+<a name="l00756"></a>00756 }
+<a name="l00757"></a>00757
+<a name="l00758"></a>00758 <span class="comment">// Parallel traversal support</span>
+<a name="l00759"></a>00759 <span class="keyword">class </span>const_range_type : tbb::internal::no_assign {
+<a name="l00760"></a>00760 <span class="keyword">const</span> concurrent_unordered_base &my_table;
+<a name="l00761"></a>00761 raw_const_iterator my_begin_node;
+<a name="l00762"></a>00762 raw_const_iterator my_end_node;
+<a name="l00763"></a>00763 <span class="keyword">mutable</span> raw_const_iterator my_midpoint_node;
+<a name="l00764"></a>00764 <span class="keyword">public</span>:
+<a name="l00766"></a>00766 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::size_type size_type;
+<a name="l00767"></a>00767 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::value_type value_type;
+<a name="l00768"></a>00768 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::reference reference;
+<a name="l00769"></a>00769 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::difference_type difference_type;
+<a name="l00770"></a>00770 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::const_iterator iterator;
+<a name="l00771"></a>00771
+<a name="l00773"></a>00773 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin_node == my_end_node;}
+<a name="l00774"></a>00774
+<a name="l00776"></a>00776 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
+<a name="l00777"></a>00777 <span class="keywordflow">return</span> my_midpoint_node != my_end_node;
+<a name="l00778"></a>00778 }
+<a name="l00780"></a>00780 const_range_type( const_range_type &r, split ) :
+<a name="l00781"></a>00781 my_table(r.my_table), my_end_node(r.my_end_node)
+<a name="l00782"></a>00782 {
+<a name="l00783"></a>00783 r.my_end_node = my_begin_node = r.my_midpoint_node;
+<a name="l00784"></a>00784 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00785"></a>00785 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00786"></a>00786 set_midpoint();
+<a name="l00787"></a>00787 r.set_midpoint();
+<a name="l00788"></a>00788 }
+<a name="l00790"></a>00790 const_range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) :
+<a name="l00791"></a>00791 my_table(a_table), my_begin_node(a_table.my_solist.begin()),
+<a name="l00792"></a>00792 my_end_node(a_table.my_solist.end())
+<a name="l00793"></a>00793 {
+<a name="l00794"></a>00794 set_midpoint();
+<a name="l00795"></a>00795 }
+<a name="l00796"></a>00796 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_begin_node); }
+<a name="l00797"></a>00797 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_end_node); }
+<a name="l00799"></a>00799 size_type grainsize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1; }
+<a name="l00800"></a>00800
+<a name="l00802"></a>00802 <span class="keywordtype">void</span> set_midpoint()<span class="keyword"> const </span>{
+<a name="l00803"></a>00803 <span class="keywordflow">if</span>( my_begin_node == my_end_node ) <span class="comment">// not divisible</span>
+<a name="l00804"></a>00804 my_midpoint_node = my_end_node;
+<a name="l00805"></a>00805 <span class="keywordflow">else</span> {
+<a name="l00806"></a>00806 sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
+<a name="l00807"></a>00807 sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
+<a name="l00808"></a>00808 size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
+<a name="l00809"></a>00809 <span class="keywordflow">while</span> ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
+<a name="l00810"></a>00810 my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
+<a name="l00811"></a>00811 <span class="keywordflow">if</span>( my_midpoint_node == my_begin_node )
+<a name="l00812"></a>00812 my_midpoint_node = my_end_node;
+<a name="l00813"></a>00813 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00814"></a>00814 <span class="preprocessor"></span> <span class="keywordflow">else</span> {
+<a name="l00815"></a>00815 sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
+<a name="l00816"></a>00816 __TBB_ASSERT( begin_key < mid_key, <span class="stringliteral">"my_begin_node is after my_midpoint_node"</span> );
+<a name="l00817"></a>00817 __TBB_ASSERT( mid_key <= end_key, <span class="stringliteral">"my_midpoint_node is after my_end_node"</span> );
+<a name="l00818"></a>00818 }
+<a name="l00819"></a>00819 <span class="preprocessor">#endif // TBB_USE_ASSERT</span>
+<a name="l00820"></a>00820 <span class="preprocessor"></span> }
+<a name="l00821"></a>00821 }
+<a name="l00822"></a>00822 };
+<a name="l00823"></a>00823
+<a name="l00824"></a>00824 <span class="keyword">class </span>range_type : <span class="keyword">public</span> const_range_type {
+<a name="l00825"></a>00825 <span class="keyword">public</span>:
+<a name="l00826"></a>00826 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::iterator iterator;
+<a name="l00828"></a>00828 range_type( range_type &r, split ) : const_range_type( r, split() ) {}
+<a name="l00830"></a>00830 range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
+<a name="l00831"></a>00831
+<a name="l00832"></a>00832 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::begin() ); }
+<a name="l00833"></a>00833 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::end() ); }
+<a name="l00834"></a>00834 };
+<a name="l00835"></a>00835
+<a name="l00836"></a>00836 range_type range() {
+<a name="l00837"></a>00837 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span> );
+<a name="l00838"></a>00838 }
+<a name="l00839"></a>00839
+<a name="l00840"></a>00840 const_range_type range()<span class="keyword"> const </span>{
+<a name="l00841"></a>00841 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span> );
+<a name="l00842"></a>00842 }
+<a name="l00843"></a>00843
+<a name="l00844"></a>00844 <span class="comment">// Modifiers</span>
+<a name="l00845"></a>00845 std::pair<iterator, bool> insert(<span class="keyword">const</span> value_type& value) {
+<a name="l00846"></a>00846 <span class="keywordflow">return</span> internal_insert(value);
+<a name="l00847"></a>00847 }
+<a name="l00848"></a>00848
+<a name="l00849"></a>00849 iterator insert(const_iterator, <span class="keyword">const</span> value_type& value) {
+<a name="l00850"></a>00850 <span class="comment">// Ignore hint</span>
+<a name="l00851"></a>00851 <span class="keywordflow">return</span> insert(value).first;
+<a name="l00852"></a>00852 }
+<a name="l00853"></a>00853
+<a name="l00854"></a>00854 <span class="keyword">template</span><<span class="keyword">class</span> Iterator>
+<a name="l00855"></a>00855 <span class="keywordtype">void</span> insert(Iterator first, Iterator last) {
+<a name="l00856"></a>00856 <span class="keywordflow">for</span> (Iterator it = first; it != last; ++it)
+<a name="l00857"></a>00857 insert(*it);
+<a name="l00858"></a>00858 }
+<a name="l00859"></a>00859
+<a name="l00860"></a>00860 iterator unsafe_erase(const_iterator where) {
+<a name="l00861"></a>00861 <span class="keywordflow">return</span> internal_erase(where);
+<a name="l00862"></a>00862 }
+<a name="l00863"></a>00863
+<a name="l00864"></a>00864 iterator unsafe_erase(const_iterator first, const_iterator last) {
+<a name="l00865"></a>00865 <span class="keywordflow">while</span> (first != last)
+<a name="l00866"></a>00866 unsafe_erase(first++);
+<a name="l00867"></a>00867 <span class="keywordflow">return</span> my_solist.get_iterator(first);
+<a name="l00868"></a>00868 }
+<a name="l00869"></a>00869
+<a name="l00870"></a>00870 size_type unsafe_erase(<span class="keyword">const</span> key_type& key) {
+<a name="l00871"></a>00871 pairii_t where = equal_range(key);
+<a name="l00872"></a>00872 size_type item_count = internal_distance(where.first, where.second);
+<a name="l00873"></a>00873 unsafe_erase(where.first, where.second);
+<a name="l00874"></a>00874 <span class="keywordflow">return</span> item_count;
+<a name="l00875"></a>00875 }
+<a name="l00876"></a>00876
+<a name="l00877"></a>00877 <span class="keywordtype">void</span> swap(concurrent_unordered_base& right) {
+<a name="l00878"></a>00878 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right) {
+<a name="l00879"></a>00879 std::swap(my_hash_compare, right.my_hash_compare); <span class="comment">// TODO: check what ADL meant here</span>
+<a name="l00880"></a>00880 my_solist.swap(right.my_solist);
+<a name="l00881"></a>00881 internal_swap_buckets(right);
+<a name="l00882"></a>00882 std::swap(my_number_of_buckets, right.my_number_of_buckets);
+<a name="l00883"></a>00883 std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
+<a name="l00884"></a>00884 }
+<a name="l00885"></a>00885 }
+<a name="l00886"></a>00886
+<a name="l00887"></a>00887 <span class="comment">// Observers</span>
+<a name="l00888"></a>00888 <span class="keywordtype">void</span> clear() {
+<a name="l00889"></a>00889 <span class="comment">// Clear list</span>
+<a name="l00890"></a>00890 my_solist.clear();
+<a name="l00891"></a>00891
+<a name="l00892"></a>00892 <span class="comment">// Clear buckets</span>
+<a name="l00893"></a>00893 internal_clear();
+<a name="l00894"></a>00894 }
+<a name="l00895"></a>00895
+<a name="l00896"></a>00896 <span class="comment">// Lookup</span>
+<a name="l00897"></a>00897 iterator find(<span class="keyword">const</span> key_type& key) {
+<a name="l00898"></a>00898 <span class="keywordflow">return</span> internal_find(key);
+<a name="l00899"></a>00899 }
+<a name="l00900"></a>00900
+<a name="l00901"></a>00901 const_iterator find(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00902"></a>00902 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key);
+<a name="l00903"></a>00903 }
+<a name="l00904"></a>00904
+<a name="l00905"></a>00905 size_type count(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00906"></a>00906 paircc_t answer = equal_range(key);
+<a name="l00907"></a>00907 size_type item_count = internal_distance(answer.first, answer.second);
+<a name="l00908"></a>00908 <span class="keywordflow">return</span> item_count;
+<a name="l00909"></a>00909 }
+<a name="l00910"></a>00910
+<a name="l00911"></a>00911 std::pair<iterator, iterator> equal_range(<span class="keyword">const</span> key_type& key) {
+<a name="l00912"></a>00912 <span class="keywordflow">return</span> internal_equal_range(key);
+<a name="l00913"></a>00913 }
+<a name="l00914"></a>00914
+<a name="l00915"></a>00915 std::pair<const_iterator, const_iterator> equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00916"></a>00916 <span class="keywordflow">return</span> internal_equal_range(key);
+<a name="l00917"></a>00917 }
+<a name="l00918"></a>00918
+<a name="l00919"></a>00919 <span class="comment">// Bucket interface - for debugging </span>
+<a name="l00920"></a>00920 size_type unsafe_bucket_count()<span class="keyword"> const </span>{
+<a name="l00921"></a>00921 <span class="keywordflow">return</span> my_number_of_buckets;
+<a name="l00922"></a>00922 }
+<a name="l00923"></a>00923
+<a name="l00924"></a>00924 size_type unsafe_max_bucket_count()<span class="keyword"> const </span>{
+<a name="l00925"></a>00925 <span class="keywordflow">return</span> segment_size(pointers_per_table-1);
+<a name="l00926"></a>00926 }
+<a name="l00927"></a>00927
+<a name="l00928"></a>00928 size_type unsafe_bucket_size(size_type bucket) {
+<a name="l00929"></a>00929 size_type item_count = 0;
+<a name="l00930"></a>00930 <span class="keywordflow">if</span> (is_initialized(bucket)) {
+<a name="l00931"></a>00931 raw_iterator it = get_bucket(bucket);
+<a name="l00932"></a>00932 ++it;
+<a name="l00933"></a>00933 <span class="keywordflow">for</span> (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
+<a name="l00934"></a>00934 ++item_count;
+<a name="l00935"></a>00935 }
+<a name="l00936"></a>00936 <span class="keywordflow">return</span> item_count;
+<a name="l00937"></a>00937 }
+<a name="l00938"></a>00938
+<a name="l00939"></a>00939 size_type unsafe_bucket(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00940"></a>00940 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l00941"></a>00941 size_type bucket = order_key % my_number_of_buckets;
+<a name="l00942"></a>00942 <span class="keywordflow">return</span> bucket;
+<a name="l00943"></a>00943 }
+<a name="l00944"></a>00944
+<a name="l00945"></a>00945 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
+<a name="l00946"></a>00946 local_iterator unsafe_begin(size_type bucket) {
+<a name="l00947"></a>00947 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00948"></a>00948 <span class="keywordflow">return</span> end();
+<a name="l00949"></a>00949
+<a name="l00950"></a>00950 raw_iterator it = get_bucket(bucket);
+<a name="l00951"></a>00951 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00952"></a>00952 }
+<a name="l00953"></a>00953
+<a name="l00954"></a>00954 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
+<a name="l00955"></a>00955 const_local_iterator unsafe_begin(size_type bucket)<span class="keyword"> const</span>
+<a name="l00956"></a>00956 <span class="keyword"> </span>{
+<a name="l00957"></a>00957 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00958"></a>00958 <span class="keywordflow">return</span> end();
+<a name="l00959"></a>00959
+<a name="l00960"></a>00960 raw_const_iterator it = get_bucket(bucket);
+<a name="l00961"></a>00961 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00962"></a>00962 }
+<a name="l00963"></a>00963
+<a name="l00964"></a>00964 <span class="comment">// @REVIEW: Takes O(n)</span>
+<a name="l00965"></a>00965 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
+<a name="l00966"></a>00966 local_iterator unsafe_end(size_type bucket)
+<a name="l00967"></a>00967 {
+<a name="l00968"></a>00968 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00969"></a>00969 <span class="keywordflow">return</span> end();
+<a name="l00970"></a>00970
+<a name="l00971"></a>00971 raw_iterator it = get_bucket(bucket);
+<a name="l00972"></a>00972
+<a name="l00973"></a>00973 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
+<a name="l00974"></a>00974 <span class="keywordflow">do</span> ++it;
+<a name="l00975"></a>00975 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+<a name="l00976"></a>00976
+<a name="l00977"></a>00977 <span class="comment">// Return the first real element past the end of the bucket</span>
+<a name="l00978"></a>00978 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00979"></a>00979 }
+<a name="l00980"></a>00980
+<a name="l00981"></a>00981 <span class="comment">// @REVIEW: Takes O(n)</span>
+<a name="l00982"></a>00982 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
+<a name="l00983"></a>00983 const_local_iterator unsafe_end(size_type bucket)<span class="keyword"> const</span>
+<a name="l00984"></a>00984 <span class="keyword"> </span>{
+<a name="l00985"></a>00985 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00986"></a>00986 <span class="keywordflow">return</span> end();
+<a name="l00987"></a>00987
+<a name="l00988"></a>00988 raw_const_iterator it = get_bucket(bucket);
+<a name="l00989"></a>00989
+<a name="l00990"></a>00990 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
+<a name="l00991"></a>00991 <span class="keywordflow">do</span> ++it;
+<a name="l00992"></a>00992 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+<a name="l00993"></a>00993
+<a name="l00994"></a>00994 <span class="comment">// Return the first real element past the end of the bucket</span>
+<a name="l00995"></a>00995 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00996"></a>00996 }
+<a name="l00997"></a>00997
+<a name="l00998"></a>00998 const_local_iterator unsafe_cbegin(size_type bucket)<span class="keyword"> const </span>{
+<a name="l00999"></a>00999 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->begin();
+<a name="l01000"></a>01000 }
+<a name="l01001"></a>01001
+<a name="l01002"></a>01002 const_local_iterator unsafe_cend(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01003"></a>01003 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->end();
+<a name="l01004"></a>01004 }
+<a name="l01005"></a>01005
+<a name="l01006"></a>01006 <span class="comment">// Hash policy</span>
+<a name="l01007"></a>01007 <span class="keywordtype">float</span> load_factor()<span class="keyword"> const </span>{
+<a name="l01008"></a>01008 <span class="keywordflow">return</span> (<span class="keywordtype">float</span>) size() / (float) unsafe_bucket_count();
+<a name="l01009"></a>01009 }
+<a name="l01010"></a>01010
+<a name="l01011"></a>01011 <span class="keywordtype">float</span> max_load_factor()<span class="keyword"> const </span>{
+<a name="l01012"></a>01012 <span class="keywordflow">return</span> my_maximum_bucket_size;
+<a name="l01013"></a>01013 }
+<a name="l01014"></a>01014
+<a name="l01015"></a>01015 <span class="keywordtype">void</span> max_load_factor(<span class="keywordtype">float</span> newmax) {
+<a name="l01016"></a>01016 <span class="keywordflow">if</span> (newmax != newmax || newmax < 0)
+<a name="l01017"></a>01017 tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
+<a name="l01018"></a>01018 my_maximum_bucket_size = newmax;
+<a name="l01019"></a>01019 }
+<a name="l01020"></a>01020
+<a name="l01021"></a>01021 <span class="comment">// This function is a noop, because the underlying split-ordered list</span>
+<a name="l01022"></a>01022 <span class="comment">// is already sorted, so an increase in the bucket number will be</span>
+<a name="l01023"></a>01023 <span class="comment">// reflected next time this bucket is touched.</span>
+<a name="l01024"></a>01024 <span class="keywordtype">void</span> rehash(size_type buckets) {
+<a name="l01025"></a>01025 size_type current_buckets = my_number_of_buckets;
+<a name="l01026"></a>01026
+<a name="l01027"></a>01027 <span class="keywordflow">if</span> (current_buckets > buckets)
+<a name="l01028"></a>01028 <span class="keywordflow">return</span>;
+<a name="l01029"></a>01029 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (buckets & (buckets-1)) != 0 )
+<a name="l01030"></a>01030 tbb::internal::throw_exception(tbb::internal::eid_invalid_buckets_number);
+<a name="l01031"></a>01031 my_number_of_buckets = buckets;
+<a name="l01032"></a>01032 }
+<a name="l01033"></a>01033
+<a name="l01034"></a>01034 <span class="keyword">private</span>:
+<a name="l01035"></a>01035
+<a name="l01036"></a>01036 <span class="comment">// Initialize the hash and keep the first bucket open</span>
+<a name="l01037"></a>01037 <span class="keywordtype">void</span> internal_init() {
+<a name="l01038"></a>01038 <span class="comment">// Allocate an array of segment pointers</span>
+<a name="l01039"></a>01039 memset(my_buckets, 0, pointers_per_table * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *));
+<a name="l01040"></a>01040
+<a name="l01041"></a>01041 <span class="comment">// Insert the first element in the split-ordered list</span>
+<a name="l01042"></a>01042 raw_iterator dummy_node = my_solist.raw_begin();
+<a name="l01043"></a>01043 set_bucket(0, dummy_node);
+<a name="l01044"></a>01044 }
+<a name="l01045"></a>01045
+<a name="l01046"></a>01046 <span class="keywordtype">void</span> internal_clear() {
+<a name="l01047"></a>01047 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index) {
+<a name="l01048"></a>01048 <span class="keywordflow">if</span> (my_buckets[index] != NULL) {
+<a name="l01049"></a>01049 size_type sz = segment_size(index);
+<a name="l01050"></a>01050 <span class="keywordflow">for</span> (size_type index2 = 0; index2 < sz; ++index2)
+<a name="l01051"></a>01051 my_allocator.destroy(&my_buckets[index][index2]);
+<a name="l01052"></a>01052 my_allocator.deallocate(my_buckets[index], sz);
+<a name="l01053"></a>01053 my_buckets[index] = 0;
+<a name="l01054"></a>01054 }
+<a name="l01055"></a>01055 }
+<a name="l01056"></a>01056 }
+<a name="l01057"></a>01057
+<a name="l01058"></a>01058 <span class="keywordtype">void</span> internal_copy(<span class="keyword">const</span> self_type& right) {
+<a name="l01059"></a>01059 clear();
+<a name="l01060"></a>01060
+<a name="l01061"></a>01061 my_maximum_bucket_size = right.my_maximum_bucket_size;
+<a name="l01062"></a>01062 my_number_of_buckets = right.my_number_of_buckets;
+<a name="l01063"></a>01063
+<a name="l01064"></a>01064 __TBB_TRY {
+<a name="l01065"></a>01065 insert(right.begin(), right.end());
+<a name="l01066"></a>01066 my_hash_compare = right.my_hash_compare;
+<a name="l01067"></a>01067 } __TBB_CATCH(...) {
+<a name="l01068"></a>01068 my_solist.clear();
+<a name="l01069"></a>01069 __TBB_RETHROW();
+<a name="l01070"></a>01070 }
+<a name="l01071"></a>01071 }
+<a name="l01072"></a>01072
+<a name="l01073"></a>01073 <span class="keywordtype">void</span> internal_swap_buckets(concurrent_unordered_base& right)
+<a name="l01074"></a>01074 {
+<a name="l01075"></a>01075 <span class="comment">// Swap all node segments</span>
+<a name="l01076"></a>01076 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index)
+<a name="l01077"></a>01077 {
+<a name="l01078"></a>01078 raw_iterator * iterator_pointer = my_buckets[index];
+<a name="l01079"></a>01079 my_buckets[index] = right.my_buckets[index];
+<a name="l01080"></a>01080 right.my_buckets[index] = iterator_pointer;
+<a name="l01081"></a>01081 }
+<a name="l01082"></a>01082 }
+<a name="l01083"></a>01083
+<a name="l01084"></a>01084 <span class="comment">// Hash APIs</span>
+<a name="l01085"></a>01085 size_type internal_distance(const_iterator first, const_iterator last)<span class="keyword"> const</span>
+<a name="l01086"></a>01086 <span class="keyword"> </span>{
+<a name="l01087"></a>01087 size_type num = 0;
+<a name="l01088"></a>01088
+<a name="l01089"></a>01089 <span class="keywordflow">for</span> (const_iterator it = first; it != last; ++it)
+<a name="l01090"></a>01090 ++num;
+<a name="l01091"></a>01091
+<a name="l01092"></a>01092 <span class="keywordflow">return</span> num;
+<a name="l01093"></a>01093 }
+<a name="l01094"></a>01094
+<a name="l01095"></a>01095 <span class="comment">// Insert an element in the hash given its value</span>
+<a name="l01096"></a>01096 std::pair<iterator, bool> internal_insert(<span class="keyword">const</span> value_type& value)
+<a name="l01097"></a>01097 {
+<a name="l01098"></a>01098 sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
+<a name="l01099"></a>01099 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01100"></a>01100
+<a name="l01101"></a>01101 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01102"></a>01102 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01103"></a>01103 init_bucket(bucket);
+<a name="l01104"></a>01104
+<a name="l01105"></a>01105 size_type new_count;
+<a name="l01106"></a>01106 order_key = split_order_key_regular(order_key);
+<a name="l01107"></a>01107 raw_iterator it = get_bucket(bucket);
+<a name="l01108"></a>01108 raw_iterator last = my_solist.raw_end();
+<a name="l01109"></a>01109 raw_iterator where = it;
+<a name="l01110"></a>01110
+<a name="l01111"></a>01111 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
+<a name="l01112"></a>01112
+<a name="l01113"></a>01113 <span class="comment">// First node is a dummy node</span>
+<a name="l01114"></a>01114 ++where;
+<a name="l01115"></a>01115
+<a name="l01116"></a>01116 <span class="keywordflow">for</span> (;;)
+<a name="l01117"></a>01117 {
+<a name="l01118"></a>01118 <span class="keywordflow">if</span> (where == last || solist_t::get_order_key(where) > order_key)
+<a name="l01119"></a>01119 {
+<a name="l01120"></a>01120 <span class="comment">// Try to insert it in the right place</span>
+<a name="l01121"></a>01121 std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
+<a name="l01122"></a>01122
+<a name="l01123"></a>01123 <span class="keywordflow">if</span> (result.second)
+<a name="l01124"></a>01124 {
+<a name="l01125"></a>01125 <span class="comment">// Insertion succeeded, adjust the table size, if needed</span>
+<a name="l01126"></a>01126 adjust_table_size(new_count, my_number_of_buckets);
+<a name="l01127"></a>01127 <span class="keywordflow">return</span> result;
+<a name="l01128"></a>01128 }
+<a name="l01129"></a>01129 <span class="keywordflow">else</span>
+<a name="l01130"></a>01130 {
+<a name="l01131"></a>01131 <span class="comment">// Insertion failed: either the same node was inserted by another thread, or</span>
+<a name="l01132"></a>01132 <span class="comment">// another element was inserted at exactly the same place as this node.</span>
+<a name="l01133"></a>01133 <span class="comment">// Proceed with the search from the previous location where order key was</span>
+<a name="l01134"></a>01134 <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
+<a name="l01135"></a>01135 <span class="comment">// concurrent erase operation supported).</span>
+<a name="l01136"></a>01136 where = it;
+<a name="l01137"></a>01137 ++where;
+<a name="l01138"></a>01138 <span class="keywordflow">continue</span>;
+<a name="l01139"></a>01139 }
+<a name="l01140"></a>01140 }
+<a name="l01141"></a>01141 <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="l01142"></a>01142 {
+<a name="l01143"></a>01143 <span class="comment">// Element already in the list, return it</span>
+<a name="l01144"></a>01144 <span class="keywordflow">return</span> std::pair<iterator, bool>(my_solist.get_iterator(where), <span class="keyword">false</span>);
+<a name="l01145"></a>01145 }
+<a name="l01146"></a>01146
+<a name="l01147"></a>01147 <span class="comment">// Move the iterator forward</span>
+<a name="l01148"></a>01148 it = where;
+<a name="l01149"></a>01149 ++where;
+<a name="l01150"></a>01150 }
+<a name="l01151"></a>01151 }
+<a name="l01152"></a>01152
+<a name="l01153"></a>01153 <span class="comment">// Find the element in the split-ordered list</span>
+<a name="l01154"></a>01154 iterator internal_find(<span class="keyword">const</span> key_type& key)
+<a name="l01155"></a>01155 {
+<a name="l01156"></a>01156 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01157"></a>01157 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01158"></a>01158
+<a name="l01159"></a>01159 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01160"></a>01160 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01161"></a>01161 init_bucket(bucket);
+<a name="l01162"></a>01162
+<a name="l01163"></a>01163 order_key = split_order_key_regular(order_key);
+<a name="l01164"></a>01164 raw_iterator last = my_solist.raw_end();
+<a name="l01165"></a>01165
+<a name="l01166"></a>01166 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != last; ++it)
+<a name="l01167"></a>01167 {
+<a name="l01168"></a>01168 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
+<a name="l01169"></a>01169 {
+<a name="l01170"></a>01170 <span class="comment">// If the order key is smaller than the current order key, the element</span>
+<a name="l01171"></a>01171 <span class="comment">// is not in the hash.</span>
+<a name="l01172"></a>01172 <span class="keywordflow">return</span> end();
+<a name="l01173"></a>01173 }
+<a name="l01174"></a>01174 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key)
+<a name="l01175"></a>01175 {
+<a name="l01176"></a>01176 <span class="comment">// The fact that order keys match does not mean that the element is found.</span>
+<a name="l01177"></a>01177 <span class="comment">// Key function comparison has to be performed to check whether this is the</span>
+<a name="l01178"></a>01178 <span class="comment">// right element. If not, keep searching while order key is the same.</span>
+<a name="l01179"></a>01179 <span class="keywordflow">if</span> (!my_hash_compare(get_key(*it), key))
+<a name="l01180"></a>01180 <span class="keywordflow">return</span> my_solist.get_iterator(it);
+<a name="l01181"></a>01181 }
+<a name="l01182"></a>01182 }
+<a name="l01183"></a>01183
+<a name="l01184"></a>01184 <span class="keywordflow">return</span> end();
+<a name="l01185"></a>01185 }
+<a name="l01186"></a>01186
+<a name="l01187"></a>01187 <span class="comment">// Erase an element from the list. This is not a concurrency safe function.</span>
+<a name="l01188"></a>01188 iterator internal_erase(const_iterator it)
+<a name="l01189"></a>01189 {
+<a name="l01190"></a>01190 key_type key = get_key(*it);
+<a name="l01191"></a>01191 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01192"></a>01192 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01193"></a>01193
+<a name="l01194"></a>01194 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01195"></a>01195 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01196"></a>01196 init_bucket(bucket);
+<a name="l01197"></a>01197
+<a name="l01198"></a>01198 order_key = split_order_key_regular(order_key);
+<a name="l01199"></a>01199
+<a name="l01200"></a>01200 raw_iterator previous = get_bucket(bucket);
+<a name="l01201"></a>01201 raw_iterator last = my_solist.raw_end();
+<a name="l01202"></a>01202 raw_iterator where = previous;
+<a name="l01203"></a>01203
+<a name="l01204"></a>01204 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
+<a name="l01205"></a>01205
+<a name="l01206"></a>01206 <span class="comment">// First node is a dummy node</span>
+<a name="l01207"></a>01207 ++where;
+<a name="l01208"></a>01208
+<a name="l01209"></a>01209 <span class="keywordflow">for</span> (;;) {
+<a name="l01210"></a>01210 <span class="keywordflow">if</span> (where == last)
+<a name="l01211"></a>01211 <span class="keywordflow">return</span> end();
+<a name="l01212"></a>01212 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (my_solist.get_iterator(where) == it)
+<a name="l01213"></a>01213 <span class="keywordflow">return</span> my_solist.erase_node(previous, it);
+<a name="l01214"></a>01214
+<a name="l01215"></a>01215 <span class="comment">// Move the iterator forward</span>
+<a name="l01216"></a>01216 previous = where;
+<a name="l01217"></a>01217 ++where;
+<a name="l01218"></a>01218 }
+<a name="l01219"></a>01219 }
+<a name="l01220"></a>01220
+<a name="l01221"></a>01221 <span class="comment">// Return the [begin, end) pair of iterators with the same key values.</span>
+<a name="l01222"></a>01222 <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
+<a name="l01223"></a>01223 pairii_t internal_equal_range(<span class="keyword">const</span> key_type& key)
+<a name="l01224"></a>01224 {
+<a name="l01225"></a>01225 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01226"></a>01226 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01227"></a>01227
+<a name="l01228"></a>01228 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01229"></a>01229 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01230"></a>01230 init_bucket(bucket);
+<a name="l01231"></a>01231
+<a name="l01232"></a>01232 order_key = split_order_key_regular(order_key);
+<a name="l01233"></a>01233 raw_iterator end_it = my_solist.raw_end();
+<a name="l01234"></a>01234
+<a name="l01235"></a>01235 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
+<a name="l01236"></a>01236 {
+<a name="l01237"></a>01237 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
+<a name="l01238"></a>01238 {
+<a name="l01239"></a>01239 <span class="comment">// There is no element with the given key</span>
+<a name="l01240"></a>01240 <span class="keywordflow">return</span> pairii_t(end(), end());
+<a name="l01241"></a>01241 }
+<a name="l01242"></a>01242 <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="l01243"></a>01243 {
+<a name="l01244"></a>01244 iterator first = my_solist.get_iterator(it);
+<a name="l01245"></a>01245 iterator last = first;
+<a name="l01246"></a>01246
+<a name="l01247"></a>01247 <span class="keywordflow">while</span>( last != end() && !my_hash_compare(get_key(*last), key) )
+<a name="l01248"></a>01248 ++last;
+<a name="l01249"></a>01249 <span class="keywordflow">return</span> pairii_t(first, last);
+<a name="l01250"></a>01250 }
+<a name="l01251"></a>01251 }
+<a name="l01252"></a>01252
+<a name="l01253"></a>01253 <span class="keywordflow">return</span> pairii_t(end(), end());
+<a name="l01254"></a>01254 }
+<a name="l01255"></a>01255
+<a name="l01256"></a>01256 <span class="comment">// Return the [begin, end) pair of const iterators with the same key values.</span>
+<a name="l01257"></a>01257 <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
+<a name="l01258"></a>01258 paircc_t internal_equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
+<a name="l01259"></a>01259 <span class="keyword"> </span>{
+<a name="l01260"></a>01260 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01261"></a>01261 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01262"></a>01262
+<a name="l01263"></a>01263 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01264"></a>01264 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01265"></a>01265 <span class="keywordflow">return</span> paircc_t(end(), end());
+<a name="l01266"></a>01266
+<a name="l01267"></a>01267 order_key = split_order_key_regular(order_key);
+<a name="l01268"></a>01268 raw_const_iterator end_it = my_solist.raw_end();
+<a name="l01269"></a>01269
+<a name="l01270"></a>01270 <span class="keywordflow">for</span> (raw_const_iterator it = get_bucket(bucket); it != end_it; ++it)
+<a name="l01271"></a>01271 {
+<a name="l01272"></a>01272 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
+<a name="l01273"></a>01273 {
+<a name="l01274"></a>01274 <span class="comment">// There is no element with the given key</span>
+<a name="l01275"></a>01275 <span class="keywordflow">return</span> paircc_t(end(), end());
+<a name="l01276"></a>01276 }
+<a name="l01277"></a>01277 <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="l01278"></a>01278 {
+<a name="l01279"></a>01279 const_iterator first = my_solist.get_iterator(it);
+<a name="l01280"></a>01280 const_iterator last = first;
+<a name="l01281"></a>01281
+<a name="l01282"></a>01282 <span class="keywordflow">while</span>( last != end() && !my_hash_compare(get_key(*last), key ) )
+<a name="l01283"></a>01283 ++last;
+<a name="l01284"></a>01284 <span class="keywordflow">return</span> paircc_t(first, last);
+<a name="l01285"></a>01285 }
+<a name="l01286"></a>01286 }
+<a name="l01287"></a>01287
+<a name="l01288"></a>01288 <span class="keywordflow">return</span> paircc_t(end(), end());
+<a name="l01289"></a>01289 }
+<a name="l01290"></a>01290
+<a name="l01291"></a>01291 <span class="comment">// Bucket APIs</span>
+<a name="l01292"></a>01292 <span class="keywordtype">void</span> init_bucket(size_type bucket)
+<a name="l01293"></a>01293 {
+<a name="l01294"></a>01294 <span class="comment">// Bucket 0 has no parent. Initialize it and return.</span>
+<a name="l01295"></a>01295 <span class="keywordflow">if</span> (bucket == 0) {
+<a name="l01296"></a>01296 internal_init();
+<a name="l01297"></a>01297 <span class="keywordflow">return</span>;
+<a name="l01298"></a>01298 }
+<a name="l01299"></a>01299
+<a name="l01300"></a>01300 size_type parent_bucket = get_parent(bucket);
+<a name="l01301"></a>01301
+<a name="l01302"></a>01302 <span class="comment">// All parent_bucket buckets have to be initialized before this bucket is</span>
+<a name="l01303"></a>01303 <span class="keywordflow">if</span> (!is_initialized(parent_bucket))
+<a name="l01304"></a>01304 init_bucket(parent_bucket);
+<a name="l01305"></a>01305
+<a name="l01306"></a>01306 raw_iterator parent = get_bucket(parent_bucket);
+<a name="l01307"></a>01307
+<a name="l01308"></a>01308 <span class="comment">// Create a dummy first node in this bucket</span>
+<a name="l01309"></a>01309 raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
+<a name="l01310"></a>01310 set_bucket(bucket, dummy_node);
+<a name="l01311"></a>01311 }
+<a name="l01312"></a>01312
+<a name="l01313"></a>01313 <span class="keywordtype">void</span> adjust_table_size(size_type total_elements, size_type current_size)
+<a name="l01314"></a>01314 {
+<a name="l01315"></a>01315 <span class="comment">// Grow the table by a factor of 2 if possible and needed</span>
+<a name="l01316"></a>01316 <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="l01317"></a>01317 {
+<a name="l01318"></a>01318 <span class="comment">// Double the size of the hash only if size has not changed inbetween loads</span>
+<a name="l01319"></a>01319 __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, 2 * current_size, current_size );
+<a name="l01320"></a>01320 }
+<a name="l01321"></a>01321 }
+<a name="l01322"></a>01322
+<a name="l01323"></a>01323 size_type get_parent(size_type bucket)<span class="keyword"> const</span>
+<a name="l01324"></a>01324 <span class="keyword"> </span>{
+<a name="l01325"></a>01325 <span class="comment">// Unsets bucket's most significant turned-on bit</span>
+<a name="l01326"></a>01326 size_type msb = __TBB_Log2((uintptr_t)bucket);
+<a name="l01327"></a>01327 <span class="keywordflow">return</span> bucket & ~(size_type(1) << msb);
+<a name="l01328"></a>01328 }
+<a name="l01329"></a>01329
+<a name="l01330"></a>01330
+<a name="l01331"></a>01331 <span class="comment">// Dynamic sized array (segments)</span>
+<a name="l01333"></a>01333 <span class="comment"></span> <span class="keyword">static</span> size_type segment_index_of( size_type index ) {
+<a name="l01334"></a>01334 <span class="keywordflow">return</span> size_type( __TBB_Log2( index|1 ) );
+<a name="l01335"></a>01335 }
+<a name="l01336"></a>01336
+<a name="l01338"></a>01338 <span class="keyword">static</span> size_type segment_base( size_type k ) {
+<a name="l01339"></a>01339 <span class="keywordflow">return</span> (size_type(1)<<k & ~size_type(1));
+<a name="l01340"></a>01340 }
+<a name="l01341"></a>01341
+<a name="l01343"></a>01343 <span class="keyword">static</span> size_type segment_size( size_type k ) {
+<a name="l01344"></a>01344 <span class="keywordflow">return</span> k? size_type(1)<<k : 2;
+<a name="l01345"></a>01345 }
+<a name="l01346"></a>01346
+<a name="l01347"></a>01347 raw_iterator get_bucket(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01348"></a>01348 size_type segment = segment_index_of(bucket);
+<a name="l01349"></a>01349 bucket -= segment_base(segment);
+<a name="l01350"></a>01350 __TBB_ASSERT( my_buckets[segment], <span class="stringliteral">"bucket must be in an allocated segment"</span> );
+<a name="l01351"></a>01351 <span class="keywordflow">return</span> my_buckets[segment][bucket];
+<a name="l01352"></a>01352 }
+<a name="l01353"></a>01353
+<a name="l01354"></a>01354 <span class="keywordtype">void</span> set_bucket(size_type bucket, raw_iterator dummy_head) {
+<a name="l01355"></a>01355 size_type segment = segment_index_of(bucket);
+<a name="l01356"></a>01356 bucket -= segment_base(segment);
+<a name="l01357"></a>01357
+<a name="l01358"></a>01358 <span class="keywordflow">if</span> (my_buckets[segment] == NULL) {
+<a name="l01359"></a>01359 size_type sz = segment_size(segment);
+<a name="l01360"></a>01360 raw_iterator * new_segment = my_allocator.allocate(sz);
+<a name="l01361"></a>01361 std::memset(new_segment, 0, sz*<span class="keyword">sizeof</span>(raw_iterator));
+<a name="l01362"></a>01362
+<a name="l01363"></a>01363 <span class="keywordflow">if</span> (__TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
+<a name="l01364"></a>01364 my_allocator.deallocate(new_segment, sz);
+<a name="l01365"></a>01365 }
+<a name="l01366"></a>01366
+<a name="l01367"></a>01367 my_buckets[segment][bucket] = dummy_head;
+<a name="l01368"></a>01368 }
+<a name="l01369"></a>01369
+<a name="l01370"></a>01370 <span class="keywordtype">bool</span> is_initialized(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01371"></a>01371 size_type segment = segment_index_of(bucket);
+<a name="l01372"></a>01372 bucket -= segment_base(segment);
+<a name="l01373"></a>01373
+<a name="l01374"></a>01374 <span class="keywordflow">if</span> (my_buckets[segment] == NULL)
+<a name="l01375"></a>01375 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01376"></a>01376
+<a name="l01377"></a>01377 raw_iterator it = my_buckets[segment][bucket];
+<a name="l01378"></a>01378 <span class="keywordflow">return</span> (it.get_node_ptr() != NULL);
+<a name="l01379"></a>01379 }
+<a name="l01380"></a>01380
+<a name="l01381"></a>01381 <span class="comment">// Utilities for keys</span>
+<a name="l01382"></a>01382
+<a name="l01383"></a>01383 <span class="comment">// A regular order key has its original hash value reversed and the last bit set</span>
+<a name="l01384"></a>01384 sokey_t split_order_key_regular(sokey_t order_key)<span class="keyword"> const </span>{
+<a name="l01385"></a>01385 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) | 0x1;
+<a name="l01386"></a>01386 }
+<a name="l01387"></a>01387
+<a name="l01388"></a>01388 <span class="comment">// A dummy order key has its original hash value reversed and the last bit unset</span>
+<a name="l01389"></a>01389 sokey_t split_order_key_dummy(sokey_t order_key)<span class="keyword"> const </span>{
+<a name="l01390"></a>01390 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) & ~(0x1);
+<a name="l01391"></a>01391 }
+<a name="l01392"></a>01392
+<a name="l01393"></a>01393 <span class="comment">// Shared variables</span>
+<a name="l01394"></a>01394 size_type my_number_of_buckets; <span class="comment">// Current table size</span>
+<a name="l01395"></a>01395 solist_t my_solist; <span class="comment">// List where all the elements are kept</span>
+<a name="l01396"></a>01396 <span class="keyword">typename</span> allocator_type::template rebind<raw_iterator>::other my_allocator; <span class="comment">// Allocator object for segments</span>
+<a name="l01397"></a>01397 <span class="keywordtype">float</span> my_maximum_bucket_size; <span class="comment">// Maximum size of the bucket</span>
+<a name="l01398"></a>01398 raw_iterator *my_buckets[pointers_per_table]; <span class="comment">// The segment table</span>
+<a name="l01399"></a>01399 };
+<a name="l01400"></a>01400 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l01401"></a>01401 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it</span>
+<a name="l01402"></a>01402 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l01403"></a>01403 <span class="preprocessor"></span>
+<a name="l01405"></a>01405 <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="l01406"></a>01406 } <span class="comment">// namespace internal</span>
+<a name="l01409"></a>01409 <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l01410"></a>01410 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> T& t ) {
+<a name="l01411"></a>01411 <span class="keywordflow">return</span> static_cast<size_t>( t ) * internal::hash_multiplier;
+<a name="l01412"></a>01412 }
+<a name="l01413"></a>01413 <span class="keyword">template</span><<span class="keyword">typename</span> P>
+<a name="l01414"></a>01414 <span class="keyword">inline</span> size_t tbb_hasher( P* ptr ) {
+<a name="l01415"></a>01415 size_t <span class="keyword">const</span> h = reinterpret_cast<size_t>( ptr );
+<a name="l01416"></a>01416 <span class="keywordflow">return</span> (h >> 3) ^ h;
+<a name="l01417"></a>01417 }
+<a name="l01418"></a>01418 <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="l01419"></a>01419 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::basic_string<E,S,A>& s ) {
+<a name="l01420"></a>01420 size_t h = 0;
+<a name="l01421"></a>01421 <span class="keywordflow">for</span>( <span class="keyword">const</span> E* c = s.c_str(); *c; ++c )
+<a name="l01422"></a>01422 h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
+<a name="l01423"></a>01423 <span class="keywordflow">return</span> h;
+<a name="l01424"></a>01424 }
+<a name="l01425"></a>01425 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> S>
+<a name="l01426"></a>01426 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::pair<F,S>& p ) {
+<a name="l01427"></a>01427 <span class="keywordflow">return</span> tbb_hasher(p.first) ^ tbb_hasher(p.second);
+<a name="l01428"></a>01428 }
+<a name="l01429"></a>01429 } <span class="comment">// namespace interface5</span>
+<a name="l01430"></a>01430 <span class="keyword">using</span> interface5::tbb_hasher;
+<a name="l01431"></a>01431 } <span class="comment">// namespace tbb</span>
+<a name="l01432"></a>01432 <span class="preprocessor">#endif// __TBB_concurrent_unordered_internal_H</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00305.html b/doc/html/a00305.html
deleted file mode 100644
index 75042b8..0000000
--- a/doc/html/a00305.html
+++ /dev/null
@@ -1,872 +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-2010 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 "concurrent_hash_map.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#include <string.h></span> <span class="comment">// for memcpy</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#else</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="keyword">namespace </span>tbb {
-<a name="l00039"></a>00039
-<a name="l00041"></a><a class="code" href="a00237.html#a8622ae61b7e7737dac26542e181178e">00041</a> <span class="keyword">enum</span> <a class="code" href="a00237.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
-<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 <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
-<a name="l00048"></a>00048 <span class="keyword">class </span>enumerable_thread_specific_iterator
-<a name="l00049"></a>00049 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00050"></a>00050 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
-<a name="l00051"></a>00051 : public std::iterator<std::random_access_iterator_tag,Value>
-<a name="l00052"></a>00052 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
-<a name="l00053"></a>00053 {
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 Container *my_container;
-<a name="l00057"></a>00057 <span class="keyword">typename</span> Container::size_type my_index;
-<a name="l00058"></a>00058 <span class="keyword">mutable</span> Value *my_value;
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00061"></a>00061 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
-<a name="l00062"></a>00062 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <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="l00065"></a>00065 <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="l00066"></a>00066 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 <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="l00069"></a>00069 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
-<a name="l00070"></a>00070 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 <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="l00073"></a>00073 <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="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00076"></a>00076 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
-<a name="l00081"></a>00081 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
-<a name="l00082"></a>00082
-<a name="l00084"></a>00084 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
-<a name="l00085"></a>00085
-<a name="l00086"></a>00086 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00087"></a>00087 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
-<a name="l00088"></a>00088 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
-<a name="l00089"></a>00089
-<a name="l00090"></a>00090 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00091"></a>00091 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093
-<a name="l00094"></a>00094 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00095"></a>00095 my_index += offset;
-<a name="l00096"></a>00096 my_value = NULL;
-<a name="l00097"></a>00097 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00098"></a>00098 }
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00101"></a>00101 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103
-<a name="l00104"></a>00104 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00105"></a>00105 my_index -= offset;
-<a name="l00106"></a>00106 my_value = NULL;
-<a name="l00107"></a>00107 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00108"></a>00108 }
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00111"></a>00111 Value* value = my_value;
-<a name="l00112"></a>00112 <span class="keywordflow">if</span>( !value ) {
-<a name="l00113"></a>00113 value = my_value = &(*my_container)[my_index].value;
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 __TBB_ASSERT( value==&(*my_container)[my_index].value, <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00116"></a>00116 <span class="keywordflow">return</span> *value;
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00120"></a>00120 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
-<a name="l00121"></a>00121 }
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 enumerable_thread_specific_iterator& operator++() {
-<a name="l00126"></a>00126 ++my_index;
-<a name="l00127"></a>00127 my_value = NULL;
-<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 enumerable_thread_specific_iterator& operator--() {
-<a name="l00132"></a>00132 --my_index;
-<a name="l00133"></a>00133 my_value = NULL;
-<a name="l00134"></a>00134 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00135"></a>00135 }
-<a name="l00136"></a>00136
-<a name="l00138"></a>00138 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00139"></a>00139 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00140"></a>00140 ++my_index;
-<a name="l00141"></a>00141 my_value = NULL;
-<a name="l00142"></a>00142 <span class="keywordflow">return</span> result;
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144
-<a name="l00146"></a>00146 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00147"></a>00147 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00148"></a>00148 --my_index;
-<a name="l00149"></a>00149 my_value = NULL;
-<a name="l00150"></a>00150 <span class="keywordflow">return</span> result;
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="comment">// STL support</span>
-<a name="l00154"></a>00154 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00155"></a>00155 <span class="keyword">typedef</span> Value value_type;
-<a name="l00156"></a>00156 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00157"></a>00157 <span class="keyword">typedef</span> Value& reference;
-<a name="l00158"></a>00158 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<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> Container, <span class="keyword">typename</span> T>
-<a name="l00162"></a>00162 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
-<a name="l00163"></a>00163 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
-<a name="l00164"></a>00164 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
-<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> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00168"></a>00168 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00169"></a>00169 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00170"></a>00170 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
-<a name="l00171"></a>00171 }
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <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="l00174"></a>00174 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00175"></a>00175 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00176"></a>00176 <span class="keywordflow">return</span> !(i==j);
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <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="l00180"></a>00180 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00181"></a>00181 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00182"></a>00182 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 <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="l00186"></a>00186 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00187"></a>00187 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00188"></a>00188 <span class="keywordflow">return</span> j<i;
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <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="l00192"></a>00192 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00193"></a>00193 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00194"></a>00194 <span class="keywordflow">return</span> !(i<j);
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 <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="l00198"></a>00198 <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00199"></a>00199 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00200"></a>00200 <span class="keywordflow">return</span> !(j<i);
-<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> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00204"></a>00204 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00205"></a>00205 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00206"></a>00206 <span class="keywordflow">return</span> i.my_index-j.my_index;
-<a name="l00207"></a>00207 }
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
-<a name="l00210"></a>00210 <span class="keyword">class </span>segmented_iterator
-<a name="l00211"></a>00211 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00212"></a>00212 : public std::iterator<std::input_iterator_tag, Value>
-<a name="l00213"></a>00213 #endif
-<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> T, <span class="keyword">typename</span> U>
-<a name="l00216"></a>00216 <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="l00217"></a>00217
-<a name="l00218"></a>00218 <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="l00219"></a>00219 <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="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00222"></a>00222 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="keyword">public</span>:
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 segmented_iterator() {my_segcont = NULL;}
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
-<a name="l00229"></a>00229 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
-<a name="l00230"></a>00230 outer_iter(my_segcont->end()) { }
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 ~segmented_iterator() {}
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
-<a name="l00235"></a>00235 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
-<a name="l00236"></a>00236 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 <span class="comment">// STL support</span>
-<a name="l00239"></a>00239 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00240"></a>00240 <span class="keyword">typedef</span> Value value_type;
-<a name="l00241"></a>00241 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
-<a name="l00242"></a>00242 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00243"></a>00243 <span class="keyword">typedef</span> Value& reference;
-<a name="l00244"></a>00244 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
-<a name="l00245"></a>00245
-<a name="l00246"></a>00246 <span class="comment">// Copy Constructor</span>
-<a name="l00247"></a>00247 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00248"></a>00248 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
-<a name="l00249"></a>00249 my_segcont(other.my_segcont),
-<a name="l00250"></a>00250 outer_iter(other.outer_iter),
-<a name="l00251"></a>00251 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
-<a name="l00252"></a>00252 inner_iter(other.inner_iter)
-<a name="l00253"></a>00253 {}
-<a name="l00254"></a>00254
-<a name="l00255"></a>00255 <span class="comment">// assignment</span>
-<a name="l00256"></a>00256 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00257"></a>00257 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
-<a name="l00258"></a>00258 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
-<a name="l00259"></a>00259 my_segcont = other.my_segcont;
-<a name="l00260"></a>00260 outer_iter = other.outer_iter;
-<a name="l00261"></a>00261 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00264"></a>00264 }
-<a name="l00265"></a>00265
-<a name="l00266"></a>00266 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
-<a name="l00267"></a>00267 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
-<a name="l00268"></a>00268 <span class="comment">// the end of the outer container is reached.</span>
-<a name="l00269"></a>00269 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
-<a name="l00270"></a>00270 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00271"></a>00271 <span class="comment">// check that this iterator points to something inside the segmented container</span>
-<a name="l00272"></a>00272 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
-<a name="l00273"></a>00273 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
-<a name="l00274"></a>00274 inner_iter = outer_iter->begin();
-<a name="l00275"></a>00275 <span class="keywordflow">break</span>;
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="comment">// pre-increment</span>
-<a name="l00282"></a>00282 segmented_iterator& operator++() {
-<a name="l00283"></a>00283 advance_me();
-<a name="l00284"></a>00284 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00285"></a>00285 }
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <span class="comment">// post-increment</span>
-<a name="l00288"></a>00288 segmented_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00289"></a>00289 segmented_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00290"></a>00290 operator++();
-<a name="l00291"></a>00291 <span class="keywordflow">return</span> tmp;
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293
-<a name="l00294"></a>00294 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00295"></a>00295 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00296"></a>00296 <span class="keywordflow">return</span> (outer_iter == other_outer &&
-<a name="l00297"></a>00297 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299
-<a name="l00300"></a>00300 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00301"></a>00301 <span class="keywordflow">return</span> !operator==(other_outer);
-<a name="l00302"></a>00302
-<a name="l00303"></a>00303 }
-<a name="l00304"></a>00304
-<a name="l00305"></a>00305 <span class="comment">// (i)* RHS</span>
-<a name="l00306"></a>00306 reference operator*()<span class="keyword"> const </span>{
-<a name="l00307"></a>00307 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00308"></a>00308 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
-<a name="l00309"></a>00309 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
-<a name="l00310"></a>00310 <span class="keywordflow">return</span> *inner_iter;
-<a name="l00311"></a>00311 }
-<a name="l00312"></a>00312
-<a name="l00313"></a>00313 <span class="comment">// i-></span>
-<a name="l00314"></a>00314 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 <span class="keyword">private</span>:
-<a name="l00317"></a>00317 SegmentedContainer* my_segcont;
-<a name="l00318"></a>00318 outer_iterator outer_iter;
-<a name="l00319"></a>00319 inner_iterator inner_iter;
-<a name="l00320"></a>00320
-<a name="l00321"></a>00321 <span class="keywordtype">void</span> advance_me() {
-<a name="l00322"></a>00322 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00323"></a>00323 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
-<a name="l00324"></a>00324 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
-<a name="l00325"></a>00325 ++inner_iter;
-<a name="l00326"></a>00326 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
-<a name="l00327"></a>00327 inner_iter = outer_iter->begin();
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329 }
-<a name="l00330"></a>00330 }; <span class="comment">// segmented_iterator</span>
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <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="l00333"></a>00333 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00334"></a>00334 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00335"></a>00335 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00336"></a>00336 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00337"></a>00337 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00338"></a>00338 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00339"></a>00339 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
-<a name="l00340"></a>00340 }
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 <span class="comment">// !=</span>
-<a name="l00343"></a>00343 <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="l00344"></a>00344 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00345"></a>00345 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00346"></a>00346 <span class="keywordflow">return</span> !(i==j);
-<a name="l00347"></a>00347 }
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 <span class="comment">// empty template for following specializations</span>
-<a name="l00350"></a>00350 <span class="keyword">template</span><ets_key_usage_type et>
-<a name="l00351"></a>00351 <span class="keyword">struct </span>tls_manager {};
-<a name="l00352"></a>00352
-<a name="l00354"></a>00354 <span class="keyword">template</span> <>
-<a name="l00355"></a>00355 <span class="keyword">struct </span>tls_manager<ets_no_key> {
-<a name="l00356"></a>00356 <span class="keyword">typedef</span> size_t tls_key_t;
-<a name="l00357"></a>00357 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> create_key( tls_key_t &) { }
-<a name="l00358"></a>00358 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy_key( tls_key_t & ) { }
-<a name="l00359"></a>00359 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_tls( tls_key_t &, <span class="keywordtype">void</span> * ) { }
-<a name="l00360"></a>00360 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> * get_tls( tls_key_t & ) { <span class="keywordflow">return</span> (size_t)0; }
-<a name="l00361"></a>00361 };
-<a name="l00362"></a>00362
-<a name="l00364"></a>00364 <span class="keyword">template</span> <>
-<a name="l00365"></a>00365 <span class="keyword">struct </span>tls_manager <ets_key_per_instance> {
-<a name="l00366"></a>00366 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00367"></a>00367 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
-<a name="l00368"></a>00368 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> create_key( tls_key_t &k) { k = TlsAlloc(); }
-<a name="l00369"></a>00369 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy_key( tls_key_t &k) { TlsFree(k); }
-<a name="l00370"></a>00370 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_tls( tls_key_t &k, <span class="keywordtype">void</span> * value) { TlsSetValue(k, (LPVOID)value); }
-<a name="l00371"></a>00371 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> * get_tls( tls_key_t &k ) { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(k); }
-<a name="l00372"></a>00372 <span class="preprocessor">#else</span>
-<a name="l00373"></a>00373 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
-<a name="l00374"></a>00374 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> create_key( tls_key_t &k) { pthread_key_create(&k, NULL); }
-<a name="l00375"></a>00375 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy_key( tls_key_t &k) { pthread_key_delete(k); }
-<a name="l00376"></a>00376 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_tls( tls_key_t &k, <span class="keywordtype">void</span> * value) { pthread_setspecific(k, value); }
-<a name="l00377"></a>00377 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> * get_tls( tls_key_t &k ) { <span class="keywordflow">return</span> pthread_getspecific(k); }
-<a name="l00378"></a>00378 <span class="preprocessor">#endif</span>
-<a name="l00379"></a>00379 <span class="preprocessor"></span> };
-<a name="l00380"></a>00380
-<a name="l00381"></a>00381 <span class="keyword">class </span>thread_hash_compare {
-<a name="l00382"></a>00382 <span class="keyword">public</span>:
-<a name="l00383"></a>00383 <span class="comment">// using hack suggested by Arch to get value for thread id for hashing...</span>
-<a name="l00384"></a>00384 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00385"></a>00385 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD thread_key;
-<a name="l00386"></a>00386 <span class="preprocessor">#else</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t thread_key;
-<a name="l00388"></a>00388 <span class="preprocessor">#endif</span>
-<a name="l00389"></a>00389 <span class="preprocessor"></span> <span class="keyword">static</span> thread_key my_thread_key(<span class="keyword">const</span> tbb_thread::id j) {
-<a name="l00390"></a>00390 thread_key key_val;
-<a name="l00391"></a>00391 memcpy(&key_val, &j, <span class="keyword">sizeof</span>(thread_key));
-<a name="l00392"></a>00392 <span class="keywordflow">return</span> key_val;
-<a name="l00393"></a>00393 }
-<a name="l00394"></a>00394
-<a name="l00395"></a>00395 <span class="keywordtype">bool</span> equal( <span class="keyword">const</span> thread_key j, <span class="keyword">const</span> thread_key k)<span class="keyword"> const </span>{
-<a name="l00396"></a>00396 <span class="keywordflow">return</span> j == k;
-<a name="l00397"></a>00397 }
-<a name="l00398"></a>00398 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> hash(<span class="keyword">const</span> thread_key k)<span class="keyword"> const </span>{
-<a name="l00399"></a>00399 <span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)k;
-<a name="l00400"></a>00400 }
-<a name="l00401"></a>00401 };
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403 <span class="comment">// storage for initialization function pointer</span>
-<a name="l00404"></a>00404 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00405"></a>00405 <span class="keyword">struct </span>callback_base {
-<a name="l00406"></a>00406 <span class="keyword">virtual</span> T apply( ) = 0;
-<a name="l00407"></a>00407 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy( ) = 0;
-<a name="l00408"></a>00408 <span class="comment">// need to be able to create copies of callback_base for copy constructor</span>
-<a name="l00409"></a>00409 <span class="keyword">virtual</span> callback_base* make_copy() = 0;
-<a name="l00410"></a>00410 <span class="comment">// need virtual destructor to satisfy GCC compiler warning</span>
-<a name="l00411"></a>00411 <span class="keyword">virtual</span> ~callback_base() { }
-<a name="l00412"></a>00412 };
-<a name="l00413"></a>00413
-<a name="l00414"></a>00414 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Functor>
-<a name="l00415"></a>00415 <span class="keyword">struct </span>callback_leaf : <span class="keyword">public</span> callback_base<T> {
-<a name="l00416"></a>00416 <span class="keyword">typedef</span> Functor my_callback_type;
-<a name="l00417"></a>00417 <span class="keyword">typedef</span> callback_leaf<T,Functor> my_type;
-<a name="l00418"></a>00418 <span class="keyword">typedef</span> my_type* callback_pointer;
-<a name="l00419"></a>00419 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00178.html">tbb::tbb_allocator<my_type></a> my_allocator_type;
-<a name="l00420"></a>00420 Functor f;
-<a name="l00421"></a>00421 callback_leaf( <span class="keyword">const</span> Functor& f_) : f(f_) {
-<a name="l00422"></a>00422 }
-<a name="l00423"></a>00423
-<a name="l00424"></a>00424 <span class="keyword">static</span> callback_pointer new_callback(<span class="keyword">const</span> Functor& f_ ) {
-<a name="l00425"></a>00425 <span class="keywordtype">void</span>* new_void = my_allocator_type().allocate(1);
-<a name="l00426"></a>00426 callback_pointer new_cb = <span class="keyword">new</span> (new_void) callback_leaf<T,Functor>(f_); <span class="comment">// placement new</span>
-<a name="l00427"></a>00427 <span class="keywordflow">return</span> new_cb;
-<a name="l00428"></a>00428 }
-<a name="l00429"></a>00429
-<a name="l00430"></a>00430 <span class="comment">/* override */</span> callback_pointer make_copy() {
-<a name="l00431"></a>00431 <span class="keywordflow">return</span> new_callback( f );
-<a name="l00432"></a>00432 }
-<a name="l00433"></a>00433
-<a name="l00434"></a>00434 <span class="comment">/* override */</span> <span class="keywordtype">void</span> destroy( ) {
-<a name="l00435"></a>00435 callback_pointer my_ptr = <span class="keyword">this</span>;
-<a name="l00436"></a>00436 my_allocator_type().destroy(my_ptr);
-<a name="l00437"></a>00437 my_allocator_type().deallocate(my_ptr,1);
-<a name="l00438"></a>00438 }
-<a name="l00439"></a>00439 <span class="comment">/* override */</span> T apply() { <span class="keywordflow">return</span> f(); } <span class="comment">// does copy construction of returned value.</span>
-<a name="l00440"></a>00440 };
-<a name="l00441"></a>00441
-<a name="l00442"></a>00442 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HC, <span class="keyword">typename</span> A>
-<a name="l00443"></a>00443 <span class="keyword">class </span>ets_concurrent_hash_map : <span class="keyword">public</span> tbb::concurrent_hash_map<Key, T, HC, A> {
-<a name="l00444"></a>00444 <span class="keyword">public</span>:
-<a name="l00445"></a>00445 <span class="keyword">typedef</span> <a class="code" href="a00135.html">tbb::concurrent_hash_map<Key, T, HC, A></a> base_type;
-<a name="l00446"></a>00446 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
-<a name="l00447"></a>00447 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::key_type key_type;
-<a name="l00448"></a>00448 const_pointer find( <span class="keyword">const</span> key_type &k ) {
-<a name="l00449"></a>00449 <span class="keywordflow">return</span> internal_fast_find( k );
-<a name="l00450"></a>00450 } <span class="comment">// make public</span>
-<a name="l00451"></a>00451 };
-<a name="l00452"></a>00452
-<a name="l00453"></a>00453 } <span class="comment">// namespace internal</span>
-<a name="l00455"></a>00455 <span class="comment"></span>
-<a name="l00457"></a>00457 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
-<a name="l00458"></a>00458 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
-<a name="l00459"></a><a class="code" href="a00143.html">00459</a> <a class="code" href="a00237.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
-<a name="l00460"></a>00460 <span class="keyword">class </span><a class="code" href="a00143.html">enumerable_thread_specific</a> {
-<a name="l00461"></a>00461
-<a name="l00462"></a>00462 <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="a00143.html">enumerable_thread_specific</a>;
-<a name="l00463"></a>00463
-<a name="l00464"></a>00464 <span class="keyword">typedef</span> internal::tls_manager< ETS_key_type > my_tls_manager;
-<a name="l00465"></a>00465
-<a name="l00467"></a>00467 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00468"></a>00468 <span class="keyword">struct </span>padded_element {
-<a name="l00469"></a>00469 U value;
-<a name="l00470"></a>00470 <span class="keywordtype">char</span> padding[ ( (<span class="keyword">sizeof</span>(U) - 1) / internal::NFS_MaxLineSize + 1 ) * internal::NFS_MaxLineSize - <span class="keyword">sizeof</span>(U) ];
-<a name="l00471"></a>00471 padded_element(<span class="keyword">const</span> U &v) : value(v) {}
-<a name="l00472"></a>00472 padded_element() {}
-<a name="l00473"></a>00473 };
-<a name="l00474"></a>00474
-<a name="l00476"></a>00476 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00477"></a>00477 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00127.html">blocked_range</a><I> {
-<a name="l00478"></a>00478 <span class="keyword">public</span>:
-<a name="l00479"></a>00479 <span class="keyword">typedef</span> T value_type;
-<a name="l00480"></a>00480 <span class="keyword">typedef</span> T& reference;
-<a name="l00481"></a>00481 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00482"></a>00482 <span class="keyword">typedef</span> I iterator;
-<a name="l00483"></a>00483 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00484"></a>00484 generic_range_type( I begin_, I end_, size_t grainsize = 1) : <a class="code" href="a00127.html">blocked_range<I></a>(begin_,end_,grainsize) {}
-<a name="l00485"></a>00485 template<typename U>
-<a name="l00486"></a>00486 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00127.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00487"></a>00487 generic_range_type( generic_range_type& r, <a class="code" href="a00173.html">split</a> ) : <a class="code" href="a00127.html">blocked_range<I></a>(r,<a class="code" href="a00173.html">split</a>()) {}
-<a name="l00488"></a>00488 };
-<a name="l00489"></a>00489
-<a name="l00490"></a>00490 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element<T> >::other padded_allocator_type;
-<a name="l00491"></a>00491 <span class="keyword">typedef</span> <a class="code" href="a00141.html">tbb::concurrent_vector< padded_element<T></a>, padded_allocator_type > <a class="code" href="a00141.html">internal_collection_type</a>;
-<a name="l00492"></a>00492 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type hash_table_index_type; <span class="comment">// storing array indices rather than iterators to simplify</span>
-<a name="l00493"></a>00493 <span class="comment">// copying the hash table that correlates thread IDs with concurrent vector elements.</span>
-<a name="l00494"></a>00494
-<a name="l00495"></a>00495 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< std::pair< typename internal::thread_hash_compare::thread_key, hash_table_index_type > >::other hash_element_allocator;
-<a name="l00496"></a>00496 <span class="keyword">typedef</span> internal::ets_concurrent_hash_map< typename internal::thread_hash_compare::thread_key, hash_table_index_type, internal::thread_hash_compare, hash_element_allocator > thread_to_index_type;
-<a name="l00497"></a>00497
-<a name="l00498"></a>00498 <span class="keyword">typename</span> my_tls_manager::tls_key_t my_key;
-<a name="l00499"></a>00499
-<a name="l00500"></a>00500 <span class="keywordtype">void</span> reset_key() {
-<a name="l00501"></a>00501 my_tls_manager::destroy_key(my_key);
-<a name="l00502"></a>00502 my_tls_manager::create_key(my_key);
-<a name="l00503"></a>00503 }
-<a name="l00504"></a>00504
-<a name="l00505"></a>00505 internal::callback_base<T> *my_finit_callback;
-<a name="l00506"></a>00506
-<a name="l00507"></a>00507 <span class="comment">// need to use a pointed-to exemplar because T may not be assignable.</span>
-<a name="l00508"></a>00508 <span class="comment">// using tbb_allocator instead of padded_element_allocator because we may be</span>
-<a name="l00509"></a>00509 <span class="comment">// copying an exemplar from one instantiation of ETS to another with a different</span>
-<a name="l00510"></a>00510 <span class="comment">// allocator.</span>
-<a name="l00511"></a>00511 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00178.html">tbb::tbb_allocator<padded_element<T></a> > <a class="code" href="a00178.html">exemplar_allocator_type</a>;
-<a name="l00512"></a>00512 <span class="keyword">static</span> padded_element<T> * create_exemplar(<span class="keyword">const</span> T& my_value) {
-<a name="l00513"></a>00513 padded_element<T> *new_exemplar = 0;
-<a name="l00514"></a>00514 <span class="comment">// void *new_space = padded_allocator_type().allocate(1);</span>
-<a name="l00515"></a>00515 <span class="keywordtype">void</span> *new_space = exemplar_allocator_type().allocate(1);
-<a name="l00516"></a>00516 new_exemplar = <span class="keyword">new</span>(new_space) padded_element<T>(my_value);
-<a name="l00517"></a>00517 <span class="keywordflow">return</span> new_exemplar;
-<a name="l00518"></a>00518 }
-<a name="l00519"></a>00519
-<a name="l00520"></a>00520 <span class="keyword">static</span> padded_element<T> *create_exemplar( ) {
-<a name="l00521"></a>00521 <span class="comment">// void *new_space = padded_allocator_type().allocate(1);</span>
-<a name="l00522"></a>00522 <span class="keywordtype">void</span> *new_space = exemplar_allocator_type().allocate(1);
-<a name="l00523"></a>00523 padded_element<T> *new_exemplar = <span class="keyword">new</span>(new_space) padded_element<T>( );
-<a name="l00524"></a>00524 <span class="keywordflow">return</span> new_exemplar;
-<a name="l00525"></a>00525 }
-<a name="l00526"></a>00526
-<a name="l00527"></a>00527 <span class="keyword">static</span> <span class="keywordtype">void</span> free_exemplar(padded_element<T> *my_ptr) {
-<a name="l00528"></a>00528 <span class="comment">// padded_allocator_type().destroy(my_ptr);</span>
-<a name="l00529"></a>00529 <span class="comment">// padded_allocator_type().deallocate(my_ptr,1);</span>
-<a name="l00530"></a>00530 exemplar_allocator_type().destroy(my_ptr);
-<a name="l00531"></a>00531 exemplar_allocator_type().deallocate(my_ptr,1);
-<a name="l00532"></a>00532 }
-<a name="l00533"></a>00533
-<a name="l00534"></a>00534 padded_element<T>* my_exemplar_ptr;
-<a name="l00535"></a>00535
-<a name="l00536"></a>00536 internal_collection_type my_locals;
-<a name="l00537"></a>00537 thread_to_index_type my_hash_tbl;
-<a name="l00538"></a>00538
-<a name="l00539"></a>00539 <span class="keyword">public</span>:
-<a name="l00540"></a>00540
-<a name="l00542"></a>00542 <span class="keyword">typedef</span> Allocator <a class="code" href="a00143.html#60047d25605a1ef993c49234e9ac5c2d">allocator_type</a>;
-<a name="l00543"></a>00543 <span class="keyword">typedef</span> T value_type;
-<a name="l00544"></a>00544 <span class="keyword">typedef</span> T& reference;
-<a name="l00545"></a>00545 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00546"></a>00546 <span class="keyword">typedef</span> T* pointer;
-<a name="l00547"></a>00547 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
-<a name="l00548"></a>00548 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
-<a name="l00549"></a>00549 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
-<a name="l00550"></a>00550
-<a name="l00551"></a>00551 <span class="comment">// Iterator types</span>
-<a name="l00552"></a>00552 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
-<a name="l00553"></a>00553 <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="l00554"></a>00554
-<a name="l00555"></a>00555 <span class="comment">// Parallel range types</span>
-<a name="l00556"></a>00556 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
-<a name="l00557"></a>00557 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
-<a name="l00558"></a>00558
-<a name="l00560"></a>00560 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>() : my_finit_callback(0) {
-<a name="l00561"></a>00561 my_exemplar_ptr = create_exemplar();
-<a name="l00562"></a>00562 my_tls_manager::create_key(my_key);
-<a name="l00563"></a>00563 }
-<a name="l00564"></a>00564
-<a name="l00566"></a>00566 <span class="comment">// Finit should be a function taking 0 parameters and returning a T</span>
-<a name="l00567"></a><a class="code" href="a00143.html#e5698930b84c098bb6d87175b8b50306">00567</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
-<a name="l00568"></a>00568 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>( Finit _finit )
-<a name="l00569"></a>00569 {
-<a name="l00570"></a>00570 my_finit_callback = internal::callback_leaf<T,Finit>::new_callback( _finit );
-<a name="l00571"></a>00571 my_tls_manager::create_key(my_key);
-<a name="l00572"></a>00572 my_exemplar_ptr = 0; <span class="comment">// don't need exemplar if function is provided</span>
-<a name="l00573"></a>00573 }
-<a name="l00574"></a>00574
-<a name="l00576"></a>00576 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>(<span class="keyword">const</span> T &_exemplar) : my_finit_callback(0) {
-<a name="l00577"></a>00577 my_exemplar_ptr = create_exemplar(_exemplar);
-<a name="l00578"></a>00578 my_tls_manager::create_key(my_key);
-<a name="l00579"></a>00579 }
-<a name="l00580"></a>00580
-<a name="l00582"></a>00582 <a class="code" href="a00143.html#41176526161d6fef1bdd19c2db7ded4d">~enumerable_thread_specific</a>() {
-<a name="l00583"></a>00583 my_tls_manager::destroy_key(my_key);
-<a name="l00584"></a>00584 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00585"></a>00585 my_finit_callback->destroy();
-<a name="l00586"></a>00586 }
-<a name="l00587"></a>00587 <span class="keywordflow">if</span>(my_exemplar_ptr)
-<a name="l00588"></a>00588 {
-<a name="l00589"></a>00589 free_exemplar(my_exemplar_ptr);
-<a name="l00590"></a>00590 }
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592
-<a name="l00594"></a>00594 reference <a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>() {
-<a name="l00595"></a>00595 <span class="keywordtype">bool</span> exists;
-<a name="l00596"></a>00596 <span class="keywordflow">return</span> <a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>(exists);
-<a name="l00597"></a>00597 }
-<a name="l00598"></a>00598
-<a name="l00600"></a>00600 reference <a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>(<span class="keywordtype">bool</span>& exists) {
-<a name="l00601"></a>00601 <span class="keywordflow">if</span> ( pointer local_ptr = static_cast<pointer>(my_tls_manager::get_tls(my_key)) ) {
-<a name="l00602"></a>00602 exists = <span class="keyword">true</span>;
-<a name="l00603"></a>00603 <span class="keywordflow">return</span> *local_ptr;
-<a name="l00604"></a>00604 }
-<a name="l00605"></a>00605 hash_table_index_type local_index;
-<a name="l00606"></a>00606 <span class="keyword">typename</span> internal::thread_hash_compare::thread_key my_t_key = internal::thread_hash_compare::my_thread_key(tbb::this_tbb_thread::get_id());
-<a name="l00607"></a>00607 {
-<a name="l00608"></a>00608 <span class="keyword">typename</span> thread_to_index_type::const_pointer my_existing_entry;
-<a name="l00609"></a>00609 my_existing_entry = my_hash_tbl.find(my_t_key);
-<a name="l00610"></a>00610 <span class="keywordflow">if</span>(my_existing_entry) {
-<a name="l00611"></a>00611 exists = <span class="keyword">true</span>;
-<a name="l00612"></a>00612 local_index = my_existing_entry->second;
-<a name="l00613"></a>00613 }
-<a name="l00614"></a>00614 <span class="keywordflow">else</span> {
-<a name="l00615"></a>00615
-<a name="l00616"></a>00616 <span class="comment">// see if the table entry can be found by accessor</span>
-<a name="l00617"></a>00617 <span class="keyword">typename</span> thread_to_index_type::accessor a;
-<a name="l00618"></a>00618 <span class="keywordflow">if</span>(!my_hash_tbl.insert(a, my_t_key)) {
-<a name="l00619"></a>00619 exists = <span class="keyword">true</span>;
-<a name="l00620"></a>00620 local_index = a->second;
-<a name="l00621"></a>00621 }
-<a name="l00622"></a>00622 <span class="keywordflow">else</span> {
-<a name="l00623"></a>00623 <span class="comment">// create new entry</span>
-<a name="l00624"></a>00624 exists = <span class="keyword">false</span>;
-<a name="l00625"></a>00625 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00626"></a>00626 <span class="comment">// convert iterator to array index</span>
-<a name="l00627"></a>00627 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00628"></a>00628 <span class="preprocessor"></span> local_index = my_locals.<a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(my_finit_callback->apply());
-<a name="l00629"></a>00629 <span class="preprocessor">#else</span>
-<a name="l00630"></a>00630 <span class="preprocessor"></span> local_index = my_locals.<a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(my_finit_callback->apply()) - my_locals.<a class="code" href="a00141.html#730b23a251ecb6d37f692fb22f38e029">begin</a>();
-<a name="l00631"></a>00631 <span class="preprocessor">#endif</span>
-<a name="l00632"></a>00632 <span class="preprocessor"></span> }
-<a name="l00633"></a>00633 <span class="keywordflow">else</span> {
-<a name="l00634"></a>00634 <span class="comment">// convert iterator to array index</span>
-<a name="l00635"></a>00635 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00636"></a>00636 <span class="preprocessor"></span> local_index = my_locals.<a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(*my_exemplar_ptr);
-<a name="l00637"></a>00637 <span class="preprocessor">#else</span>
-<a name="l00638"></a>00638 <span class="preprocessor"></span> local_index = my_locals.<a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(*my_exemplar_ptr) - my_locals.<a class="code" href="a00141.html#730b23a251ecb6d37f692fb22f38e029">begin</a>();
-<a name="l00639"></a>00639 <span class="preprocessor">#endif</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span> }
-<a name="l00641"></a>00641 <span class="comment">// insert into hash table</span>
-<a name="l00642"></a>00642 a->second = local_index;
-<a name="l00643"></a>00643 }
-<a name="l00644"></a>00644 }
-<a name="l00645"></a>00645 }
-<a name="l00646"></a>00646
-<a name="l00647"></a>00647 reference local_ref = (my_locals[local_index].value);
-<a name="l00648"></a>00648 my_tls_manager::set_tls( my_key, static_cast<void *>(&local_ref) );
-<a name="l00649"></a>00649 <span class="keywordflow">return</span> local_ref;
-<a name="l00650"></a>00650 } <span class="comment">// local</span>
-<a name="l00651"></a>00651
-<a name="l00653"></a>00653 size_type <a class="code" href="a00143.html#302a4d6f55f852d5b7a6679e0e00316e">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
-<a name="l00654"></a>00654
-<a name="l00656"></a>00656 <span class="keywordtype">bool</span> <a class="code" href="a00143.html#ad23345a722622199deaa4dfd243d9f8">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00141.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
-<a name="l00657"></a>00657
-<a name="l00659"></a>00659 iterator <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
-<a name="l00661"></a>00661 iterator <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
-<a name="l00662"></a>00662
-<a name="l00664"></a>00664 const_iterator <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
-<a name="l00665"></a>00665
-<a name="l00667"></a>00667 const_iterator <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
-<a name="l00668"></a>00668
-<a name="l00670"></a>00670 range_type <a class="code" href="a00143.html#56f6124f5870e26433a5bb2b71e4b7e9">range</a>( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>(), <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>(), grainsize ); }
-<a name="l00671"></a>00671
-<a name="l00673"></a>00673 const_range_type <a class="code" href="a00143.html#56f6124f5870e26433a5bb2b71e4b7e9">range</a>( size_t grainsize=1 )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_range_type( <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>(), <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>(), grainsize ); }
-<a name="l00674"></a>00674
-<a name="l00676"></a>00676 <span class="keywordtype">void</span> <a class="code" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">clear</a>() {
-<a name="l00677"></a>00677 my_locals.<a class="code" href="a00141.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
-<a name="l00678"></a>00678 my_hash_tbl.clear();
-<a name="l00679"></a>00679 reset_key();
-<a name="l00680"></a>00680 <span class="comment">// callback is not destroyed</span>
-<a name="l00681"></a>00681 <span class="comment">// exemplar is not destroyed</span>
-<a name="l00682"></a>00682 }
-<a name="l00683"></a>00683
-<a name="l00684"></a>00684 <span class="comment">// STL container methods</span>
-<a name="l00685"></a>00685 <span class="comment">// copy constructor</span>
-<a name="l00686"></a>00686
-<a name="l00687"></a>00687 <span class="keyword">private</span>:
-<a name="l00688"></a>00688
-<a name="l00689"></a>00689 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00690"></a>00690 <span class="keywordtype">void</span>
-<a name="l00691"></a>00691 internal_copy_construct( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00692"></a>00692 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00143.html">tbb::enumerable_thread_specific<U, A2, C2></a> other_type;
-<a name="l00693"></a>00693 <span class="keywordflow">for</span>(<span class="keyword">typename</span> other_type::const_iterator ci = other.begin(); ci != other.end(); ++ci) {
-<a name="l00694"></a>00694 my_locals.<a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(*ci);
-<a name="l00695"></a>00695 }
-<a name="l00696"></a>00696 <span class="keywordflow">if</span>(other.my_finit_callback) {
-<a name="l00697"></a>00697 my_finit_callback = other.my_finit_callback->make_copy();
-<a name="l00698"></a>00698 }
-<a name="l00699"></a>00699 <span class="keywordflow">else</span> {
-<a name="l00700"></a>00700 my_finit_callback = 0;
-<a name="l00701"></a>00701 }
-<a name="l00702"></a>00702 <span class="keywordflow">if</span>(other.my_exemplar_ptr) {
-<a name="l00703"></a>00703 my_exemplar_ptr = create_exemplar(other.my_exemplar_ptr->value);
-<a name="l00704"></a>00704 }
-<a name="l00705"></a>00705 <span class="keywordflow">else</span> {
-<a name="l00706"></a>00706 my_exemplar_ptr = 0;
-<a name="l00707"></a>00707 }
-<a name="l00708"></a>00708 my_tls_manager::create_key(my_key);
-<a name="l00709"></a>00709 }
-<a name="l00710"></a>00710
-<a name="l00711"></a>00711 <span class="keyword">public</span>:
-<a name="l00712"></a>00712
-<a name="l00713"></a>00713 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00714"></a>00714 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : my_hash_tbl(other.my_hash_tbl)
-<a name="l00715"></a>00715 { <span class="comment">// Have to do push_back because the contained elements are not necessarily assignable.</span>
-<a name="l00716"></a>00716 internal_copy_construct(other);
-<a name="l00717"></a>00717 }
-<a name="l00718"></a>00718
-<a name="l00719"></a>00719 <span class="comment">// non-templatized version</span>
-<a name="l00720"></a>00720 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>( <span class="keyword">const</span> <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>& other ) : my_hash_tbl(other.my_hash_tbl)
-<a name="l00721"></a>00721 {
-<a name="l00722"></a>00722 internal_copy_construct(other);
-<a name="l00723"></a>00723 }
-<a name="l00724"></a>00724
-<a name="l00725"></a>00725 <span class="keyword">private</span>:
-<a name="l00726"></a>00726
-<a name="l00727"></a>00727 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00728"></a>00728 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a> &
-<a name="l00729"></a>00729 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00730"></a>00730 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00143.html">tbb::enumerable_thread_specific<U, A2, C2></a> other_type;
-<a name="l00731"></a>00731 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
-<a name="l00732"></a>00732 this-><a class="code" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">clear</a>(); <span class="comment">// resets TLS key</span>
-<a name="l00733"></a>00733 my_hash_tbl = other.my_hash_tbl;
-<a name="l00734"></a>00734 <span class="comment">// cannot use assign because T may not be assignable.</span>
-<a name="l00735"></a>00735 <span class="keywordflow">for</span>(<span class="keyword">typename</span> other_type::const_iterator ci = other.begin(); ci != other.end(); ++ci) {
-<a name="l00736"></a>00736 my_locals.<a class="code" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(*ci);
-<a name="l00737"></a>00737 }
-<a name="l00738"></a>00738
-<a name="l00739"></a>00739 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00740"></a>00740 my_finit_callback->destroy();
-<a name="l00741"></a>00741 my_finit_callback = 0;
-<a name="l00742"></a>00742 }
-<a name="l00743"></a>00743 <span class="keywordflow">if</span>(my_exemplar_ptr) {
-<a name="l00744"></a>00744 free_exemplar(my_exemplar_ptr);
-<a name="l00745"></a>00745 my_exemplar_ptr = 0;
-<a name="l00746"></a>00746 }
-<a name="l00747"></a>00747 <span class="keywordflow">if</span>(other.my_finit_callback) {
-<a name="l00748"></a>00748 my_finit_callback = other.my_finit_callback->make_copy();
-<a name="l00749"></a>00749 }
-<a name="l00750"></a>00750
-<a name="l00751"></a>00751 <span class="keywordflow">if</span>(other.my_exemplar_ptr) {
-<a name="l00752"></a>00752 my_exemplar_ptr = create_exemplar(other.my_exemplar_ptr->value);
-<a name="l00753"></a>00753 }
-<a name="l00754"></a>00754 }
-<a name="l00755"></a>00755 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00756"></a>00756 }
-<a name="l00757"></a>00757
-<a name="l00758"></a>00758 <span class="keyword">public</span>:
-<a name="l00759"></a>00759
-<a name="l00760"></a>00760 <span class="comment">// assignment</span>
-<a name="l00761"></a>00761 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>& operator=(<span class="keyword">const</span> <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>& other) {
-<a name="l00762"></a>00762 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00763"></a>00763 }
-<a name="l00764"></a>00764
-<a name="l00765"></a>00765 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00766"></a>00766 <a class="code" href="a00143.html#632e351d5269ac609b08dba19282f3a3">enumerable_thread_specific</a>& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
-<a name="l00767"></a>00767 {
-<a name="l00768"></a>00768 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00769"></a>00769 }
-<a name="l00770"></a>00770
-<a name="l00771"></a>00771 <span class="keyword">private</span>:
-<a name="l00772"></a>00772
-<a name="l00773"></a>00773 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00774"></a>00774 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00775"></a>00775 T internal_combine(<span class="keyword">typename</span> internal_collection_type::const_range_type r, combine_func_t f_combine) {
-<a name="l00776"></a>00776 <span class="keywordflow">if</span>(r.is_divisible()) {
-<a name="l00777"></a>00777 <span class="keyword">typename</span> internal_collection_type::const_range_type r2(r,split());
-<a name="l00778"></a>00778 <span class="keywordflow">return</span> f_combine(internal_combine(r2, f_combine), internal_combine(r, f_combine));
-<a name="l00779"></a>00779 }
-<a name="l00780"></a>00780 <span class="keywordflow">if</span>(r.size() == 1) {
-<a name="l00781"></a>00781 <span class="keywordflow">return</span> r.begin()->value;
-<a name="l00782"></a>00782 }
-<a name="l00783"></a>00783 <span class="keyword">typename</span> internal_collection_type::const_iterator i2 = r.begin();
-<a name="l00784"></a>00784 ++i2;
-<a name="l00785"></a>00785 <span class="keywordflow">return</span> f_combine(r.begin()->value, i2->value);
-<a name="l00786"></a>00786 }
-<a name="l00787"></a>00787
-<a name="l00788"></a>00788 <span class="keyword">public</span>:
-<a name="l00789"></a>00789
-<a name="l00790"></a>00790 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00791"></a>00791 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00792"></a>00792 T combine(combine_func_t f_combine) {
-<a name="l00793"></a>00793 <span class="keywordflow">if</span>(my_locals.<a class="code" href="a00141.html#730b23a251ecb6d37f692fb22f38e029">begin</a>() == my_locals.<a class="code" href="a00141.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()) {
-<a name="l00794"></a>00794 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00795"></a>00795 <span class="keywordflow">return</span> my_finit_callback->apply();
-<a name="l00796"></a>00796 }
-<a name="l00797"></a>00797 <span class="keywordflow">return</span> (*my_exemplar_ptr).value;
-<a name="l00798"></a>00798 }
-<a name="l00799"></a>00799 <span class="keyword">typename</span> internal_collection_type::const_range_type r(my_locals.<a class="code" href="a00141.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(), my_locals.<a class="code" href="a00141.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(), (size_t)2);
-<a name="l00800"></a>00800 <span class="keywordflow">return</span> internal_combine(r, f_combine);
-<a name="l00801"></a>00801 }
-<a name="l00802"></a>00802
-<a name="l00803"></a>00803 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00804"></a>00804 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00805"></a>00805 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
-<a name="l00806"></a>00806 <span class="keywordflow">for</span>(const_iterator ci = <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>(); ci != <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>(); ++ci) {
-<a name="l00807"></a>00807 f_combine( *ci );
-<a name="l00808"></a>00808 }
-<a name="l00809"></a>00809 }
-<a name="l00810"></a>00810 }; <span class="comment">// enumerable_thread_specific</span>
-<a name="l00811"></a>00811
-<a name="l00812"></a>00812 <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
-<a name="l00813"></a>00813 <span class="keyword">class </span>flattened2d {
-<a name="l00814"></a>00814
-<a name="l00815"></a>00815 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
-<a name="l00816"></a>00816 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
-<a name="l00817"></a>00817
-<a name="l00818"></a>00818 <span class="keyword">public</span>:
-<a name="l00819"></a>00819
-<a name="l00821"></a>00821 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
-<a name="l00822"></a>00822 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
-<a name="l00823"></a>00823 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
-<a name="l00824"></a>00824 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
-<a name="l00825"></a>00825 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
-<a name="l00826"></a>00826 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
-<a name="l00827"></a>00827 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
-<a name="l00828"></a>00828 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
-<a name="l00829"></a>00829
-<a name="l00830"></a>00830 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
-<a name="l00831"></a>00831 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
-<a name="l00832"></a>00832
-<a name="l00833"></a>00833 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="l00834"></a>00834 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
-<a name="l00835"></a>00835
-<a name="l00836"></a>00836 flattened2d( <span class="keyword">const</span> Container &c ) :
-<a name="l00837"></a>00837 my_container(const_cast<Container*>(&c)), my_begin(c.<a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>()), my_end(c.<a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>()) { }
-<a name="l00838"></a>00838
-<a name="l00839"></a>00839 iterator <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
-<a name="l00840"></a>00840 iterator <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
-<a name="l00841"></a>00841 const_iterator <a class="code" href="a00143.html#225f945c810397c6a54d5b8317dc5843">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
-<a name="l00842"></a>00842 const_iterator <a class="code" href="a00143.html#44c0b67ebb56b2ae1fa260d9e2bd1e99">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
-<a name="l00843"></a>00843
-<a name="l00844"></a>00844 size_type <a class="code" href="a00143.html#302a4d6f55f852d5b7a6679e0e00316e">size</a>()<span class="keyword"> const </span>{
-<a name="l00845"></a>00845 size_type tot_size = 0;
-<a name="l00846"></a>00846 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
-<a name="l00847"></a>00847 tot_size += i->size();
-<a name="l00848"></a>00848 }
-<a name="l00849"></a>00849 <span class="keywordflow">return</span> tot_size;
-<a name="l00850"></a>00850 }
-<a name="l00851"></a>00851
-<a name="l00852"></a>00852 <span class="keyword">private</span>:
-<a name="l00853"></a>00853
-<a name="l00854"></a>00854 Container *my_container;
-<a name="l00855"></a>00855 <span class="keyword">typename</span> Container::const_iterator my_begin;
-<a name="l00856"></a>00856 <span class="keyword">typename</span> Container::const_iterator my_end;
-<a name="l00857"></a>00857
-<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> Container>
-<a name="l00861"></a>00861 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="l00862"></a>00862 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
-<a name="l00863"></a>00863 }
-<a name="l00864"></a>00864
-<a name="l00865"></a>00865 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00866"></a>00866 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
-<a name="l00867"></a>00867 <span class="keywordflow">return</span> flattened2d<Container>(c);
-<a name="l00868"></a>00868 }
-<a name="l00869"></a>00869
-<a name="l00870"></a>00870 } <span class="comment">// namespace tbb</span>
-<a name="l00871"></a>00871
-<a name="l00872"></a>00872 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00263.html b/doc/html/a00308.html
similarity index 99%
rename from doc/html/a00263.html
rename to doc/html/a00308.html
index 64c2887..df4a42f 100644
--- a/doc/html/a00263.html
+++ b/doc/html/a00308.html
@@ -94,7 +94,7 @@
<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00265.html b/doc/html/a00310.html
similarity index 90%
rename from doc/html/a00265.html
rename to doc/html/a00310.html
index bae8c20..183d4ef 100644
--- a/doc/html/a00265.html
+++ b/doc/html/a00310.html
@@ -49,14 +49,14 @@
<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="a00121.html">00033</a> <span class="keyword">class </span><a class="code" href="a00121.html">aligned_space</a> {
+<a name="l00033"></a><a class="code" href="a00142.html">00033</a> <span class="keyword">class </span><a class="code" href="a00142.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="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> reinterpret_cast<T*>(<span class="keyword">this</span>);}
+<a name="l00039"></a><a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> reinterpret_cast<T*>(<span class="keyword">this</span>);}
<a name="l00040"></a>00040
-<a name="l00042"></a><a class="code" href="a00121.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00121.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
+<a name="l00042"></a><a class="code" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00142.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>
@@ -64,7 +64,7 @@
<a name="l00047"></a>00047 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_aligned_space_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00266.html b/doc/html/a00311.html
similarity index 94%
rename from doc/html/a00266.html
rename to doc/html/a00311.html
index b9a63be..85cf83c 100644
--- a/doc/html/a00266.html
+++ b/doc/html/a00311.html
@@ -61,10 +61,10 @@
<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="a00237.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
-<a name="l00046"></a>00046 <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
-<a name="l00048"></a>00048 <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a name="l00050"></a>00050 <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
+<a name="l00044"></a><a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
+<a name="l00046"></a>00046 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
+<a name="l00048"></a>00048 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
+<a name="l00050"></a>00050 <a class="code" href="a00267.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 {
@@ -139,18 +139,18 @@
<a name="l00123"></a>00123 <span class="preprocessor"> };</span>
<a name="l00124"></a>00124 <span class="preprocessor"></span>
<a name="l00125"></a>00125 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00127"></a>00127 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00128"></a>00128 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00129"></a>00129 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00130"></a>00130 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00131"></a>00131 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00132"></a>00132 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00133"></a>00133 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00134"></a>00134 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00135"></a>00135 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00136"></a>00136 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00137"></a>00137 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00126"></a>00126 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
+<a name="l00127"></a>00127 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
+<a name="l00128"></a>00128 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
+<a name="l00129"></a>00129 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
+<a name="l00130"></a>00130 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00131"></a>00131 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00132"></a>00132 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00133"></a>00133 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00134"></a>00134 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00135"></a>00135 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00136"></a>00136 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00137"></a>00137 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
<a name="l00138"></a>00138 <span class="preprocessor">#else</span>
<a name="l00139"></a>00139 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(1)
<a name="l00140"></a>00140 __TBB_DECL_ATOMIC_PRIMITIVES(2)
@@ -308,12 +308,12 @@
<a name="l00301"></a>00301
<a name="l00303"></a>00303
<a name="l00305"></a>00305 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00306"></a><a class="code" href="a00122.html">00306</a> <span class="keyword">struct </span><a class="code" href="a00122.html">atomic</a>: internal::atomic_impl<T> {
+<a name="l00306"></a><a class="code" href="a00143.html">00306</a> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a>: internal::atomic_impl<T> {
<a name="l00307"></a>00307 T operator=( T rhs ) {
<a name="l00308"></a>00308 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
<a name="l00309"></a>00309 <span class="keywordflow">return</span> this->store_with_release(rhs);
<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <a class="code" href="a00122.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00122.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
+<a name="l00311"></a>00311 <a class="code" href="a00143.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00312"></a>00312 };
<a name="l00313"></a>00313
<a name="l00314"></a>00314 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
@@ -343,8 +343,8 @@
<a name="l00338"></a>00338 <span class="preprocessor"> T operator=( U rhs ) {return store_with_release(T(rhs));} \</span>
<a name="l00339"></a>00339 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
<a name="l00340"></a>00340 <span class="preprocessor"> };</span>
-<a name="l00341"></a>00341 <span class="preprocessor"></span><a class="code" href="a00237.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
-<a name="l00342"></a><a class="code" href="a00237.html#ad165cf61abbe349d413df2589679add">00342</a> __TBB_DECL_ATOMIC_ALT(<span class="keywordtype">int</span>,ptrdiff_t)
+<a name="l00341"></a>00341 <span class="preprocessor"></span><a class="code" href="a00267.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
+<a name="l00342"></a><a class="code" href="a00267.html#ad165cf61abbe349d413df2589679add">00342</a> __TBB_DECL_ATOMIC_ALT(<span class="keywordtype">int</span>,ptrdiff_t)
<a name="l00343"></a>00343 <span class="preprocessor">#else</span>
<a name="l00344"></a>00344 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span>)
<a name="l00345"></a>00345 __TBB_DECL_ATOMIC(<span class="keywordtype">int</span>)
@@ -360,12 +360,12 @@
<a name="l00355"></a>00355 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
<a name="l00357"></a>00357
-<a name="l00359"></a>00359 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00122.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
+<a name="l00359"></a>00359 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
<a name="l00360"></a>00360 T* operator=( T* rhs ) {
<a name="l00361"></a>00361 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
<a name="l00362"></a>00362 <span class="keywordflow">return</span> this->store_with_release(rhs);
<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364 <a class="code" href="a00122.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00122.html">atomic<T*></a>& rhs ) {
+<a name="l00364"></a>00364 <a class="code" href="a00143.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<T*></a>& rhs ) {
<a name="l00365"></a>00365 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00366"></a>00366 }
<a name="l00367"></a>00367 T* operator->()<span class="keyword"> const </span>{
@@ -373,12 +373,12 @@
<a name="l00369"></a>00369 }
<a name="l00370"></a>00370 };
<a name="l00371"></a>00371
-<a name="l00373"></a><a class="code" href="a00123.html">00373</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00122.html">atomic</a><void*>: internal::atomic_impl<void*> {
+<a name="l00373"></a><a class="code" href="a00144.html">00373</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a><void*>: internal::atomic_impl<void*> {
<a name="l00374"></a>00374 <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
<a name="l00375"></a>00375 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
<a name="l00376"></a>00376 <span class="keywordflow">return</span> this->store_with_release(rhs);
<a name="l00377"></a>00377 }
-<a name="l00378"></a>00378 <a class="code" href="a00122.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00122.html">atomic<void*></a>& rhs ) {
+<a name="l00378"></a>00378 <a class="code" href="a00143.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<void*></a>& rhs ) {
<a name="l00379"></a>00379 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00380"></a>00380 }
<a name="l00381"></a>00381 };
@@ -392,7 +392,7 @@
<a name="l00389"></a>00389 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00313.html b/doc/html/a00313.html
deleted file mode 100644
index 2609e5f..0000000
--- a/doc/html/a00313.html
+++ /dev/null
@@ -1,238 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#if !defined(_WIN32_WINNT)</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="comment">// The following Windows API function is declared explicitly;</span>
-<a name="l00028"></a>00028 <span class="comment">// otherwise any user would have to specify /D_WIN32_WINNT=0x0400</span>
-<a name="l00029"></a>00029 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
-<a name="l00030"></a>00030 <span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#else </span><span class="comment">/* if not _WIN32||_WIN64 */</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include <pthread.h></span>
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>tbb { <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035 <span class="comment">// Use this internal TBB function to throw an exception</span>
-<a name="l00036"></a>00036 <span class="keyword">extern</span> <span class="keywordtype">void</span> handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* what );
-<a name="l00037"></a>00037 } } <span class="comment">//namespaces</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00039"></a>00039
-<a name="l00040"></a>00040 <span class="preprocessor">#include <new></span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>tbb {
-<a name="l00046"></a>00046
-<a name="l00048"></a>00048
-<a name="l00050"></a><a class="code" href="a00150.html">00050</a> <span class="keyword">class </span><a class="code" href="a00150.html">mutex</a> {
-<a name="l00051"></a>00051 <span class="keyword">public</span>:
-<a name="l00053"></a><a class="code" href="a00150.html#05313cb77d4f85213103d4dab74ed454">00053</a> <a class="code" href="a00150.html#05313cb77d4f85213103d4dab74ed454">mutex</a>() {
-<a name="l00054"></a>00054 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span> internal_construct();
-<a name="l00056"></a>00056 <span class="preprocessor">#else</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span> InitializeCriticalSection(&impl);
-<a name="l00059"></a>00059 <span class="preprocessor"> #else</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span> <span class="keywordtype">int</span> error_code = pthread_mutex_init(&impl,NULL);
-<a name="l00061"></a>00061 <span class="keywordflow">if</span>( error_code )
-<a name="l00062"></a>00062 tbb::internal::handle_perror(error_code,<span class="stringliteral">"mutex: pthread_mutex_init failed"</span>);
-<a name="l00063"></a>00063 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
-<a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00065"></a>00065 };
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 ~<a class="code" href="a00150.html">mutex</a>() {
-<a name="l00068"></a>00068 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span> internal_destroy();
-<a name="l00070"></a>00070 <span class="preprocessor">#else</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span> DeleteCriticalSection(&impl);
-<a name="l00073"></a>00073 <span class="preprocessor"> #else</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span> pthread_mutex_destroy(&impl);
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</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
-<a name="l00080"></a>00080 <span class="keyword">class </span>scoped_lock;
-<a name="l00081"></a>00081 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00082"></a>00082
-<a name="l00084"></a>00084
-<a name="l00086"></a><a class="code" href="a00151.html">00086</a> <span class="keyword">class </span><a class="code" href="a00151.html">scoped_lock</a> : internal::no_copy {
-<a name="l00087"></a>00087 <span class="keyword">public</span>:
-<a name="l00089"></a><a class="code" href="a00151.html#1d403ae51b484df5d86d85ae38f11e6e">00089</a> <a class="code" href="a00151.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
-<a name="l00090"></a>00090
-<a name="l00092"></a>00092
-<a name="l00093"></a><a class="code" href="a00151.html#605a6b9af0f8cdabdf81825e0de99600">00093</a> <a class="code" href="a00151.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00150.html">mutex</a>& <a class="code" href="a00150.html">mutex</a> ) {
-<a name="l00094"></a>00094 <a class="code" href="a00151.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
-<a name="l00095"></a>00095 }
-<a name="l00096"></a>00096
-<a name="l00098"></a><a class="code" href="a00151.html#0ebbbecaf4311e9df7362cb76ceaa368">00098</a> <a class="code" href="a00151.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>() {
-<a name="l00099"></a>00099 <span class="keywordflow">if</span>( my_mutex )
-<a name="l00100"></a>00100 <a class="code" href="a00151.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102
-<a name="l00104"></a><a class="code" href="a00151.html#862e022841cdc522e4296a5533b22efd">00104</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00150.html">mutex</a>& <a class="code" href="a00150.html">mutex</a> ) {
-<a name="l00105"></a>00105 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span> internal_acquire(mutex);
-<a name="l00107"></a>00107 <span class="preprocessor">#else</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span> mutex.<a class="code" href="a00150.html#4470e61c24c129a0299ca6c17240adbb">lock</a>();
-<a name="l00109"></a>00109 my_mutex = &mutex;
-<a name="l00110"></a>00110 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112
-<a name="l00114"></a><a class="code" href="a00151.html#591e0c49b82bcedffcbe0923f1b915ec">00114</a> <span class="keywordtype">bool</span> <a class="code" href="a00151.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00150.html">mutex</a>& <a class="code" href="a00150.html">mutex</a> ) {
-<a name="l00115"></a>00115 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire (mutex);
-<a name="l00117"></a>00117 <span class="preprocessor">#else</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00150.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>();
-<a name="l00119"></a>00119 <span class="keywordflow">if</span>( result )
-<a name="l00120"></a>00120 my_mutex = &mutex;
-<a name="l00121"></a>00121 <span class="keywordflow">return</span> result;
-<a name="l00122"></a>00122 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00123"></a>00123 }
-<a name="l00124"></a>00124
-<a name="l00126"></a><a class="code" href="a00151.html#0d51d18cd99df3b2e93bf07378d0992c">00126</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>() {
-<a name="l00127"></a>00127 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span> internal_release ();
-<a name="l00129"></a>00129 <span class="preprocessor">#else</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00150.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>();
-<a name="l00131"></a>00131 my_mutex = NULL;
-<a name="l00132"></a>00132 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">private</span>:
-<a name="l00137"></a>00137 <a class="code" href="a00150.html">mutex</a>* my_mutex;
-<a name="l00138"></a>00138
-<a name="l00140"></a>00140 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00150.html">mutex</a>& m );
-<a name="l00141"></a>00141
-<a name="l00143"></a>00143 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00150.html">mutex</a>& m );
-<a name="l00144"></a>00144
-<a name="l00146"></a>00146 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00150.html">mutex</a>;
-<a name="l00149"></a>00149 };
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="comment">// Mutex traits</span>
-<a name="l00152"></a>00152 <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="l00153"></a>00153 <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="l00154"></a>00154 <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="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00157"></a>00157
-<a name="l00159"></a><a class="code" href="a00150.html#4470e61c24c129a0299ca6c17240adbb">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00150.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
-<a name="l00160"></a>00160 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00161"></a>00161 <span class="preprocessor"></span> <a class="code" href="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00162"></a>00162 <span class="keyword">new</span>(tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00151.html">scoped_lock</a>(*<span class="keyword">this</span>);
-<a name="l00163"></a>00163 <span class="preprocessor">#else</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00165"></a>00165 <span class="preprocessor"></span> EnterCriticalSection(&impl);
-<a name="l00166"></a>00166 <span class="preprocessor"> #else</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span> pthread_mutex_lock(&impl);
-<a name="l00168"></a>00168 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00169"></a>00169 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00170"></a>00170 }
-<a name="l00171"></a>00171
-<a name="l00173"></a>00173
-<a name="l00174"></a><a class="code" href="a00150.html#4331652c79dea1c1131bd59ab161b234">00174</a> <span class="keywordtype">bool</span> <a class="code" href="a00150.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
-<a name="l00175"></a>00175 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00176"></a>00176 <span class="preprocessor"></span> <a class="code" href="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00177"></a>00177 <a class="code" href="a00151.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00178"></a>00178 s.<a class="code" href="a00151.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
-<a name="l00179"></a>00179 <span class="keywordflow">return</span> s.<a class="code" href="a00151.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
-<a name="l00180"></a>00180 <span class="preprocessor">#else</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
-<a name="l00183"></a>00183 <span class="preprocessor"> #else</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
-<a name="l00185"></a>00185 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00186"></a>00186 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188
-<a name="l00190"></a><a class="code" href="a00150.html#5fc9ef443ae75d966695546be399cc6b">00190</a> <span class="keywordtype">void</span> <a class="code" href="a00150.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
-<a name="l00191"></a>00191 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00192"></a>00192 <span class="preprocessor"></span> <a class="code" href="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00193"></a>00193 <a class="code" href="a00151.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00194"></a>00194 s.<a class="code" href="a00151.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00195"></a>00195 s.<a class="code" href="a00151.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
-<a name="l00196"></a>00196 <span class="preprocessor">#else</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00198"></a>00198 <span class="preprocessor"></span> LeaveCriticalSection(&impl);
-<a name="l00199"></a>00199 <span class="preprocessor"> #else</span>
-<a name="l00200"></a>00200 <span class="preprocessor"></span> pthread_mutex_unlock(&impl);
-<a name="l00201"></a>00201 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00202"></a>00202 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00203"></a>00203 }
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="keyword">private</span>:
-<a name="l00206"></a>00206 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00207"></a>00207 <span class="preprocessor"></span> CRITICAL_SECTION impl;
-<a name="l00208"></a>00208 <span class="keyword">enum</span> state_t {
-<a name="l00209"></a>00209 INITIALIZED=0x1234,
-<a name="l00210"></a>00210 DESTROYED=0x789A,
-<a name="l00211"></a>00211 HELD=0x56CD
-<a name="l00212"></a>00212 } state;
-<a name="l00213"></a>00213 <span class="preprocessor">#else</span>
-<a name="l00214"></a>00214 <span class="preprocessor"></span> pthread_mutex_t impl;
-<a name="l00215"></a>00215 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00216"></a>00216
-<a name="l00218"></a>00218 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00219"></a>00219
-<a name="l00221"></a>00221 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00222"></a>00222 };
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 __TBB_DEFINE_PROFILING_SET_NAME(mutex)
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 } <span class="comment">// namespace tbb </span>
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00315.html b/doc/html/a00315.html
deleted file mode 100644
index 08c5127..0000000
--- a/doc/html/a00315.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>null_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>null_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_null_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_null_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="keyword">namespace </span>tbb {
-<a name="l00025"></a>00025
-<a name="l00027"></a>00027
-<a name="l00029"></a><a class="code" href="a00152.html">00029</a> <span class="keyword">class </span><a class="code" href="a00152.html">null_mutex</a> {
-<a name="l00031"></a>00031 <a class="code" href="a00152.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00152.html">null_mutex</a>& );
-<a name="l00032"></a>00032 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00152.html">null_mutex</a>& );
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00153.html">00035</a> <span class="keyword">class </span><a class="code" href="a00153.html">scoped_lock</a> {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 <a class="code" href="a00153.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038 <a class="code" href="a00153.html">scoped_lock</a>( <a class="code" href="a00152.html">null_mutex</a>& ) {}
-<a name="l00039"></a>00039 ~<a class="code" href="a00153.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00152.html">null_mutex</a>& ) {}
-<a name="l00041"></a>00041 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00152.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="a00152.html">null_mutex</a>() {}
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="comment">// Mutex traits </span>
-<a name="l00048"></a>00048 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00049"></a>00049 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
-<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00051"></a>00051 };
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_null_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00316.html b/doc/html/a00316.html
deleted file mode 100644
index aa03e40..0000000
--- a/doc/html/a00316.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>null_rw_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>null_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_null_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_null_rw_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="keyword">namespace </span>tbb {
-<a name="l00025"></a>00025
-<a name="l00027"></a>00027
-<a name="l00029"></a><a class="code" href="a00154.html">00029</a> <span class="keyword">class </span><a class="code" href="a00154.html">null_rw_mutex</a> {
-<a name="l00031"></a>00031 <a class="code" href="a00154.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00154.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="a00154.html">null_rw_mutex</a>& );
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00155.html">00035</a> <span class="keyword">class </span><a class="code" href="a00155.html">scoped_lock</a> {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 <a class="code" href="a00155.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038 <a class="code" href="a00155.html">scoped_lock</a>( <a class="code" href="a00154.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
-<a name="l00039"></a>00039 ~<a class="code" href="a00155.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00154.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="a00154.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="a00154.html">null_rw_mutex</a>() {}
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="comment">// Mutex traits </span>
-<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00051"></a>00051 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
-<a name="l00052"></a>00052 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00053"></a>00053 };
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 }
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_null_rw_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00317.html b/doc/html/a00317.html
deleted file mode 100644
index 68f4df1..0000000
--- a/doc/html/a00317.html
+++ /dev/null
@@ -1,480 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_do.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_do.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_do_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_do_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <iterator></span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item> <span class="keyword">class </span>parallel_do_feeder_impl;
-<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> Body> <span class="keyword">class </span>do_group_task;
-<a name="l00034"></a>00034
-<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00037"></a>00037 <span class="keyword">struct </span>strip { <span class="keyword">typedef</span> T type; };
-<a name="l00038"></a>00038 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00039"></a>00039 <span class="keyword">struct </span>strip<T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00040"></a>00040 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00041"></a>00041 <span class="keyword">struct </span>strip<const T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00042"></a>00042 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00043"></a>00043 <span class="keyword">struct </span>strip<volatile T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00044"></a>00044 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00045"></a>00045 <span class="keyword">struct </span>strip<const volatile T&> { <span class="keyword">typedef</span> T type; };
-<a name="l00046"></a>00046 <span class="comment">// Most of the compilers remove cv-qualifiers from non-reference function argument types. </span>
-<a name="l00047"></a>00047 <span class="comment">// But unfortunately there are those that don't.</span>
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00049"></a>00049 <span class="keyword">struct </span>strip<const T> { <span class="keyword">typedef</span> T type; };
-<a name="l00050"></a>00050 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00051"></a>00051 <span class="keyword">struct </span>strip<volatile T> { <span class="keyword">typedef</span> T type; };
-<a name="l00052"></a>00052 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00053"></a>00053 <span class="keyword">struct </span>strip<const volatile T> { <span class="keyword">typedef</span> T type; };
-<a name="l00054"></a>00054 } <span class="comment">// namespace internal</span>
-<a name="l00056"></a>00056 <span class="comment"></span>
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> Item>
-<a name="l00060"></a><a class="code" href="a00156.html">00060</a> <span class="keyword">class </span><a class="code" href="a00156.html">parallel_do_feeder</a>: internal::no_copy
-<a name="l00061"></a>00061 {
-<a name="l00062"></a>00062 <a class="code" href="a00156.html">parallel_do_feeder</a>() {}
-<a name="l00063"></a>00063 <span class="keyword">virtual</span> ~<a class="code" href="a00156.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="a00156.html#40baaf0f6856f4491dd0adf896c93516">00068</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html#40baaf0f6856f4491dd0adf896c93516">add</a>( <span class="keyword">const</span> Item& item ) {internal_add(item);}
-<a name="l00069"></a>00069 };
-<a name="l00070"></a>00070
-<a name="l00072"></a>00072 <span class="keyword">namespace </span>internal {
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076 <span class="keyword">template</span><<span class="keyword">class</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00077"></a>00077 <span class="keyword">class </span>parallel_do_operator_selector
-<a name="l00078"></a>00078 {
-<a name="l00079"></a>00079 <span class="keyword">typedef</span> parallel_do_feeder<Item> Feeder;
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2, <span class="keyword">typename</span> CvItem >
-<a name="l00081"></a>00081 <span class="keyword">static</span> <span class="keywordtype">void</span> internal_call( <span class="keyword">const</span> Body& obj, A1& arg1, A2&, <span class="keywordtype">void</span> (Body::*)(CvItem) <span class="keyword">const</span> ) {
-<a name="l00082"></a>00082 obj(arg1);
-<a name="l00083"></a>00083 }
-<a name="l00084"></a>00084 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2, <span class="keyword">typename</span> CvItem >
-<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keywordtype">void</span> internal_call( <span class="keyword">const</span> Body& obj, A1& arg1, A2& arg2, <span class="keywordtype">void</span> (Body::*)(CvItem, parallel_do_feeder<Item>&) <span class="keyword">const</span> ) {
-<a name="l00086"></a>00086 obj(arg1, arg2);
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="keyword">public</span>:
-<a name="l00090"></a>00090 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2 >
-<a name="l00091"></a>00091 <span class="keyword">static</span> <span class="keywordtype">void</span> call( <span class="keyword">const</span> Body& obj, A1& arg1, A2& arg2 )
-<a name="l00092"></a>00092 {
-<a name="l00093"></a>00093 internal_call( obj, arg1, arg2, &Body::operator() );
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095 };
-<a name="l00096"></a>00096
-<a name="l00098"></a>00098
-<a name="l00100"></a>00100 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00101"></a>00101 <span class="keyword">class </span>do_iteration_task: <span class="keyword">public</span> task
-<a name="l00102"></a>00102 {
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 Item my_value;
-<a name="l00106"></a>00106 feeder_type& my_feeder;
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 do_iteration_task( <span class="keyword">const</span> Item& value, feeder_type& feeder ) :
-<a name="l00109"></a>00109 my_value(value), my_feeder(feeder)
-<a name="l00110"></a>00110 {}
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="comment">/*override*/</span>
-<a name="l00113"></a>00113 task* execute()
-<a name="l00114"></a>00114 {
-<a name="l00115"></a>00115 parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, my_value, my_feeder);
-<a name="l00116"></a>00116 <span class="keywordflow">return</span> NULL;
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>parallel_do_feeder_impl;
-<a name="l00120"></a>00120 }; <span class="comment">// class do_iteration_task</span>
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00123"></a>00123 <span class="keyword">class </span>do_iteration_task_iter: <span class="keyword">public</span> task
-<a name="l00124"></a>00124 {
-<a name="l00125"></a>00125 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00126"></a>00126
-<a name="l00127"></a>00127 Iterator my_iter;
-<a name="l00128"></a>00128 feeder_type& my_feeder;
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 do_iteration_task_iter( <span class="keyword">const</span> Iterator& iter, feeder_type& feeder ) :
-<a name="l00131"></a>00131 my_iter(iter), my_feeder(feeder)
-<a name="l00132"></a>00132 {}
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="comment">/*override*/</span>
-<a name="l00135"></a>00135 task* execute()
-<a name="l00136"></a>00136 {
-<a name="l00137"></a>00137 parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, *my_iter, my_feeder);
-<a name="l00138"></a>00138 <span class="keywordflow">return</span> NULL;
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_group_task_forward;
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_group_task_input;
-<a name="l00143"></a>00143 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
-<a name="l00144"></a>00144 }; <span class="comment">// class do_iteration_task_iter</span>
-<a name="l00145"></a>00145
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149 <span class="keyword">template</span><<span class="keyword">class</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00150"></a>00150 <span class="keyword">class </span>parallel_do_feeder_impl : <span class="keyword">public</span> parallel_do_feeder<Item>
-<a name="l00151"></a>00151 {
-<a name="l00152"></a>00152 <span class="comment">/*override*/</span>
-<a name="l00153"></a>00153 <span class="keywordtype">void</span> internal_add( <span class="keyword">const</span> Item& item )
-<a name="l00154"></a>00154 {
-<a name="l00155"></a>00155 <span class="keyword">typedef</span> do_iteration_task<Body, Item> iteration_type;
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 iteration_type& t = *<span class="keyword">new</span> (<a class="code" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().allocate_additional_child_of(*my_barrier)) iteration_type(item, *<span class="keyword">this</span>);
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 t.spawn( t );
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161 <span class="keyword">public</span>:
-<a name="l00162"></a>00162 <span class="keyword">const</span> Body* my_body;
-<a name="l00163"></a>00163 empty_task* my_barrier;
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 parallel_do_feeder_impl()
-<a name="l00166"></a>00166 {
-<a name="l00167"></a>00167 my_barrier = <span class="keyword">new</span>( <a class="code" href="a00174.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_EXCEPTIONS</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span> parallel_do_feeder_impl(<a class="code" href="a00175.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="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(context) ) empty_task();
-<a name="l00175"></a>00175 __TBB_ASSERT(my_barrier, <span class="stringliteral">"root task allocation failed"</span>);
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177 <span class="preprocessor">#endif</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span>
-<a name="l00179"></a>00179 ~parallel_do_feeder_impl()
-<a name="l00180"></a>00180 {
-<a name="l00181"></a>00181 my_barrier->destroy(*my_barrier);
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183 }; <span class="comment">// class parallel_do_feeder_impl</span>
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187
-<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00191"></a>00191 <span class="keyword">class </span>do_group_task_forward: <span class="keyword">public</span> task
-<a name="l00192"></a>00192 {
-<a name="l00193"></a>00193 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 feeder_type& my_feeder;
-<a name="l00198"></a>00198 Iterator my_first;
-<a name="l00199"></a>00199 size_t my_size;
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 do_group_task_forward( Iterator first, size_t size, feeder_type& feeder )
-<a name="l00202"></a>00202 : my_feeder(feeder), my_first(first), my_size(size)
-<a name="l00203"></a>00203 {}
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="comment">/*override*/</span> task* execute()
-<a name="l00206"></a>00206 {
-<a name="l00207"></a>00207 <span class="keyword">typedef</span> do_iteration_task_iter<Iterator, Body, Item> iteration_type;
-<a name="l00208"></a>00208 __TBB_ASSERT( my_size>0, NULL );
-<a name="l00209"></a>00209 task_list list;
-<a name="l00210"></a>00210 task* t;
-<a name="l00211"></a>00211 size_t k=0;
-<a name="l00212"></a>00212 <span class="keywordflow">for</span>(;;) {
-<a name="l00213"></a>00213 t = <span class="keyword">new</span>( allocate_child() ) iteration_type( my_first, my_feeder );
-<a name="l00214"></a>00214 ++my_first;
-<a name="l00215"></a>00215 <span class="keywordflow">if</span>( ++k==my_size ) <span class="keywordflow">break</span>;
-<a name="l00216"></a>00216 list.push_back(*t);
-<a name="l00217"></a>00217 }
-<a name="l00218"></a>00218 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00219"></a>00219 spawn(list);
-<a name="l00220"></a>00220 spawn_and_wait_for_all(*t);
-<a name="l00221"></a>00221 <span class="keywordflow">return</span> NULL;
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> _Item> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
-<a name="l00225"></a>00225 }; <span class="comment">// class do_group_task_forward</span>
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00228"></a>00228 <span class="keyword">class </span>do_group_task_input: <span class="keyword">public</span> task
-<a name="l00229"></a>00229 {
-<a name="l00230"></a>00230 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 feeder_type& my_feeder;
-<a name="l00235"></a>00235 size_t my_size;
-<a name="l00236"></a>00236 aligned_space<Item, max_arg_size> my_arg;
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 do_group_task_input( feeder_type& feeder )
-<a name="l00239"></a>00239 : my_feeder(feeder), my_size(0)
-<a name="l00240"></a>00240 {}
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242 <span class="comment">/*override*/</span> task* execute()
-<a name="l00243"></a>00243 {
-<a name="l00244"></a>00244 <span class="keyword">typedef</span> do_iteration_task_iter<Item*, Body, Item> iteration_type;
-<a name="l00245"></a>00245 __TBB_ASSERT( my_size>0, NULL );
-<a name="l00246"></a>00246 task_list list;
-<a name="l00247"></a>00247 task* t;
-<a name="l00248"></a>00248 size_t k=0;
-<a name="l00249"></a>00249 <span class="keywordflow">for</span>(;;) {
-<a name="l00250"></a>00250 t = <span class="keyword">new</span>( allocate_child() ) iteration_type( my_arg.begin() + k, my_feeder );
-<a name="l00251"></a>00251 <span class="keywordflow">if</span>( ++k==my_size ) <span class="keywordflow">break</span>;
-<a name="l00252"></a>00252 list.push_back(*t);
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00255"></a>00255 spawn(list);
-<a name="l00256"></a>00256 spawn_and_wait_for_all(*t);
-<a name="l00257"></a>00257 <span class="keywordflow">return</span> NULL;
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 ~do_group_task_input(){
-<a name="l00261"></a>00261 <span class="keywordflow">for</span>( size_t k=0; k<my_size; ++k)
-<a name="l00262"></a>00262 (my_arg.begin() + k)->~Item();
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
-<a name="l00266"></a>00266 }; <span class="comment">// class do_group_task_input</span>
-<a name="l00267"></a>00267
-<a name="l00269"></a>00269
-<a name="l00271"></a>00271 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00272"></a>00272 <span class="keyword">class </span>do_task_iter: <span class="keyword">public</span> task
-<a name="l00273"></a>00273 {
-<a name="l00274"></a>00274 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276 <span class="keyword">public</span>:
-<a name="l00277"></a>00277 do_task_iter( Iterator first, Iterator last , feeder_type& feeder ) :
-<a name="l00278"></a>00278 my_first(first), my_last(last), my_feeder(feeder)
-<a name="l00279"></a>00279 {}
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">private</span>:
-<a name="l00282"></a>00282 Iterator my_first;
-<a name="l00283"></a>00283 Iterator my_last;
-<a name="l00284"></a>00284 feeder_type& my_feeder;
-<a name="l00285"></a>00285
-<a name="l00286"></a>00286 <span class="comment">/* Do not merge run(xxx) and run_xxx() methods. They are separated in order</span>
-<a name="l00287"></a>00287 <span class="comment"> to make sure that compilers will eliminate unused argument of type xxx</span>
-<a name="l00288"></a>00288 <span class="comment"> (that is will not put it on stack). The sole purpose of this argument </span>
-<a name="l00289"></a>00289 <span class="comment"> is overload resolution.</span>
-<a name="l00290"></a>00290 <span class="comment"> </span>
-<a name="l00291"></a>00291 <span class="comment"> An alternative could be using template functions, but explicit specialization </span>
-<a name="l00292"></a>00292 <span class="comment"> of member function templates is not supported for non specialized class </span>
-<a name="l00293"></a>00293 <span class="comment"> templates. Besides template functions would always fall back to the least </span>
-<a name="l00294"></a>00294 <span class="comment"> efficient variant (the one for input iterators) in case of iterators having </span>
-<a name="l00295"></a>00295 <span class="comment"> custom tags derived from basic ones. */</span>
-<a name="l00296"></a>00296 <span class="comment">/*override*/</span> task* execute()
-<a name="l00297"></a>00297 {
-<a name="l00298"></a>00298 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::iterator_traits<Iterator>::iterator_category iterator_tag;
-<a name="l00299"></a>00299 <span class="keywordflow">return</span> run( (iterator_tag*)NULL );
-<a name="l00300"></a>00300 }
-<a name="l00301"></a>00301
-<a name="l00304"></a>00304 <span class="keyword">inline</span> task* run( <span class="keywordtype">void</span>* ) { <span class="keywordflow">return</span> run_for_input_iterator(); }
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 task* run_for_input_iterator() {
-<a name="l00307"></a>00307 <span class="keyword">typedef</span> do_group_task_input<Body, Item> block_type;
-<a name="l00308"></a>00308
-<a name="l00309"></a>00309 block_type& t = *<span class="keyword">new</span>( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(my_feeder);
-<a name="l00310"></a>00310 size_t k=0;
-<a name="l00311"></a>00311 <span class="keywordflow">while</span>( !(my_first == my_last) ) {
-<a name="l00312"></a>00312 <span class="keyword">new</span> (t.my_arg.begin() + k) Item(*my_first);
-<a name="l00313"></a>00313 ++my_first;
-<a name="l00314"></a>00314 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
-<a name="l00315"></a>00315 <span class="keywordflow">if</span> ( !(my_first == my_last) )
-<a name="l00316"></a>00316 recycle_to_reexecute();
-<a name="l00317"></a>00317 <span class="keywordflow">break</span>;
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320 <span class="keywordflow">if</span>( k==0 ) {
-<a name="l00321"></a>00321 destroy(t);
-<a name="l00322"></a>00322 <span class="keywordflow">return</span> NULL;
-<a name="l00323"></a>00323 } <span class="keywordflow">else</span> {
-<a name="l00324"></a>00324 t.my_size = k;
-<a name="l00325"></a>00325 <span class="keywordflow">return</span> &t;
-<a name="l00326"></a>00326 }
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <span class="keyword">inline</span> task* run( std::forward_iterator_tag* ) { <span class="keywordflow">return</span> run_for_forward_iterator(); }
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 task* run_for_forward_iterator() {
-<a name="l00332"></a>00332 <span class="keyword">typedef</span> do_group_task_forward<Iterator, Body, Item> block_type;
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 Iterator first = my_first;
-<a name="l00335"></a>00335 size_t k=0;
-<a name="l00336"></a>00336 <span class="keywordflow">while</span>( !(my_first==my_last) ) {
-<a name="l00337"></a>00337 ++my_first;
-<a name="l00338"></a>00338 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
-<a name="l00339"></a>00339 <span class="keywordflow">if</span> ( !(my_first==my_last) )
-<a name="l00340"></a>00340 recycle_to_reexecute();
-<a name="l00341"></a>00341 <span class="keywordflow">break</span>;
-<a name="l00342"></a>00342 }
-<a name="l00343"></a>00343 }
-<a name="l00344"></a>00344 <span class="keywordflow">return</span> k==0 ? NULL : <span class="keyword">new</span>( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(first, k, my_feeder);
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 <span class="keyword">inline</span> task* run( std::random_access_iterator_tag* ) { <span class="keywordflow">return</span> run_for_random_access_iterator(); }
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 task* run_for_random_access_iterator() {
-<a name="l00350"></a>00350 <span class="keyword">typedef</span> do_group_task_forward<Iterator, Body, Item> block_type;
-<a name="l00351"></a>00351 <span class="keyword">typedef</span> do_iteration_task_iter<Iterator, Body, Item> iteration_type;
-<a name="l00352"></a>00352
-<a name="l00353"></a>00353 size_t k = static_cast<size_t>(my_last-my_first);
-<a name="l00354"></a>00354 <span class="keywordflow">if</span>( k > block_type::max_arg_size ) {
-<a name="l00355"></a>00355 Iterator middle = my_first + k/2;
-<a name="l00356"></a>00356
-<a name="l00357"></a>00357 empty_task& c = *<span class="keyword">new</span>( allocate_continuation() ) empty_task;
-<a name="l00358"></a>00358 do_task_iter& b = *<span class="keyword">new</span>( c.allocate_child() ) do_task_iter(middle, my_last, my_feeder);
-<a name="l00359"></a>00359 recycle_as_child_of(c);
-<a name="l00360"></a>00360
-<a name="l00361"></a>00361 my_last = middle;
-<a name="l00362"></a>00362 c.set_ref_count(2);
-<a name="l00363"></a>00363 c.spawn(b);
-<a name="l00364"></a>00364 <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00365"></a>00365 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>( k != 0 ) {
-<a name="l00366"></a>00366 task_list list;
-<a name="l00367"></a>00367 task* t;
-<a name="l00368"></a>00368 size_t k1=0;
-<a name="l00369"></a>00369 <span class="keywordflow">for</span>(;;) {
-<a name="l00370"></a>00370 t = <span class="keyword">new</span>( allocate_child() ) iteration_type(my_first, my_feeder);
-<a name="l00371"></a>00371 ++my_first;
-<a name="l00372"></a>00372 <span class="keywordflow">if</span>( ++k1==k ) <span class="keywordflow">break</span>;
-<a name="l00373"></a>00373 list.push_back(*t);
-<a name="l00374"></a>00374 }
-<a name="l00375"></a>00375 set_ref_count(<span class="keywordtype">int</span>(k+1));
-<a name="l00376"></a>00376 spawn(list);
-<a name="l00377"></a>00377 spawn_and_wait_for_all(*t);
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379 <span class="keywordflow">return</span> NULL;
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381 }; <span class="comment">// class do_task_iter</span>
-<a name="l00382"></a>00382
-<a name="l00384"></a>00384
-<a name="l00386"></a>00386 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00387"></a>00387 <span class="keywordtype">void</span> run_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body
-<a name="l00388"></a>00388 #<span class="keywordflow">if</span> __TBB_EXCEPTIONS
-<a name="l00389"></a>00389 , task_group_context& context
-<a name="l00390"></a>00390 #endif
-<a name="l00391"></a>00391 )
-<a name="l00392"></a>00392 {
-<a name="l00393"></a>00393 <span class="keyword">typedef</span> do_task_iter<Iterator, Body, Item> root_iteration_task;
-<a name="l00394"></a>00394 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span> parallel_do_feeder_impl<Body, Item> feeder(context);
-<a name="l00396"></a>00396 <span class="preprocessor">#else</span>
-<a name="l00397"></a>00397 <span class="preprocessor"></span> parallel_do_feeder_impl<Body, Item> feeder;
-<a name="l00398"></a>00398 <span class="preprocessor">#endif</span>
-<a name="l00399"></a>00399 <span class="preprocessor"></span> feeder.my_body = &body;
-<a name="l00400"></a>00400
-<a name="l00401"></a>00401 root_iteration_task &t = *<span class="keyword">new</span>( feeder.my_barrier->allocate_child() ) root_iteration_task(first, last, feeder);
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403 feeder.my_barrier->set_ref_count(2);
-<a name="l00404"></a>00404 feeder.my_barrier->spawn_and_wait_for_all(t);
-<a name="l00405"></a>00405 }
-<a name="l00406"></a>00406
-<a name="l00408"></a>00408
-<a name="l00410"></a>00410 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
-<a name="l00411"></a>00411 <span class="keywordtype">void</span> select_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <span class="keywordtype">void</span> (Body::*)(Item) <span class="keyword">const</span>
-<a name="l00412"></a>00412 #<span class="keywordflow">if</span> __TBB_EXCEPTIONS
-<a name="l00413"></a>00413 , task_group_context& context
-<a name="l00414"></a>00414 #endif <span class="comment">// __TBB_EXCEPTIONS </span>
-<a name="l00415"></a>00415 )
-<a name="l00416"></a>00416 {
-<a name="l00417"></a>00417 run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
-<a name="l00418"></a>00418 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span> , context
-<a name="l00420"></a>00420 <span class="preprocessor">#endif // __TBB_EXCEPTIONS </span>
-<a name="l00421"></a>00421 <span class="preprocessor"></span> );
-<a name="l00422"></a>00422 }
-<a name="l00423"></a>00423
-<a name="l00425"></a>00425
-<a name="l00427"></a>00427 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item, <span class="keyword">typename</span> _Item>
-<a name="l00428"></a>00428 <span class="keywordtype">void</span> select_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <span class="keywordtype">void</span> (Body::*)(Item, parallel_do_feeder<_Item>&) <span class="keyword">const</span>
-<a name="l00429"></a>00429 #<span class="keywordflow">if</span> __TBB_EXCEPTIONS
-<a name="l00430"></a>00430 , task_group_context& context
-<a name="l00431"></a>00431 #endif <span class="comment">// __TBB_EXCEPTIONS</span>
-<a name="l00432"></a>00432 )
-<a name="l00433"></a>00433 {
-<a name="l00434"></a>00434 run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
-<a name="l00435"></a>00435 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span> , context
-<a name="l00437"></a>00437 <span class="preprocessor">#endif // __TBB_EXCEPTIONS</span>
-<a name="l00438"></a>00438 <span class="preprocessor"></span> );
-<a name="l00439"></a>00439 }
-<a name="l00440"></a>00440
-<a name="l00441"></a>00441 } <span class="comment">// namespace internal</span>
-<a name="l00443"></a>00443 <span class="comment"></span>
-<a name="l00444"></a>00444
-<a name="l00467"></a>00467
-<a name="l00468"></a>00468
-<a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body>
-<a name="l00470"></a><a class="code" href="a00241.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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_EXCEPTIONS</span>
-<a name="l00475"></a>00475 <span class="preprocessor"></span> <a class="code" href="a00175.html">task_group_context</a> context;
-<a name="l00476"></a>00476 <span class="preprocessor">#endif // __TBB_EXCEPTIONS</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_EXCEPTIONS
-<a name="l00479"></a>00479 , context
-<a name="l00480"></a>00480 #endif <span class="comment">// __TBB_EXCEPTIONS</span>
-<a name="l00481"></a>00481 );
-<a name="l00482"></a>00482 }
-<a name="l00483"></a>00483
-<a name="l00484"></a>00484 <span class="preprocessor">#if __TBB_EXCEPTIONS</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="a00241.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00241.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00175.html">task_group_context</a>& context )
-<a name="l00489"></a>00489 {
-<a name="l00490"></a>00490 <span class="keywordflow">if</span> ( first == last )
-<a name="l00491"></a>00491 <span class="keywordflow">return</span>;
-<a name="l00492"></a>00492 internal::select_parallel_do( first, last, body, &Body::operator(), context );
-<a name="l00493"></a>00493 }
-<a name="l00494"></a>00494 <span class="preprocessor">#endif // __TBB_EXCEPTIONS</span>
-<a name="l00495"></a>00495 <span class="preprocessor"></span>
-<a name="l00497"></a>00497
-<a name="l00498"></a>00498 } <span class="comment">// namespace </span>
-<a name="l00499"></a>00499
-<a name="l00500"></a>00500 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_do_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00274.html b/doc/html/a00319.html
similarity index 76%
copy from doc/html/a00274.html
copy to doc/html/a00319.html
index 038fe72..c268905 100644
--- a/doc/html/a00274.html
+++ b/doc/html/a00319.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="a00127.html">00040</a> <span class="keyword">class </span><a class="code" href="a00127.html">blocked_range</a> {
+<a name="l00040"></a><a class="code" href="a00148.html">00040</a> <span class="keyword">class </span><a class="code" href="a00148.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="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
+<a name="l00045"></a><a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
+<a name="l00048"></a><a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
<a name="l00049"></a>00049
<a name="l00051"></a>00051
-<a name="l00052"></a><a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
+<a name="l00052"></a><a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
<a name="l00053"></a>00053
-<a name="l00055"></a><a class="code" href="a00127.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) :
+<a name="l00055"></a><a class="code" href="a00148.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00148.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="a00127.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00127.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<a name="l00062"></a><a class="code" href="a00148.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00148.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="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
+<a name="l00065"></a><a class="code" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00148.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
+<a name="l00069"></a><a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
+<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00148.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="a00148.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="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
+<a name="l00075"></a><a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00148.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="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00127.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="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00148.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="a00127.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
+<a name="l00086"></a><a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
<a name="l00087"></a>00087
<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00127.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00127.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00127.html">blocked_range</a>& r, <a class="code" href="a00173.html">split</a> ) :
+<a name="l00091"></a><a class="code" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00148.html">blocked_range</a>& r, <a class="code" href="a00198.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
+<a name="l00101"></a>00101 <a class="code" href="a00148.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="a00127.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00127.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00127.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108 r.<a class="code" href="a00127.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
+<a name="l00105"></a>00105 <span class="keyword">static</span> Value do_split( <a class="code" href="a00148.html">blocked_range</a>& r ) {
+<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00148.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="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00148.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
+<a name="l00108"></a>00108 r.<a class="code" href="a00148.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
@@ -118,7 +118,7 @@
<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00275.html b/doc/html/a00320.html
similarity index 75%
copy from doc/html/a00275.html
copy to doc/html/a00320.html
index f748339..e98c6f3 100644
--- a/doc/html/a00275.html
+++ b/doc/html/a00320.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="a00128.html">00032</a> <span class="keyword">class </span><a class="code" href="a00128.html">blocked_range2d</a> {
+<a name="l00032"></a><a class="code" href="a00149.html">00032</a> <span class="keyword">class </span><a class="code" href="a00149.html">blocked_range2d</a> {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00128.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<RowValue></a> <a class="code" href="a00127.html">row_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<ColValue></a> <a class="code" href="a00127.html">col_range_type</a>;
+<a name="l00035"></a><a class="code" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<RowValue></a> <a class="code" href="a00148.html">row_range_type</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<ColValue></a> <a class="code" href="a00148.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="a00127.html">row_range_type</a> my_rows;
-<a name="l00040"></a>00040 <a class="code" href="a00127.html">col_range_type</a> my_cols;
+<a name="l00039"></a>00039 <a class="code" href="a00148.html">row_range_type</a> my_rows;
+<a name="l00040"></a>00040 <a class="code" href="a00148.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="a00128.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
+<a name="l00044"></a>00044 <a class="code" href="a00149.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00148.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="a00148.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="a00128.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
+<a name="l00051"></a>00051 <a class="code" href="a00149.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="a00128.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00128.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
+<a name="l00059"></a><a class="code" href="a00149.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00149.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="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00061"></a>00061 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
<a name="l00062"></a>00062 }
<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00128.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00128.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="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00065"></a><a class="code" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00149.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="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
<a name="l00067"></a>00067 }
<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <a class="code" href="a00128.html">blocked_range2d</a>( <a class="code" href="a00128.html">blocked_range2d</a>& r, <a class="code" href="a00173.html">split</a> ) :
+<a name="l00069"></a>00069 <a class="code" href="a00149.html">blocked_range2d</a>( <a class="code" href="a00149.html">blocked_range2d</a>& r, <a class="code" href="a00198.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00074"></a>00074 my_cols.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00128.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
+<a name="l00073"></a>00073 <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00074"></a>00074 my_cols.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00149.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00128.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
+<a name="l00076"></a>00076 my_rows.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00149.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="a00128.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00127.html">row_range_type</a>& <a class="code" href="a00128.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00081"></a><a class="code" href="a00149.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00148.html">row_range_type</a>& <a class="code" href="a00149.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="a00128.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00127.html">col_range_type</a>& <a class="code" href="a00128.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00084"></a><a class="code" href="a00149.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00148.html">col_range_type</a>& <a class="code" href="a00149.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>
@@ -104,7 +104,7 @@
<a name="l00089"></a>00089 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range2d_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00276.html b/doc/html/a00321.html
similarity index 71%
copy from doc/html/a00276.html
copy to doc/html/a00321.html
index e92f908..a3e9607 100644
--- a/doc/html/a00276.html
+++ b/doc/html/a00321.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="a00129.html">00032</a> <span class="keyword">class </span><a class="code" href="a00129.html">blocked_range3d</a> {
+<a name="l00032"></a><a class="code" href="a00150.html">00032</a> <span class="keyword">class </span><a class="code" href="a00150.html">blocked_range3d</a> {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00129.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<PageValue></a> <a class="code" href="a00127.html">page_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<RowValue></a> <a class="code" href="a00127.html">row_range_type</a>;
-<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00127.html">blocked_range<ColValue></a> <a class="code" href="a00127.html">col_range_type</a>;
+<a name="l00035"></a><a class="code" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<PageValue></a> <a class="code" href="a00148.html">page_range_type</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<RowValue></a> <a class="code" href="a00148.html">row_range_type</a>;
+<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<ColValue></a> <a class="code" href="a00148.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="a00127.html">page_range_type</a> my_pages;
-<a name="l00041"></a>00041 <a class="code" href="a00127.html">row_range_type</a> my_rows;
-<a name="l00042"></a>00042 <a class="code" href="a00127.html">col_range_type</a> my_cols;
+<a name="l00040"></a>00040 <a class="code" href="a00148.html">page_range_type</a> my_pages;
+<a name="l00041"></a>00041 <a class="code" href="a00148.html">row_range_type</a> my_rows;
+<a name="l00042"></a>00042 <a class="code" href="a00148.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="a00129.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
+<a name="l00046"></a>00046 <a class="code" href="a00150.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="a00129.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00127.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="a00127.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="a00127.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
+<a name="l00055"></a>00055 <a class="code" href="a00150.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00148.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="a00148.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="a00148.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="a00129.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00129.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
+<a name="l00065"></a><a class="code" href="a00150.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00150.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="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00127.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00067"></a>00067 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
<a name="l00068"></a>00068 }
<a name="l00069"></a>00069
-<a name="l00071"></a><a class="code" href="a00129.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00129.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="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00127.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00071"></a><a class="code" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00150.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="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
<a name="l00073"></a>00073 }
<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <a class="code" href="a00129.html">blocked_range3d</a>( <a class="code" href="a00129.html">blocked_range3d</a>& r, <a class="code" href="a00173.html">split</a> ) :
+<a name="l00075"></a>00075 <a class="code" href="a00150.html">blocked_range3d</a>( <a class="code" href="a00150.html">blocked_range3d</a>& r, <a class="code" href="a00198.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00082"></a>00082 my_cols.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00129.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00080"></a>00080 <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00082"></a>00082 my_cols.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00150.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00129.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
+<a name="l00084"></a>00084 my_rows.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00150.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="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00127.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00088"></a>00088 my_cols.<a class="code" href="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00129.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00087"></a>00087 <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00088"></a>00088 my_cols.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00150.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="a00127.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00129.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
+<a name="l00090"></a>00090 my_pages.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00150.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="a00129.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00127.html">page_range_type</a>& <a class="code" href="a00129.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
+<a name="l00096"></a><a class="code" href="a00150.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00148.html">page_range_type</a>& <a class="code" href="a00150.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="a00129.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00127.html">row_range_type</a>& <a class="code" href="a00129.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00099"></a><a class="code" href="a00150.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00148.html">row_range_type</a>& <a class="code" href="a00150.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="a00129.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00127.html">col_range_type</a>& <a class="code" href="a00129.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00102"></a><a class="code" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00148.html">col_range_type</a>& <a class="code" href="a00150.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
@@ -122,7 +122,7 @@
<a name="l00108"></a>00108 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range3d_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00277.html b/doc/html/a00322.html
similarity index 87%
copy from doc/html/a00277.html
copy to doc/html/a00322.html
index b288d44..a2e2d81 100644
--- a/doc/html/a00277.html
+++ b/doc/html/a00322.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="a00130.html">00057</a> <span class="keyword">class </span><a class="code" href="a00130.html">cache_aligned_allocator</a> {
+<a name="l00057"></a><a class="code" href="a00151.html">00057</a> <span class="keyword">class </span><a class="code" href="a00151.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="a00130.html">cache_aligned_allocator<U></a> other;
+<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="a00151.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="a00130.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00071"></a>00071 <a class="code" href="a00130.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00130.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="a00130.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00130.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00070"></a>00070 <a class="code" href="a00151.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00071"></a>00071 <a class="code" href="a00151.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00151.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="a00151.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00151.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="a00130.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00130.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="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00151.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="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
+<a name="l00084"></a><a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00151.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="a00130.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00130.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
+<a name="l00089"></a><a class="code" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00151.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="a00130.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00130.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="a00151.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00151.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="a00130.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00130.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00097"></a><a class="code" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00151.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="a00131.html">00107</a> <span class="keyword">class </span><a class="code" href="a00130.html">cache_aligned_allocator</a><void> {
+<a name="l00107"></a><a class="code" href="a00152.html">00107</a> <span class="keyword">class </span><a class="code" href="a00151.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="a00130.html">cache_aligned_allocator<U></a> other;
+<a name="l00113"></a>00113 <span class="keyword">typedef</span> <a class="code" href="a00151.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="a00130.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00130.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="a00151.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00151.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>;}
@@ -131,7 +131,7 @@
<a name="l00125"></a>00125 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_cache_aligned_allocator_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00279.html b/doc/html/a00324.html
similarity index 71%
copy from doc/html/a00279.html
copy to doc/html/a00324.html
index 2ce886a..55ca02b 100644
--- a/doc/html/a00279.html
+++ b/doc/html/a00324.html
@@ -42,52 +42,54 @@
<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_combinable_H</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_combinable_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb/enumerable_thread_specific.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb/cache_aligned_allocator.h"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
<a name="l00031"></a>00031
<a name="l00032"></a>00032
<a name="l00033"></a>00033 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00034"></a><a class="code" href="a00133.html">00034</a> <span class="keyword">class </span><a class="code" href="a00133.html">combinable</a> {
+<a name="l00034"></a><a class="code" href="a00154.html">00034</a> <span class="keyword">class </span><a class="code" href="a00154.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="a00130.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00130.html">my_alloc</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00151.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00151.html">my_alloc</a>;
<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00143.html">tbb::enumerable_thread_specific<T, my_alloc, ets_no_key></a> <a class="code" href="a00143.html">my_ets_type</a>;
-<a name="l00039"></a>00039 <a class="code" href="a00143.html">my_ets_type</a> my_ets;
+<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="a00133.html">combinable</a>() { }
+<a name="l00043"></a>00043 <a class="code" href="a00154.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="a00133.html">combinable</a>( finit _finit) : my_ets(_finit) { }
+<a name="l00046"></a>00046 <a class="code" href="a00154.html">combinable</a>( finit _finit) : my_ets(_finit) { }
<a name="l00047"></a>00047
-<a name="l00049"></a><a class="code" href="a00133.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00133.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
+<a name="l00049"></a><a class="code" href="a00154.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00154.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
<a name="l00050"></a>00050 }
<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <a class="code" href="a00133.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00133.html">combinable</a>& other) : my_ets(other.my_ets) { }
+<a name="l00052"></a>00052 <a class="code" href="a00154.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00154.html">combinable</a>& other) : my_ets(other.my_ets) { }
<a name="l00053"></a>00053
<a name="l00054"></a>00054 combinable & operator=( <span class="keyword">const</span> combinable & other) { my_ets = other.my_ets; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> clear() { my_ets.<a class="code" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">clear</a>(); }
+<a name="l00056"></a>00056 <span class="keywordtype">void</span> clear() { my_ets.clear(); }
<a name="l00057"></a>00057
-<a name="l00058"></a>00058 T& local() { <span class="keywordflow">return</span> my_ets.<a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>(); }
+<a name="l00058"></a>00058 T& local() { <span class="keywordflow">return</span> my_ets.local(); }
<a name="l00059"></a>00059
-<a name="l00060"></a>00060 T& local(<span class="keywordtype">bool</span> & exists) { <span class="keywordflow">return</span> my_ets.<a class="code" href="a00143.html#ceb691814a0001241c43595d309cf615">local</a>(exists); }
+<a name="l00060"></a>00060 T& local(<span class="keywordtype">bool</span> & exists) { <span class="keywordflow">return</span> my_ets.local(exists); }
<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">template</span>< <span class="keyword">typename</span> FCombine>
-<a name="l00063"></a>00063 T combine(FCombine fcombine) { <span class="keywordflow">return</span> my_ets.<a class="code" href="a00143.html#dd6b27d9c98297220b08732d9087a5a8">combine</a>(fcombine); }
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> FCombine>
-<a name="l00066"></a>00066 <span class="keywordtype">void</span> combine_each(FCombine fcombine) { my_ets.<a class="code" href="a00143.html#4abce9638ef2693d813d820af59bb6e2">combine_each</a>(fcombine); }
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 };
-<a name="l00069"></a>00069 } <span class="comment">// namespace tbb</span>
-<a name="l00070"></a>00070 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_combinable_H */</span>
+<a name="l00062"></a>00062 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
+<a name="l00063"></a>00063 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00064"></a>00064 T combine(combine_func_t f_combine) { <span class="keywordflow">return</span> my_ets.combine(f_combine); }
+<a name="l00065"></a>00065
+<a name="l00066"></a>00066 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
+<a name="l00067"></a>00067 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00068"></a>00068 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }
+<a name="l00069"></a>00069
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071 } <span class="comment">// namespace tbb</span>
+<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_combinable_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00325.html b/doc/html/a00325.html
new file mode 100644
index 0000000..54a4fed
--- /dev/null
+++ b/doc/html/a00325.html
@@ -0,0 +1,1253 @@
+<!DOCTYPE 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-2010 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 "_concurrent_unordered_internal.h"</span> <span class="comment">// Need tbb_hasher</span>
+<a name="l00047"></a>00047 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#include <typeinfo></span>
+<a name="l00049"></a>00049 <span class="preprocessor">#endif</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span>
+<a name="l00051"></a>00051 <span class="keyword">namespace </span>tbb {
+<a name="l00052"></a>00052
+<a name="l00054"></a>00054 <span class="keyword">namespace </span>internal {
+<a name="l00056"></a>00056 <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="l00058"></a>00058 <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="l00060"></a>00060 <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="l00061"></a>00061 }
+<a name="l00063"></a>00063
+<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
+<a name="l00066"></a><a class="code" href="a00208.html">00066</a> <span class="keyword">struct </span><a class="code" href="a00208.html">tbb_hash_compare</a> {
+<a name="l00067"></a>00067 <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="l00068"></a>00068 <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="l00069"></a>00069 };
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071 <span class="keyword">namespace </span>interface4 {
+<a name="l00072"></a>00072
+<a name="l00073"></a>00073 <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="l00074"></a>00074 <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a>;
+<a name="l00075"></a>00075
+<a name="l00077"></a>00077 <span class="keyword">namespace </span>internal {
+<a name="l00078"></a>00078
+<a name="l00079"></a>00079
+<a name="l00081"></a>00081 <span class="keyword">typedef</span> size_t hashcode_t;
+<a name="l00083"></a>00083 <span class="keyword">struct </span>hash_map_node_base : tbb::internal::no_copy {
+<a name="l00085"></a>00085 <span class="keyword">typedef</span> <a class="code" href="a00196.html">spin_rw_mutex</a> mutex_t;
+<a name="l00087"></a>00087 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
+<a name="l00089"></a>00089 hash_map_node_base *next;
+<a name="l00090"></a>00090 mutex_t <a class="code" href="a00172.html">mutex</a>;
+<a name="l00091"></a>00091 };
+<a name="l00093"></a>00093 <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="l00095"></a>00095 <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="l00097"></a>00097 <span class="keyword">class </span>hash_map_base {
+<a name="l00098"></a>00098 <span class="keyword">public</span>:
+<a name="l00100"></a>00100 <span class="keyword">typedef</span> size_t size_type;
+<a name="l00102"></a>00102 <span class="keyword">typedef</span> size_t hashcode_t;
+<a name="l00104"></a>00104 <span class="keyword">typedef</span> size_t segment_index_t;
+<a name="l00106"></a>00106 <span class="keyword">typedef</span> hash_map_node_base node_base;
+<a name="l00108"></a>00108 <span class="keyword">struct </span>bucket : tbb::internal::no_copy {
+<a name="l00110"></a>00110 <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
+<a name="l00112"></a>00112 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
+<a name="l00113"></a>00113 mutex_t mutex;
+<a name="l00114"></a>00114 node_base *node_list;
+<a name="l00115"></a>00115 };
+<a name="l00117"></a>00117 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_block = 1;
+<a name="l00119"></a>00119 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_buckets = 1<<embedded_block;
+<a name="l00121"></a>00121 <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="l00123"></a>00123 <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="l00125"></a>00125 <span class="comment"></span> <span class="keyword">typedef</span> bucket *segment_ptr_t;
+<a name="l00127"></a>00127 <span class="keyword">typedef</span> segment_ptr_t segments_table_t[pointers_per_table];
+<a name="l00129"></a>00129 atomic<hashcode_t> my_mask;
+<a name="l00131"></a>00131 segments_table_t my_table;
+<a name="l00133"></a>00133 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="l00135"></a>00135 <span class="comment"></span> bucket my_embedded_segment[embedded_buckets];
+<a name="l00136"></a>00136
+<a name="l00138"></a>00138 hash_map_base() {
+<a name="l00139"></a>00139 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="l00140"></a>00140 + <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="l00141"></a>00141 + embedded_buckets*<span class="keyword">sizeof</span>(bucket) ); <span class="comment">// n*8 or n*16</span>
+<a name="l00142"></a>00142 <span class="keywordflow">for</span>( size_type i = 0; i < embedded_block; i++ ) <span class="comment">// fill the table</span>
+<a name="l00143"></a>00143 my_table[i] = my_embedded_segment + segment_base(i);
+<a name="l00144"></a>00144 my_mask = embedded_buckets - 1;
+<a name="l00145"></a>00145 __TBB_ASSERT( embedded_block <= first_block, <span class="stringliteral">"The first block number must include embedded blocks"</span>);
+<a name="l00146"></a>00146 }
+<a name="l00147"></a>00147
+<a name="l00149"></a>00149 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
+<a name="l00150"></a>00150 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
+<a name="l00151"></a>00151 }
+<a name="l00152"></a>00152
+<a name="l00154"></a>00154 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
+<a name="l00155"></a>00155 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
+<a name="l00156"></a>00156 }
+<a name="l00157"></a>00157
+<a name="l00159"></a>00159 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
+<a name="l00160"></a>00160 <span class="keywordflow">return</span> size_type(1)<<k; <span class="comment">// fake value for k==0</span>
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162
+<a name="l00164"></a>00164 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_valid( <span class="keywordtype">void</span> *ptr ) {
+<a name="l00165"></a>00165 <span class="keywordflow">return</span> reinterpret_cast<size_t>(ptr) > size_t(63);
+<a name="l00166"></a>00166 }
+<a name="l00167"></a>00167
+<a name="l00169"></a>00169 <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="l00170"></a>00170 <span class="keywordflow">if</span>( is_initial ) std::memset(ptr, 0, sz*<span class="keyword">sizeof</span>(bucket) );
+<a name="l00171"></a>00171 <span class="keywordflow">else</span> <span class="keywordflow">for</span>(size_type i = 0; i < sz; i++, ptr++) {
+<a name="l00172"></a>00172 *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
+<a name="l00173"></a>00173 ptr->node_list = rehash_req;
+<a name="l00174"></a>00174 }
+<a name="l00175"></a>00175 }
+<a name="l00176"></a>00176
+<a name="l00178"></a>00178 <span class="keyword">static</span> <span class="keywordtype">void</span> add_to_bucket( bucket *b, node_base *n ) {
+<a name="l00179"></a>00179 __TBB_ASSERT(b->node_list != rehash_req, NULL);
+<a name="l00180"></a>00180 n->next = b->node_list;
+<a name="l00181"></a>00181 b->node_list = n; <span class="comment">// its under lock and flag is set</span>
+<a name="l00182"></a>00182 }
+<a name="l00183"></a>00183
+<a name="l00185"></a>00185 <span class="keyword">struct </span>enable_segment_failsafe {
+<a name="l00186"></a>00186 segment_ptr_t *my_segment_ptr;
+<a name="l00187"></a>00187 enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
+<a name="l00188"></a>00188 ~enable_segment_failsafe() {
+<a name="l00189"></a>00189 <span class="keywordflow">if</span>( my_segment_ptr ) *my_segment_ptr = 0; <span class="comment">// indicate no allocation in progress</span>
+<a name="l00190"></a>00190 }
+<a name="l00191"></a>00191 };
+<a name="l00192"></a>00192
+<a name="l00194"></a>00194 <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="l00195"></a>00195 __TBB_ASSERT( k, <span class="stringliteral">"Zero segment must be embedded"</span> );
+<a name="l00196"></a>00196 enable_segment_failsafe watchdog( my_table, k );
+<a name="l00197"></a>00197 cache_aligned_allocator<bucket> alloc;
+<a name="l00198"></a>00198 size_type sz;
+<a name="l00199"></a>00199 __TBB_ASSERT( !is_valid(my_table[k]), <span class="stringliteral">"Wrong concurrent assignment"</span>);
+<a name="l00200"></a>00200 <span class="keywordflow">if</span>( k >= first_block ) {
+<a name="l00201"></a>00201 sz = segment_size( k );
+<a name="l00202"></a>00202 segment_ptr_t ptr = alloc.allocate( sz );
+<a name="l00203"></a>00203 init_buckets( ptr, sz, is_initial );
+<a name="l00204"></a>00204 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span> <span class="comment">// TODO: actually, fence and notification are unnecessary here and below</span>
+<a name="l00206"></a>00206 itt_store_pointer_with_release_v3( my_table + k, ptr );
+<a name="l00207"></a>00207 <span class="preprocessor">#else</span>
+<a name="l00208"></a>00208 <span class="preprocessor"></span> my_table[k] = ptr;<span class="comment">// my_mask has release fence</span>
+<a name="l00209"></a>00209 <span class="preprocessor">#endif</span>
+<a name="l00210"></a>00210 <span class="preprocessor"></span> sz <<= 1;<span class="comment">// double it to get entire capacity of the container</span>
+<a name="l00211"></a>00211 } <span class="keywordflow">else</span> { <span class="comment">// the first block</span>
+<a name="l00212"></a>00212 __TBB_ASSERT( k == embedded_block, <span class="stringliteral">"Wrong segment index"</span> );
+<a name="l00213"></a>00213 sz = segment_size( first_block );
+<a name="l00214"></a>00214 segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
+<a name="l00215"></a>00215 init_buckets( ptr, sz - embedded_buckets, is_initial );
+<a name="l00216"></a>00216 ptr -= segment_base(embedded_block);
+<a name="l00217"></a>00217 <span class="keywordflow">for</span>(segment_index_t i = embedded_block; i < first_block; i++) <span class="comment">// calc the offsets</span>
+<a name="l00218"></a>00218 #<span class="keywordflow">if</span> TBB_USE_THREADING_TOOLS
+<a name="l00219"></a>00219 itt_store_pointer_with_release_v3( my_table + i, ptr + segment_base(i) );
+<a name="l00220"></a>00220 <span class="preprocessor">#else</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span> my_table[i] = ptr + segment_base(i);
+<a name="l00222"></a>00222 <span class="preprocessor">#endif</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span> }
+<a name="l00224"></a>00224 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00225"></a>00225 <span class="preprocessor"></span> itt_store_pointer_with_release_v3( &my_mask, (<span class="keywordtype">void</span>*)(sz-1) );
+<a name="l00226"></a>00226 <span class="preprocessor">#else</span>
+<a name="l00227"></a>00227 <span class="preprocessor"></span> my_mask = sz - 1;
+<a name="l00228"></a>00228 <span class="preprocessor">#endif</span>
+<a name="l00229"></a>00229 <span class="preprocessor"></span> watchdog.my_segment_ptr = 0;
+<a name="l00230"></a>00230 }
+<a name="l00231"></a>00231
+<a name="l00233"></a>00233 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="l00234"></a>00234 segment_index_t s = segment_index_of( h );
+<a name="l00235"></a>00235 h -= segment_base(s);
+<a name="l00236"></a>00236 segment_ptr_t seg = my_table[s];
+<a name="l00237"></a>00237 __TBB_ASSERT( is_valid(seg), <span class="stringliteral">"hashcode must be cut by valid mask for allocated segments"</span> );
+<a name="l00238"></a>00238 <span class="keywordflow">return</span> &seg[h];
+<a name="l00239"></a>00239 }
+<a name="l00240"></a>00240
+<a name="l00241"></a>00241 <span class="comment">// internal serial rehashing helper</span>
+<a name="l00242"></a>00242 <span class="keywordtype">void</span> mark_rehashed_levels( hashcode_t h ) <span class="keywordflow">throw</span> () {
+<a name="l00243"></a>00243 segment_index_t s = segment_index_of( h );
+<a name="l00244"></a>00244 <span class="keywordflow">while</span>( segment_ptr_t seg = my_table[++s] )
+<a name="l00245"></a>00245 <span class="keywordflow">if</span>( seg[h].node_list == rehash_req ) {
+<a name="l00246"></a>00246 seg[h].node_list = empty_rehashed;
+<a name="l00247"></a>00247 mark_rehashed_levels( h + segment_base(s) );
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249 }
+<a name="l00250"></a>00250
+<a name="l00252"></a>00252 <span class="comment">// Splitting into two functions should help inlining</span>
+<a name="l00253"></a>00253 <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="l00254"></a>00254 hashcode_t m_now, m_old = m;
+<a name="l00255"></a>00255 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span> m_now = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+<a name="l00257"></a>00257 <span class="preprocessor">#else</span>
+<a name="l00258"></a>00258 <span class="preprocessor"></span> m_now = my_mask;
+<a name="l00259"></a>00259 <span class="preprocessor">#endif</span>
+<a name="l00260"></a>00260 <span class="preprocessor"></span> <span class="keywordflow">if</span>( m_old != m_now )
+<a name="l00261"></a>00261 <span class="keywordflow">return</span> check_rehashing_collision( h, m_old, m = m_now );
+<a name="l00262"></a>00262 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00263"></a>00263 }
+<a name="l00264"></a>00264
+<a name="l00266"></a>00266 <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="l00267"></a>00267 __TBB_ASSERT(m_old != m, NULL); <span class="comment">// TODO?: m arg could be optimized out by passing h = h&m</span>
+<a name="l00268"></a>00268 <span class="keywordflow">if</span>( (h & m_old) != (h & m) ) { <span class="comment">// mask changed for this hashcode, rare event</span>
+<a name="l00269"></a>00269 <span class="comment">// condition above proves that 'h' has some other bits set beside 'm_old'</span>
+<a name="l00270"></a>00270 <span class="comment">// find next applicable mask after m_old //TODO: look at bsl instruction</span>
+<a name="l00271"></a>00271 <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="l00272"></a>00272 ;
+<a name="l00273"></a>00273 m_old = (m_old<<1) - 1; <span class="comment">// get full mask from a bit</span>
+<a name="l00274"></a>00274 __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
+<a name="l00275"></a>00275 <span class="comment">// check whether it is rehashing/ed</span>
+<a name="l00276"></a>00276 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00277"></a>00277 <span class="preprocessor"></span> <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&( get_bucket(h & m_old)->node_list )) != rehash_req )
+<a name="l00278"></a>00278 <span class="preprocessor">#else</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span> <span class="keywordflow">if</span>( __TBB_load_with_acquire(get_bucket( h & m_old )->node_list) != rehash_req )
+<a name="l00280"></a>00280 <span class="preprocessor">#endif</span>
+<a name="l00281"></a>00281 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00282"></a>00282 }
+<a name="l00283"></a>00283 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00284"></a>00284 }
+<a name="l00285"></a>00285
+<a name="l00287"></a>00287 segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {
+<a name="l00288"></a>00288 size_type sz = ++my_size; <span class="comment">// prefix form is to enforce allocation after the first item inserted</span>
+<a name="l00289"></a>00289 add_to_bucket( b, n );
+<a name="l00290"></a>00290 <span class="comment">// check load factor</span>
+<a name="l00291"></a>00291 <span class="keywordflow">if</span>( sz >= mask ) { <span class="comment">// TODO: add custom load_factor </span>
+<a name="l00292"></a>00292 segment_index_t new_seg = segment_index_of( mask+1 );
+<a name="l00293"></a>00293 __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="l00294"></a>00294 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00295"></a>00295 <span class="preprocessor"></span> <span class="keywordflow">if</span>( !itt_load_pointer_v3(my_table+new_seg)
+<a name="l00296"></a>00296 #<span class="keywordflow">else</span>
+<a name="l00297"></a>00297 <span class="keywordflow">if</span>( !my_table[new_seg]
+<a name="l00298"></a>00298 #endif
+<a name="l00299"></a>00299 && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
+<a name="l00300"></a>00300 <span class="keywordflow">return</span> new_seg; <span class="comment">// The value must be processed</span>
+<a name="l00301"></a>00301 }
+<a name="l00302"></a>00302 <span class="keywordflow">return</span> 0;
+<a name="l00303"></a>00303 }
+<a name="l00304"></a>00304
+<a name="l00306"></a>00306 <span class="keywordtype">void</span> reserve(size_type buckets) {
+<a name="l00307"></a>00307 <span class="keywordflow">if</span>( !buckets-- ) <span class="keywordflow">return</span>;
+<a name="l00308"></a>00308 <span class="keywordtype">bool</span> is_initial = !my_size;
+<a name="l00309"></a>00309 <span class="keywordflow">for</span>( size_type m = my_mask; buckets > m; m = my_mask )
+<a name="l00310"></a>00310 enable_segment( segment_index_of( m+1 ), is_initial );
+<a name="l00311"></a>00311 }
+<a name="l00313"></a>00313 <span class="keywordtype">void</span> internal_swap(hash_map_base &table) {
+<a name="l00314"></a>00314 std::swap(this->my_mask, table.my_mask);
+<a name="l00315"></a>00315 std::swap(this->my_size, table.my_size);
+<a name="l00316"></a>00316 <span class="keywordflow">for</span>(size_type i = 0; i < embedded_buckets; i++)
+<a name="l00317"></a>00317 std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
+<a name="l00318"></a>00318 <span class="keywordflow">for</span>(size_type i = embedded_block; i < pointers_per_table; i++)
+<a name="l00319"></a>00319 std::swap(this->my_table[i], table.my_table[i]);
+<a name="l00320"></a>00320 }
+<a name="l00321"></a>00321 };
+<a name="l00322"></a>00322
+<a name="l00323"></a>00323 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
+<a name="l00324"></a>00324 <span class="keyword">class </span>hash_map_range;
+<a name="l00325"></a>00325
+<a name="l00327"></a>00327
+<a name="l00329"></a>00329 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00330"></a>00330 <span class="keyword">class </span>hash_map_iterator
+<a name="l00331"></a>00331 : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value>
+<a name="l00332"></a>00332 {
+<a name="l00333"></a>00333 <span class="keyword">typedef</span> Container map_type;
+<a name="l00334"></a>00334 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::node node;
+<a name="l00335"></a>00335 <span class="keyword">typedef</span> hash_map_base::node_base node_base;
+<a name="l00336"></a>00336 <span class="keyword">typedef</span> hash_map_base::bucket bucket;
+<a name="l00337"></a>00337
+<a name="l00338"></a>00338 <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="l00339"></a>00339 <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="l00340"></a>00340
+<a name="l00341"></a>00341 <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="l00342"></a>00342 <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="l00343"></a>00343
+<a name="l00344"></a>00344 <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="l00345"></a>00345 <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="l00346"></a>00346
+<a name="l00347"></a>00347 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00348"></a>00348 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_iterator;
+<a name="l00349"></a>00349
+<a name="l00350"></a>00350 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00351"></a>00351 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353 <span class="keywordtype">void</span> advance_to_next_bucket() { <span class="comment">// TODO?: refactor to iterator_base class</span>
+<a name="l00354"></a>00354 size_t k = my_index+1;
+<a name="l00355"></a>00355 <span class="keywordflow">while</span>( my_bucket && k <= my_map->my_mask ) {
+<a name="l00356"></a>00356 <span class="comment">// Following test uses 2's-complement wizardry</span>
+<a name="l00357"></a>00357 <span class="keywordflow">if</span>( k& (k-2) ) <span class="comment">// not the beginning of a segment</span>
+<a name="l00358"></a>00358 ++my_bucket;
+<a name="l00359"></a>00359 <span class="keywordflow">else</span> my_bucket = my_map->get_bucket( k );
+<a name="l00360"></a>00360 my_node = static_cast<node*>( my_bucket->node_list );
+<a name="l00361"></a>00361 <span class="keywordflow">if</span>( hash_map_base::is_valid(my_node) ) {
+<a name="l00362"></a>00362 my_index = k; <span class="keywordflow">return</span>;
+<a name="l00363"></a>00363 }
+<a name="l00364"></a>00364 ++k;
+<a name="l00365"></a>00365 }
+<a name="l00366"></a>00366 my_bucket = 0; my_node = 0; my_index = k; <span class="comment">// the end</span>
+<a name="l00367"></a>00367 }
+<a name="l00368"></a>00368 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
+<a name="l00369"></a>00369 <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="l00370"></a>00370 <span class="keyword">friend</span> <span class="keyword">class </span>interface4::concurrent_hash_map;
+<a name="l00371"></a>00371 <span class="preprocessor">#else</span>
+<a name="l00372"></a>00372 <span class="preprocessor"></span> <span class="keyword">public</span>: <span class="comment">// workaround</span>
+<a name="l00373"></a>00373 <span class="preprocessor">#endif</span>
+<a name="l00375"></a>00375 <span class="preprocessor"> const Container *my_map;</span>
+<a name="l00376"></a>00376 <span class="preprocessor"></span>
+<a name="l00378"></a>00378 size_t my_index;
+<a name="l00379"></a>00379
+<a name="l00381"></a>00381 <span class="keyword">const</span> bucket *my_bucket;
+<a name="l00382"></a>00382
+<a name="l00384"></a>00384 node *my_node;
+<a name="l00385"></a>00385
+<a name="l00386"></a>00386 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="l00387"></a>00387
+<a name="l00388"></a>00388 <span class="keyword">public</span>:
+<a name="l00390"></a>00390 hash_map_iterator() {}
+<a name="l00391"></a>00391 hash_map_iterator( <span class="keyword">const</span> hash_map_iterator<Container,typename Container::value_type> &other ) :
+<a name="l00392"></a>00392 my_map(other.my_map),
+<a name="l00393"></a>00393 my_index(other.my_index),
+<a name="l00394"></a>00394 my_bucket(other.my_bucket),
+<a name="l00395"></a>00395 my_node(other.my_node)
+<a name="l00396"></a>00396 {}
+<a name="l00397"></a>00397 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00398"></a>00398 __TBB_ASSERT( hash_map_base::is_valid(my_node), <span class="stringliteral">"iterator uninitialized or at end of container?"</span> );
+<a name="l00399"></a>00399 <span class="keywordflow">return</span> my_node->item;
+<a name="l00400"></a>00400 }
+<a name="l00401"></a>00401 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00402"></a>00402 hash_map_iterator& operator++();
+<a name="l00403"></a>00403
+<a name="l00405"></a>00405 Value* operator++(<span class="keywordtype">int</span>) {
+<a name="l00406"></a>00406 Value* result = &operator*();
+<a name="l00407"></a>00407 operator++();
+<a name="l00408"></a>00408 <span class="keywordflow">return</span> result;
+<a name="l00409"></a>00409 }
+<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> Value>
+<a name="l00413"></a>00413 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="l00414"></a>00414 my_map(&map),
+<a name="l00415"></a>00415 my_index(index),
+<a name="l00416"></a>00416 my_bucket(b),
+<a name="l00417"></a>00417 my_node( static_cast<node*>(n) )
+<a name="l00418"></a>00418 {
+<a name="l00419"></a>00419 <span class="keywordflow">if</span>( b && !hash_map_base::is_valid(n) )
+<a name="l00420"></a>00420 advance_to_next_bucket();
+<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> Value>
+<a name="l00424"></a>00424 hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
+<a name="l00425"></a>00425 my_node = static_cast<node*>( my_node->next );
+<a name="l00426"></a>00426 <span class="keywordflow">if</span>( !my_node ) advance_to_next_bucket();
+<a name="l00427"></a>00427 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<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> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00431"></a>00431 <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="l00432"></a>00432 <span class="keywordflow">return</span> i.my_node == j.my_node && i.my_map == j.my_map;
+<a name="l00433"></a>00433 }
+<a name="l00434"></a>00434
+<a name="l00435"></a>00435 <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="l00436"></a>00436 <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="l00437"></a>00437 <span class="keywordflow">return</span> i.my_node != j.my_node || i.my_map != j.my_map;
+<a name="l00438"></a>00438 }
+<a name="l00439"></a>00439
+<a name="l00441"></a>00441
+<a name="l00442"></a>00442 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
+<a name="l00443"></a>00443 <span class="keyword">class </span>hash_map_range {
+<a name="l00444"></a>00444 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::map_type map_type;
+<a name="l00445"></a>00445 Iterator my_begin;
+<a name="l00446"></a>00446 Iterator my_end;
+<a name="l00447"></a>00447 <span class="keyword">mutable</span> Iterator my_midpoint;
+<a name="l00448"></a>00448 size_t my_grainsize;
+<a name="l00450"></a>00450 <span class="keywordtype">void</span> set_midpoint() <span class="keyword">const</span>;
+<a name="l00451"></a>00451 <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="l00452"></a>00452 <span class="keyword">public</span>:
+<a name="l00454"></a>00454 <span class="keyword">typedef</span> std::size_t size_type;
+<a name="l00455"></a>00455 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
+<a name="l00456"></a>00456 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::reference reference;
+<a name="l00457"></a>00457 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::difference_type difference_type;
+<a name="l00458"></a>00458 <span class="keyword">typedef</span> Iterator iterator;
+<a name="l00459"></a>00459
+<a name="l00461"></a>00461 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin==my_end;}
+<a name="l00462"></a>00462
+<a name="l00464"></a>00464 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
+<a name="l00465"></a>00465 <span class="keywordflow">return</span> my_midpoint!=my_end;
+<a name="l00466"></a>00466 }
+<a name="l00468"></a>00468 hash_map_range( hash_map_range& r, split ) :
+<a name="l00469"></a>00469 my_end(r.my_end),
+<a name="l00470"></a>00470 my_grainsize(r.my_grainsize)
+<a name="l00471"></a>00471 {
+<a name="l00472"></a>00472 r.my_end = my_begin = r.my_midpoint;
+<a name="l00473"></a>00473 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00474"></a>00474 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00475"></a>00475 set_midpoint();
+<a name="l00476"></a>00476 r.set_midpoint();
+<a name="l00477"></a>00477 }
+<a name="l00479"></a>00479 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00480"></a>00480 hash_map_range( hash_map_range<U>& r) :
+<a name="l00481"></a>00481 my_begin(r.my_begin),
+<a name="l00482"></a>00482 my_end(r.my_end),
+<a name="l00483"></a>00483 my_midpoint(r.my_midpoint),
+<a name="l00484"></a>00484 my_grainsize(r.my_grainsize)
+<a name="l00485"></a>00485 {}
+<a name="l00486"></a>00486 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00488"></a>00488 <span class="preprocessor"> hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) : </span>
+<a name="l00489"></a>00489 <span class="preprocessor"></span> my_begin(begin_),
+<a name="l00490"></a>00490 my_end(end_),
+<a name="l00491"></a>00491 my_grainsize(grainsize_)
+<a name="l00492"></a>00492 {
+<a name="l00493"></a>00493 <span class="keywordflow">if</span>(!my_end.my_index && !my_end.my_bucket) <span class="comment">// end</span>
+<a name="l00494"></a>00494 my_end.my_index = my_end.my_map->my_mask + 1;
+<a name="l00495"></a>00495 set_midpoint();
+<a name="l00496"></a>00496 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
+<a name="l00497"></a>00497 }
+<a name="l00498"></a>00498 <span class="preprocessor">#endif</span>
+<a name="l00500"></a>00500 <span class="preprocessor"> hash_map_range( const map_type &map, size_type grainsize_ = 1 ) : </span>
+<a name="l00501"></a>00501 <span class="preprocessor"></span> my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
+<a name="l00502"></a>00502 my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
+<a name="l00503"></a>00503 my_grainsize( grainsize_ )
+<a name="l00504"></a>00504 {
+<a name="l00505"></a>00505 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
+<a name="l00506"></a>00506 set_midpoint();
+<a name="l00507"></a>00507 }
+<a name="l00508"></a>00508 <span class="keyword">const</span> Iterator& begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<a name="l00509"></a>00509 <span class="keyword">const</span> Iterator& end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
+<a name="l00511"></a>00511 size_type grainsize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
+<a name="l00512"></a>00512 };
+<a name="l00513"></a>00513
+<a name="l00514"></a>00514 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
+<a name="l00515"></a>00515 <span class="keywordtype">void</span> hash_map_range<Iterator>::set_midpoint()<span class="keyword"> const </span>{
+<a name="l00516"></a>00516 <span class="comment">// Split by groups of nodes</span>
+<a name="l00517"></a>00517 size_t m = my_end.my_index-my_begin.my_index;
+<a name="l00518"></a>00518 <span class="keywordflow">if</span>( m > my_grainsize ) {
+<a name="l00519"></a>00519 m = my_begin.my_index + m/2u;
+<a name="l00520"></a>00520 hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
+<a name="l00521"></a>00521 my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
+<a name="l00522"></a>00522 } <span class="keywordflow">else</span> {
+<a name="l00523"></a>00523 my_midpoint = my_end;
+<a name="l00524"></a>00524 }
+<a name="l00525"></a>00525 __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
+<a name="l00526"></a>00526 <span class="stringliteral">"my_begin is after my_midpoint"</span> );
+<a name="l00527"></a>00527 __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
+<a name="l00528"></a>00528 <span class="stringliteral">"my_midpoint is after my_end"</span> );
+<a name="l00529"></a>00529 __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
+<a name="l00530"></a>00530 <span class="stringliteral">"[my_begin, my_midpoint) range should not be empty"</span> );
+<a name="l00531"></a>00531 }
+<a name="l00532"></a>00532
+<a name="l00533"></a>00533 } <span class="comment">// internal</span>
+<a name="l00535"></a>00535 <span class="comment"></span>
+<a name="l00537"></a>00537
+<a name="l00566"></a>00566 <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="l00567"></a><a class="code" href="a00156.html">00567</a> <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
+<a name="l00568"></a>00568 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00569"></a>00569 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
+<a name="l00570"></a>00570
+<a name="l00571"></a>00571 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00572"></a>00572 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_range;
+<a name="l00573"></a>00573
+<a name="l00574"></a>00574 <span class="keyword">public</span>:
+<a name="l00575"></a>00575 <span class="keyword">typedef</span> Key key_type;
+<a name="l00576"></a>00576 <span class="keyword">typedef</span> T mapped_type;
+<a name="l00577"></a>00577 <span class="keyword">typedef</span> std::pair<const Key,T> value_type;
+<a name="l00578"></a>00578 <span class="keyword">typedef</span> hash_map_base::size_type size_type;
+<a name="l00579"></a>00579 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00580"></a>00580 <span class="keyword">typedef</span> value_type *pointer;
+<a name="l00581"></a>00581 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type *const_pointer;
+<a name="l00582"></a>00582 <span class="keyword">typedef</span> value_type &reference;
+<a name="l00583"></a>00583 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type &const_reference;
+<a name="l00584"></a>00584 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
+<a name="l00585"></a>00585 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
+<a name="l00586"></a>00586 <span class="keyword">typedef</span> internal::hash_map_range<iterator> range_type;
+<a name="l00587"></a>00587 <span class="keyword">typedef</span> internal::hash_map_range<const_iterator> const_range_type;
+<a name="l00588"></a>00588 <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00589"></a>00589
+<a name="l00590"></a>00590 <span class="keyword">protected</span>:
+<a name="l00591"></a>00591 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00159.html">const_accessor</a>;
+<a name="l00592"></a>00592 <span class="keyword">struct </span>node;
+<a name="l00593"></a>00593 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
+<a name="l00594"></a>00594 node_allocator_type my_allocator;
+<a name="l00595"></a>00595 HashCompare my_hash_compare;
+<a name="l00596"></a>00596
+<a name="l00597"></a>00597 <span class="keyword">struct </span>node : <span class="keyword">public</span> node_base {
+<a name="l00598"></a>00598 value_type item;
+<a name="l00599"></a>00599 node( <span class="keyword">const</span> Key &key ) : item(key, T()) {}
+<a name="l00600"></a>00600 node( <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T &t ) : item(key, t) {}
+<a name="l00601"></a>00601 <span class="comment">// exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17</span>
+<a name="l00602"></a>00602 <span class="keywordtype">void</span> *operator new( size_t <span class="comment">/*size*/</span>, node_allocator_type &a ) {
+<a name="l00603"></a>00603 <span class="keywordtype">void</span> *ptr = a.allocate(1);
+<a name="l00604"></a>00604 <span class="keywordflow">if</span>(!ptr)
+<a name="l00605"></a>00605 tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
+<a name="l00606"></a>00606 <span class="keywordflow">return</span> ptr;
+<a name="l00607"></a>00607 }
+<a name="l00608"></a>00608 <span class="comment">// match placement-new form above to be called if exception thrown in constructor</span>
+<a name="l00609"></a>00609 <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="l00610"></a>00610 };
+<a name="l00611"></a>00611
+<a name="l00612"></a>00612 <span class="keywordtype">void</span> delete_node( node_base *n ) {
+<a name="l00613"></a>00613 my_allocator.destroy( static_cast<node*>(n) );
+<a name="l00614"></a>00614 my_allocator.deallocate( static_cast<node*>(n), 1);
+<a name="l00615"></a>00615 }
+<a name="l00616"></a>00616
+<a name="l00617"></a>00617 node *search_bucket( <span class="keyword">const</span> key_type &key, bucket *b )<span class="keyword"> const </span>{
+<a name="l00618"></a>00618 node *n = static_cast<node*>( b->node_list );
+<a name="l00619"></a>00619 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
+<a name="l00620"></a>00620 n = static_cast<node*>( n->next );
+<a name="l00621"></a>00621 __TBB_ASSERT(n != internal::rehash_req, <span class="stringliteral">"Search can be executed only for rehashed bucket"</span>);
+<a name="l00622"></a>00622 <span class="keywordflow">return</span> n;
+<a name="l00623"></a>00623 }
+<a name="l00624"></a>00624
+<a name="l00626"></a><a class="code" href="a00158.html">00626</a> <span class="keyword">class </span><a class="code" href="a00158.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
+<a name="l00627"></a>00627 <span class="keywordtype">bool</span> my_is_writer; <span class="comment">// TODO: use it from base type</span>
+<a name="l00628"></a>00628 bucket *my_b;
+<a name="l00629"></a>00629 <span class="keyword">public</span>:
+<a name="l00630"></a>00630 <a class="code" href="a00158.html">bucket_accessor</a>( <a class="code" href="a00156.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="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
+<a name="l00632"></a><a class="code" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">00632</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00156.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="l00633"></a>00633 my_b = base->get_bucket( h );
+<a name="l00634"></a>00634 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00635"></a>00635 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
+<a name="l00636"></a>00636 <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&my_b->node_list) == internal::rehash_req
+<a name="l00637"></a>00637 #<span class="keywordflow">else</span>
+<a name="l00638"></a>00638 <span class="keywordflow">if</span>( __TBB_load_with_acquire(my_b->node_list) == internal::rehash_req
+<a name="l00639"></a>00639 #endif
+<a name="l00640"></a>00640 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
+<a name="l00641"></a>00641 {
+<a name="l00642"></a>00642 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00156.html#571d635fd206d9985cf20a1a659ea476">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
+<a name="l00643"></a>00643 my_is_writer = <span class="keyword">true</span>;
+<a name="l00644"></a>00644 }
+<a name="l00645"></a>00645 <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, <span class="comment">/*write=*/</span>my_is_writer = writer );
+<a name="l00646"></a>00646 __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
+<a name="l00647"></a>00647 }
+<a name="l00649"></a><a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">00649</a> <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> my_is_writer; }
+<a name="l00651"></a><a class="code" href="a00158.html#57c6110bd20e95c06de5a199de988941">00651</a> bucket *operator() () { <span class="keywordflow">return</span> my_b; }
+<a name="l00652"></a>00652 <span class="comment">// TODO: optimize out</span>
+<a name="l00653"></a>00653 <span class="keywordtype">bool</span> upgrade_to_writer() { my_is_writer = <span class="keyword">true</span>; <span class="keywordflow">return</span> bucket::scoped_t::upgrade_to_writer(); }
+<a name="l00654"></a>00654 };
+<a name="l00655"></a>00655
+<a name="l00656"></a>00656 <span class="comment">// TODO refactor to hash_base</span>
+<a name="l00657"></a>00657 <span class="keywordtype">void</span> rehash_bucket( bucket *b_new, <span class="keyword">const</span> hashcode_t h ) {
+<a name="l00658"></a>00658 __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), <span class="stringliteral">"b_new must be locked (for write)"</span>);
+<a name="l00659"></a>00659 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
+<a name="l00660"></a>00660 __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); <span class="comment">// mark rehashed</span>
+<a name="l00661"></a>00661 hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
+<a name="l00662"></a>00662
+<a name="l00663"></a>00663 bucket_accessor b_old( <span class="keyword">this</span>, h & mask );
+<a name="l00664"></a>00664
+<a name="l00665"></a>00665 mask = (mask<<1) | 1; <span class="comment">// get full mask for new bucket</span>
+<a name="l00666"></a>00666 __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
+<a name="l00667"></a>00667 restart:
+<a name="l00668"></a>00668 <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="l00669"></a>00669 hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
+<a name="l00670"></a>00670 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00671"></a>00671 <span class="preprocessor"></span> hashcode_t bmask = h & (mask>>1);
+<a name="l00672"></a>00672 bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; <span class="comment">// minimal mask of parent bucket</span>
+<a name="l00673"></a>00673 __TBB_ASSERT( (c & bmask) == (h & bmask), <span class="stringliteral">"hash() function changed for key in table"</span> );
+<a name="l00674"></a>00674 <span class="preprocessor">#endif</span>
+<a name="l00675"></a>00675 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (c & mask) == h ) {
+<a name="l00676"></a>00676 <span class="keywordflow">if</span>( !b_old.is_writer() )
+<a name="l00677"></a>00677 <span class="keywordflow">if</span>( !b_old.upgrade_to_writer() ) {
+<a name="l00678"></a>00678 <span class="keywordflow">goto</span> restart; <span class="comment">// node ptr can be invalid due to concurrent erase</span>
+<a name="l00679"></a>00679 }
+<a name="l00680"></a>00680 *p = n->next; <span class="comment">// exclude from b_old</span>
+<a name="l00681"></a>00681 add_to_bucket( b_new, n );
+<a name="l00682"></a>00682 } <span class="keywordflow">else</span> p = &n->next; <span class="comment">// iterate to next item</span>
+<a name="l00683"></a>00683 }
+<a name="l00684"></a>00684 }
+<a name="l00685"></a>00685
+<a name="l00686"></a>00686 <span class="keyword">public</span>:
+<a name="l00687"></a>00687
+<a name="l00688"></a>00688 <span class="keyword">class </span>accessor;
+<a name="l00690"></a><a class="code" href="a00159.html">00690</a> <span class="keyword">class </span><a class="code" href="a00159.html">const_accessor</a> {
+<a name="l00691"></a>00691 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
+<a name="l00692"></a>00692 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00157.html">accessor</a>;
+<a name="l00693"></a>00693 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00157.html">accessor</a> & ) <span class="keyword">const</span>; <span class="comment">// Deny access</span>
+<a name="l00694"></a>00694 <a class="code" href="a00159.html">const_accessor</a>( <span class="keyword">const</span> <a class="code" href="a00157.html">accessor</a> & ); <span class="comment">// Deny access</span>
+<a name="l00695"></a>00695 <span class="keyword">public</span>:
+<a name="l00697"></a><a class="code" href="a00159.html#48647ca0d79c1233b997f5768403c926">00697</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="l00698"></a>00698
+<a name="l00700"></a><a class="code" href="a00159.html#5cce3104cb0a52e08d2131370871c614">00700</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
+<a name="l00701"></a>00701
+<a name="l00703"></a><a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">00703</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
+<a name="l00704"></a>00704 <span class="keywordflow">if</span>( my_node ) {
+<a name="l00705"></a>00705 my_lock.release();
+<a name="l00706"></a>00706 my_node = 0;
+<a name="l00707"></a>00707 }
+<a name="l00708"></a>00708 }
+<a name="l00709"></a>00709
+<a name="l00711"></a><a class="code" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">00711</a> const_reference operator*()<span class="keyword"> const </span>{
+<a name="l00712"></a>00712 __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
+<a name="l00713"></a>00713 <span class="keywordflow">return</span> my_node->item;
+<a name="l00714"></a>00714 }
+<a name="l00715"></a>00715
+<a name="l00717"></a><a class="code" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00717</a> const_pointer operator->()<span class="keyword"> const </span>{
+<a name="l00718"></a>00718 <span class="keywordflow">return</span> &operator*();
+<a name="l00719"></a>00719 }
+<a name="l00720"></a>00720
+<a name="l00722"></a><a class="code" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">00722</a> <a class="code" href="a00159.html">const_accessor</a>() : my_node(NULL) {}
+<a name="l00723"></a>00723
+<a name="l00725"></a><a class="code" href="a00159.html#752b0c1ec74b94786403a75e42917d01">00725</a> ~<a class="code" href="a00159.html">const_accessor</a>() {
+<a name="l00726"></a>00726 my_node = NULL; <span class="comment">// my_lock.release() is called in scoped_lock destructor</span>
+<a name="l00727"></a>00727 }
+<a name="l00728"></a>00728 <span class="keyword">private</span>:
+<a name="l00729"></a>00729 node *my_node;
+<a name="l00730"></a>00730 <span class="keyword">typename</span> node::scoped_t my_lock;
+<a name="l00731"></a>00731 hashcode_t my_hash;
+<a name="l00732"></a>00732 };
+<a name="l00733"></a>00733
+<a name="l00735"></a><a class="code" href="a00157.html">00735</a> <span class="keyword">class </span><a class="code" href="a00157.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00159.html">const_accessor</a> {
+<a name="l00736"></a>00736 <span class="keyword">public</span>:
+<a name="l00738"></a><a class="code" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">00738</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
+<a name="l00739"></a>00739
+<a name="l00741"></a><a class="code" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">00741</a> reference operator*()<span class="keyword"> const </span>{
+<a name="l00742"></a>00742 __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
+<a name="l00743"></a>00743 <span class="keywordflow">return</span> this->my_node->item;
+<a name="l00744"></a>00744 }
+<a name="l00745"></a>00745
+<a name="l00747"></a><a class="code" href="a00157.html#fcebc32c020202cc37e60eadef157569">00747</a> pointer operator->()<span class="keyword"> const </span>{
+<a name="l00748"></a>00748 <span class="keywordflow">return</span> &operator*();
+<a name="l00749"></a>00749 }
+<a name="l00750"></a>00750 };
+<a name="l00751"></a>00751
+<a name="l00753"></a><a class="code" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">00753</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00754"></a>00754 : internal::hash_map_base(), my_allocator(a)
+<a name="l00755"></a>00755 {}
+<a name="l00756"></a>00756
+<a name="l00758"></a><a class="code" href="a00156.html#a4612d5c7233712d455496641e9b31ff">00758</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00759"></a>00759 : my_allocator(a)
+<a name="l00760"></a>00760 {
+<a name="l00761"></a>00761 reserve( n );
+<a name="l00762"></a>00762 }
+<a name="l00763"></a>00763
+<a name="l00765"></a><a class="code" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">00765</a> <a class="code" href="a00156.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00766"></a>00766 : internal::hash_map_base(), my_allocator(a)
+<a name="l00767"></a>00767 {
+<a name="l00768"></a>00768 internal_copy(table);
+<a name="l00769"></a>00769 }
+<a name="l00770"></a>00770
+<a name="l00772"></a>00772 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00773"></a><a class="code" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">00773</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00774"></a>00774 : my_allocator(a)
+<a name="l00775"></a>00775 {
+<a name="l00776"></a>00776 reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
+<a name="l00777"></a>00777 internal_copy(first, last);
+<a name="l00778"></a>00778 }
+<a name="l00779"></a>00779
+<a name="l00781"></a><a class="code" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">00781</a> <a class="code" href="a00156.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& table ) {
+<a name="l00782"></a>00782 <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
+<a name="l00783"></a>00783 clear();
+<a name="l00784"></a>00784 internal_copy(table);
+<a name="l00785"></a>00785 }
+<a name="l00786"></a>00786 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00787"></a>00787 }
+<a name="l00788"></a>00788
+<a name="l00789"></a>00789
+<a name="l00791"></a>00791
+<a name="l00793"></a>00793 <span class="keywordtype">void</span> rehash(size_type n = 0);
+<a name="l00794"></a>00794
+<a name="l00796"></a>00796 <span class="keywordtype">void</span> clear();
+<a name="l00797"></a>00797
+<a name="l00799"></a><a class="code" href="a00156.html#a1ac58997d8fbf242b266e3691573481">00799</a> ~<a class="code" href="a00156.html">concurrent_hash_map</a>() { clear(); }
+<a name="l00800"></a>00800
+<a name="l00801"></a>00801 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00802"></a>00802 <span class="comment">// Parallel algorithm support</span>
+<a name="l00803"></a>00803 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00804"></a>00804 range_type range( size_type grainsize=1 ) {
+<a name="l00805"></a>00805 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span>, grainsize );
+<a name="l00806"></a>00806 }
+<a name="l00807"></a>00807 const_range_type range( size_type grainsize=1 )<span class="keyword"> const </span>{
+<a name="l00808"></a>00808 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span>, grainsize );
+<a name="l00809"></a>00809 }
+<a name="l00810"></a>00810
+<a name="l00811"></a>00811 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00812"></a>00812 <span class="comment">// STL support - not thread-safe methods</span>
+<a name="l00813"></a>00813 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00814"></a>00814 iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
+<a name="l00815"></a>00815 iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,0,0);}
+<a name="l00816"></a>00816 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="l00817"></a>00817 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="l00818"></a>00818 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="l00819"></a>00819 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="l00820"></a>00820
+<a name="l00822"></a><a class="code" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">00822</a> size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
+<a name="l00823"></a>00823
+<a name="l00825"></a><a class="code" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">00825</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
+<a name="l00826"></a>00826
+<a name="l00828"></a><a class="code" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">00828</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="l00829"></a>00829
+<a name="l00831"></a><a class="code" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">00831</a> size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
+<a name="l00832"></a>00832
+<a name="l00834"></a><a class="code" href="a00156.html#199208eed6f09e200cda364f906be0fe">00834</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00835"></a>00835
+<a name="l00837"></a>00837 <span class="keywordtype">void</span> swap(<a class="code" href="a00156.html">concurrent_hash_map</a> &table);
+<a name="l00838"></a>00838
+<a name="l00839"></a>00839 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00840"></a>00840 <span class="comment">// concurrent map operations</span>
+<a name="l00841"></a>00841 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00842"></a>00842
+<a name="l00844"></a><a class="code" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">00844</a> size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
+<a name="l00845"></a>00845 <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="l00846"></a>00846 }
+<a name="l00847"></a>00847
+<a name="l00849"></a>00849
+<a name="l00850"></a><a class="code" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">00850</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
+<a name="l00851"></a>00851 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00852"></a>00852 <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="l00853"></a>00853 }
+<a name="l00854"></a>00854
+<a name="l00856"></a>00856
+<a name="l00857"></a><a class="code" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">00857</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00858"></a>00858 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00859"></a>00859 <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="l00860"></a>00860 }
+<a name="l00861"></a>00861
+<a name="l00863"></a>00863
+<a name="l00864"></a><a class="code" href="a00156.html#58c38b27273de6c670568633c0931854">00864</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00865"></a>00865 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00866"></a>00866 <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="l00867"></a>00867 }
+<a name="l00868"></a>00868
+<a name="l00870"></a>00870
+<a name="l00871"></a><a class="code" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">00871</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00872"></a>00872 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00873"></a>00873 <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="l00874"></a>00874 }
+<a name="l00875"></a>00875
+<a name="l00877"></a>00877
+<a name="l00878"></a><a class="code" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">00878</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00879"></a>00879 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00880"></a>00880 <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="l00881"></a>00881 }
+<a name="l00882"></a>00882
+<a name="l00884"></a>00884
+<a name="l00885"></a><a class="code" href="a00156.html#a657e61cd2b13164764ca2708875784a">00885</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00886"></a>00886 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00887"></a>00887 <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="l00888"></a>00888 }
+<a name="l00889"></a>00889
+<a name="l00891"></a>00891
+<a name="l00892"></a><a class="code" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">00892</a> <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
+<a name="l00893"></a>00893 <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="l00894"></a>00894 }
+<a name="l00895"></a>00895
+<a name="l00897"></a>00897 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00898"></a><a class="code" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">00898</a> <span class="keywordtype">void</span> insert(I first, I last) {
+<a name="l00899"></a>00899 <span class="keywordflow">for</span>(; first != last; ++first)
+<a name="l00900"></a>00900 insert( *first );
+<a name="l00901"></a>00901 }
+<a name="l00902"></a>00902
+<a name="l00904"></a>00904
+<a name="l00905"></a>00905 <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
+<a name="l00906"></a>00906
+<a name="l00908"></a>00908
+<a name="l00909"></a><a class="code" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">00909</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00159.html">const_accessor</a>& item_accessor ) {
+<a name="l00910"></a>00910 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">true</span> );
+<a name="l00911"></a>00911 }
+<a name="l00912"></a>00912
+<a name="l00914"></a>00914
+<a name="l00915"></a><a class="code" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">00915</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00157.html">accessor</a>& item_accessor ) {
+<a name="l00916"></a>00916 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">false</span> );
+<a name="l00917"></a>00917 }
+<a name="l00918"></a>00918
+<a name="l00919"></a>00919 <span class="keyword">protected</span>:
+<a name="l00921"></a>00921 <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="l00922"></a>00922
+<a name="l00924"></a>00924 <span class="keywordtype">bool</span> exclude( const_accessor &item_accessor, <span class="keywordtype">bool</span> readonly );
+<a name="l00925"></a>00925
+<a name="l00927"></a>00927 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00928"></a>00928 std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
+<a name="l00929"></a>00929
+<a name="l00931"></a>00931 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& source );
+<a name="l00932"></a>00932
+<a name="l00933"></a>00933 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00934"></a>00934 <span class="keywordtype">void</span> internal_copy(I first, I last);
+<a name="l00935"></a>00935
+<a name="l00937"></a>00937
+<a name="l00939"></a><a class="code" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">00939</a> const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
+<a name="l00940"></a>00940 hashcode_t h = my_hash_compare.hash( key );
+<a name="l00941"></a>00941 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00942"></a>00942 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+<a name="l00943"></a>00943 <span class="preprocessor">#else</span>
+<a name="l00944"></a>00944 <span class="preprocessor"></span> hashcode_t m = my_mask;
+<a name="l00945"></a>00945 <span class="preprocessor">#endif</span>
+<a name="l00946"></a>00946 <span class="preprocessor"></span> node *n;
+<a name="l00947"></a>00947 restart:
+<a name="l00948"></a>00948 __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l00949"></a>00949 bucket *b = get_bucket( h & m );
+<a name="l00950"></a>00950 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00951"></a>00951 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
+<a name="l00952"></a>00952 <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&b->node_list) == internal::rehash_req )
+<a name="l00953"></a>00953 <span class="preprocessor">#else</span>
+<a name="l00954"></a>00954 <span class="preprocessor"></span> <span class="keywordflow">if</span>( __TBB_load_with_acquire(b->node_list) == internal::rehash_req )
+<a name="l00955"></a>00955 <span class="preprocessor">#endif</span>
+<a name="l00956"></a>00956 <span class="preprocessor"></span> {
+<a name="l00957"></a>00957 bucket::scoped_t lock;
+<a name="l00958"></a>00958 <span class="keywordflow">if</span>( lock.try_acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) ) {
+<a name="l00959"></a>00959 <span class="keywordflow">if</span>( b->node_list == internal::rehash_req)
+<a name="l00960"></a>00960 const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->rehash_bucket( b, h & m ); <span class="comment">//recursive rehashing</span>
+<a name="l00961"></a>00961 }
+<a name="l00962"></a>00962 <span class="keywordflow">else</span> lock.acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00963"></a>00963 __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
+<a name="l00964"></a>00964 }
+<a name="l00965"></a>00965 n = search_bucket( key, b );
+<a name="l00966"></a>00966 <span class="keywordflow">if</span>( n )
+<a name="l00967"></a>00967 <span class="keywordflow">return</span> &n->item;
+<a name="l00968"></a>00968 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l00969"></a>00969 <span class="keywordflow">goto</span> restart;
+<a name="l00970"></a>00970 <span class="keywordflow">return</span> 0;
+<a name="l00971"></a>00971 }
+<a name="l00972"></a>00972 };
+<a name="l00973"></a>00973
+<a name="l00974"></a>00974 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00975"></a>00975 <span class="preprocessor"></span> <span class="comment">// Suppress "conditional expression is constant" warning.</span>
+<a name="l00976"></a>00976 <span class="preprocessor"> #pragma warning( push )</span>
+<a name="l00977"></a>00977 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4127 )</span>
+<a name="l00978"></a>00978 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00979"></a>00979 <span class="preprocessor"></span>
+<a name="l00980"></a>00980 <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="l00981"></a><a class="code" href="a00156.html#1f22480a290ddc6c145888d8f985531a">00981</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.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="a00159.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
+<a name="l00982"></a>00982 __TBB_ASSERT( !result || !result-><a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
+<a name="l00983"></a>00983 segment_index_t grow_segment;
+<a name="l00984"></a>00984 <span class="keywordtype">bool</span> return_value;
+<a name="l00985"></a>00985 node *n, *tmp_n = 0;
+<a name="l00986"></a>00986 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
+<a name="l00987"></a>00987 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00988"></a>00988 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+<a name="l00989"></a>00989 <span class="preprocessor">#else</span>
+<a name="l00990"></a>00990 <span class="preprocessor"></span> hashcode_t m = my_mask;
+<a name="l00991"></a>00991 <span class="preprocessor">#endif</span>
+<a name="l00992"></a>00992 <span class="preprocessor"></span> restart:
+<a name="l00993"></a>00993 {<span class="comment">//lock scope</span>
+<a name="l00994"></a>00994 __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l00995"></a>00995 return_value = <span class="keyword">false</span>;
+<a name="l00996"></a>00996 <span class="comment">// get bucket</span>
+<a name="l00997"></a>00997 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
+<a name="l00998"></a>00998
+<a name="l00999"></a>00999 <span class="comment">// find a node</span>
+<a name="l01000"></a>01000 n = search_bucket( key, b() );
+<a name="l01001"></a>01001 <span class="keywordflow">if</span>( op_insert ) {
+<a name="l01002"></a>01002 <span class="comment">// [opt] insert a key</span>
+<a name="l01003"></a>01003 <span class="keywordflow">if</span>( !n ) {
+<a name="l01004"></a>01004 <span class="keywordflow">if</span>( !tmp_n ) {
+<a name="l01005"></a>01005 <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
+<a name="l01006"></a>01006 <span class="keywordflow">else</span> tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
+<a name="l01007"></a>01007 }
+<a name="l01008"></a>01008 <span class="keywordflow">if</span>( !b.<a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00158.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) { <span class="comment">// TODO: improved insertion</span>
+<a name="l01009"></a>01009 <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
+<a name="l01010"></a>01010 n = search_bucket( key, b() );
+<a name="l01011"></a>01011 <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
+<a name="l01012"></a>01012 b.downgrade_to_reader();
+<a name="l01013"></a>01013 <span class="keywordflow">goto</span> exists;
+<a name="l01014"></a>01014 }
+<a name="l01015"></a>01015 }
+<a name="l01016"></a>01016 <span class="keywordflow">if</span>( check_mask_race(h, m) )
+<a name="l01017"></a>01017 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b().</span>
+<a name="l01018"></a>01018 <span class="comment">// insert and set flag to grow the container</span>
+<a name="l01019"></a>01019 grow_segment = insert_new_node( b(), n = tmp_n, m );
+<a name="l01020"></a>01020 tmp_n = 0;
+<a name="l01021"></a>01021 return_value = <span class="keyword">true</span>;
+<a name="l01022"></a>01022 } <span class="keywordflow">else</span> {
+<a name="l01023"></a>01023 exists: grow_segment = 0;
+<a name="l01024"></a>01024 }
+<a name="l01025"></a>01025 } <span class="keywordflow">else</span> { <span class="comment">// find or count</span>
+<a name="l01026"></a>01026 <span class="keywordflow">if</span>( !n ) {
+<a name="l01027"></a>01027 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l01028"></a>01028 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b(). TODO: replace by continue</span>
+<a name="l01029"></a>01029 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01030"></a>01030 }
+<a name="l01031"></a>01031 return_value = <span class="keyword">true</span>;
+<a name="l01032"></a>01032 grow_segment = 0;
+<a name="l01033"></a>01033 }
+<a name="l01034"></a>01034 <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
+<a name="l01035"></a>01035 <span class="comment">// TODO: the following seems as generic/regular operation</span>
+<a name="l01036"></a>01036 <span class="comment">// acquire the item</span>
+<a name="l01037"></a>01037 <span class="keywordflow">if</span>( !result-><a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) ) {
+<a name="l01038"></a>01038 <span class="comment">// we are unlucky, prepare for longer wait</span>
+<a name="l01039"></a>01039 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> trials;
+<a name="l01040"></a>01040 <span class="keywordflow">do</span> {
+<a name="l01041"></a>01041 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
+<a name="l01042"></a>01042 <span class="comment">// the wait takes really long, restart the operation</span>
+<a name="l01043"></a>01043 b.release();
+<a name="l01044"></a>01044 __TBB_ASSERT( !op_insert || !return_value, <span class="stringliteral">"Can't acquire new item in locked bucket?"</span> );
+<a name="l01045"></a>01045 __TBB_Yield();
+<a name="l01046"></a>01046 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l01047"></a>01047 <span class="preprocessor"></span> m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+<a name="l01048"></a>01048 <span class="preprocessor">#else</span>
+<a name="l01049"></a>01049 <span class="preprocessor"></span> m = my_mask;
+<a name="l01050"></a>01050 <span class="preprocessor">#endif</span>
+<a name="l01051"></a>01051 <span class="preprocessor"></span> <span class="keywordflow">goto</span> restart;
+<a name="l01052"></a>01052 }
+<a name="l01053"></a>01053 } <span class="keywordflow">while</span>( !result-><a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) );
+<a name="l01054"></a>01054 }
+<a name="l01055"></a>01055 }<span class="comment">//lock scope</span>
+<a name="l01056"></a>01056 result-><a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = n;
+<a name="l01057"></a>01057 result-><a class="code" href="a00159.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a> = h;
+<a name="l01058"></a>01058 check_growth:
+<a name="l01059"></a>01059 <span class="comment">// [opt] grow the container</span>
+<a name="l01060"></a>01060 <span class="keywordflow">if</span>( grow_segment )
+<a name="l01061"></a>01061 enable_segment( grow_segment );
+<a name="l01062"></a>01062 <span class="keywordflow">if</span>( tmp_n ) <span class="comment">// if op_insert only</span>
+<a name="l01063"></a>01063 delete_node( tmp_n );
+<a name="l01064"></a>01064 <span class="keywordflow">return</span> return_value;
+<a name="l01065"></a>01065 }
+<a name="l01066"></a>01066
+<a name="l01067"></a>01067 <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="l01068"></a>01068 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l01069"></a><a class="code" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">01069</a> std::pair<I, I> <a class="code" href="a00156.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="l01070"></a>01070 hashcode_t h = my_hash_compare.hash( key );
+<a name="l01071"></a>01071 hashcode_t m = my_mask;
+<a name="l01072"></a>01072 __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l01073"></a>01073 h &= m;
+<a name="l01074"></a>01074 bucket *b = get_bucket( h );
+<a name="l01075"></a>01075 <span class="keywordflow">while</span>( b->node_list == internal::rehash_req ) {
+<a name="l01076"></a>01076 m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
+<a name="l01077"></a>01077 b = get_bucket( h &= m );
+<a name="l01078"></a>01078 }
+<a name="l01079"></a>01079 node *n = search_bucket( key, b );
+<a name="l01080"></a>01080 <span class="keywordflow">if</span>( !n )
+<a name="l01081"></a>01081 <span class="keywordflow">return</span> std::make_pair(end_, end_);
+<a name="l01082"></a>01082 iterator lower(*<span class="keyword">this</span>, h, b, n), upper(lower);
+<a name="l01083"></a>01083 <span class="keywordflow">return</span> std::make_pair(lower, ++upper);
+<a name="l01084"></a>01084 }
+<a name="l01085"></a>01085
+<a name="l01086"></a>01086 <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="l01087"></a><a class="code" href="a00156.html#faad2108bd2be75e52293486af59f11e">01087</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00159.html">const_accessor</a> &item_accessor, <span class="keywordtype">bool</span> readonly ) {
+<a name="l01088"></a>01088 __TBB_ASSERT( item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
+<a name="l01089"></a>01089 node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>;
+<a name="l01090"></a>01090 item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = NULL; <span class="comment">// we ought release accessor anyway</span>
+<a name="l01091"></a>01091 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00159.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a>;
+<a name="l01092"></a>01092 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l01093"></a>01093 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+<a name="l01094"></a>01094 <span class="preprocessor">#else</span>
+<a name="l01095"></a>01095 <span class="preprocessor"></span> hashcode_t m = my_mask;
+<a name="l01096"></a>01096 <span class="preprocessor">#endif</span>
+<a name="l01097"></a>01097 <span class="preprocessor"></span> <span class="keywordflow">do</span> {
+<a name="l01098"></a>01098 <span class="comment">// get bucket</span>
+<a name="l01099"></a>01099 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
+<a name="l01100"></a>01100 node_base **p = &b()->node_list;
+<a name="l01101"></a>01101 <span class="keywordflow">while</span>( *p && *p != n )
+<a name="l01102"></a>01102 p = &(*p)->next;
+<a name="l01103"></a>01103 <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was the first</span>
+<a name="l01104"></a>01104 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l01105"></a>01105 <span class="keywordflow">continue</span>;
+<a name="l01106"></a>01106 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
+<a name="l01107"></a>01107 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01108"></a>01108 }
+<a name="l01109"></a>01109 __TBB_ASSERT( *p == n, NULL );
+<a name="l01110"></a>01110 *p = n->next; <span class="comment">// remove from container</span>
+<a name="l01111"></a>01111 my_size--;
+<a name="l01112"></a>01112 <span class="keywordflow">break</span>;
+<a name="l01113"></a>01113 } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
+<a name="l01114"></a>01114 <span class="keywordflow">if</span>( readonly ) <span class="comment">// need to get exclusive lock</span>
+<a name="l01115"></a>01115 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
+<a name="l01116"></a>01116 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
+<a name="l01117"></a>01117 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the chain_mutex</span>
+<a name="l01118"></a>01118 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<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="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">01122</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
+<a name="l01123"></a>01123 node_base *n;
+<a name="l01124"></a>01124 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
+<a name="l01125"></a>01125 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l01126"></a>01126 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+<a name="l01127"></a>01127 <span class="preprocessor">#else</span>
+<a name="l01128"></a>01128 <span class="preprocessor"></span> hashcode_t m = my_mask;
+<a name="l01129"></a>01129 <span class="preprocessor">#endif</span>
+<a name="l01130"></a>01130 <span class="preprocessor"></span>restart:
+<a name="l01131"></a>01131 {<span class="comment">//lock scope</span>
+<a name="l01132"></a>01132 <span class="comment">// get bucket</span>
+<a name="l01133"></a>01133 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
+<a name="l01134"></a>01134 search:
+<a name="l01135"></a>01135 node_base **p = &b()->node_list;
+<a name="l01136"></a>01136 n = *p;
+<a name="l01137"></a>01137 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
+<a name="l01138"></a>01138 p = &n->next;
+<a name="l01139"></a>01139 n = *p;
+<a name="l01140"></a>01140 }
+<a name="l01141"></a>01141 <span class="keywordflow">if</span>( !n ) { <span class="comment">// not found, but mask could be changed</span>
+<a name="l01142"></a>01142 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l01143"></a>01143 <span class="keywordflow">goto</span> restart;
+<a name="l01144"></a>01144 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01145"></a>01145 }
+<a name="l01146"></a>01146 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00158.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) {
+<a name="l01147"></a>01147 <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
+<a name="l01148"></a>01148 <span class="keywordflow">goto</span> restart;
+<a name="l01149"></a>01149 <span class="keywordflow">goto</span> search;
+<a name="l01150"></a>01150 }
+<a name="l01151"></a>01151 *p = n->next;
+<a name="l01152"></a>01152 my_size--;
+<a name="l01153"></a>01153 }
+<a name="l01154"></a>01154 {
+<a name="l01155"></a>01155 <span class="keyword">typename</span> node::scoped_t item_locker( n->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
+<a name="l01156"></a>01156 }
+<a name="l01157"></a>01157 <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="l01158"></a>01158 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the bucket</span>
+<a name="l01159"></a>01159 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01160"></a>01160 }
+<a name="l01161"></a>01161
+<a name="l01162"></a>01162 <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="l01163"></a>01163 <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
+<a name="l01164"></a>01164 std::swap(this->my_allocator, table.<a class="code" href="a00156.html#252e91d8029f6308db7179557e3b1436">my_allocator</a>);
+<a name="l01165"></a>01165 std::swap(this->my_hash_compare, table.<a class="code" href="a00156.html#f738f241c8500ce3dbf0f9028ca8b602">my_hash_compare</a>);
+<a name="l01166"></a>01166 internal_swap(table);
+<a name="l01167"></a>01167 }
+<a name="l01168"></a>01168
+<a name="l01169"></a>01169 <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="l01170"></a><a class="code" href="a00156.html#13f3f2e8de7564be03882c31559493c9">01170</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
+<a name="l01171"></a>01171 reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
+<a name="l01172"></a>01172 hashcode_t mask = my_mask;
+<a name="l01173"></a>01173 hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
+<a name="l01174"></a>01174 __TBB_ASSERT((b&(b-1))==0, NULL);
+<a name="l01175"></a>01175 bucket *bp = get_bucket( b ); <span class="comment">// only the last segment should be scanned for rehashing</span>
+<a name="l01176"></a>01176 <span class="keywordflow">for</span>(; b <= mask; b++, bp++ ) {
+<a name="l01177"></a>01177 node_base *n = bp->node_list;
+<a name="l01178"></a>01178 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
+<a name="l01179"></a>01179 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
+<a name="l01180"></a>01180 <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="l01181"></a>01181 hashcode_t h = b; bucket *b_old = bp;
+<a name="l01182"></a>01182 <span class="keywordflow">do</span> {
+<a name="l01183"></a>01183 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
+<a name="l01184"></a>01184 hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
+<a name="l01185"></a>01185 b_old = get_bucket( h &= m );
+<a name="l01186"></a>01186 } <span class="keywordflow">while</span>( b_old->node_list == internal::rehash_req );
+<a name="l01187"></a>01187 <span class="comment">// now h - is index of the root rehashed bucket b_old</span>
+<a name="l01188"></a>01188 mark_rehashed_levels( h ); <span class="comment">// mark all non-rehashed children recursively across all segments</span>
+<a name="l01189"></a>01189 <span class="keywordflow">for</span>( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
+<a name="l01190"></a>01190 hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
+<a name="l01191"></a>01191 <span class="keywordflow">if</span>( (c & mask) != h ) { <span class="comment">// should be rehashed</span>
+<a name="l01192"></a>01192 *p = q->next; <span class="comment">// exclude from b_old</span>
+<a name="l01193"></a>01193 bucket *b_new = get_bucket( c & mask );
+<a name="l01194"></a>01194 __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="l01195"></a>01195 add_to_bucket( b_new, q );
+<a name="l01196"></a>01196 } <span class="keywordflow">else</span> p = &q->next; <span class="comment">// iterate to next item</span>
+<a name="l01197"></a>01197 }
+<a name="l01198"></a>01198 }
+<a name="l01199"></a>01199 }
+<a name="l01200"></a>01200 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01201"></a>01201 <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="l01202"></a>01202 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
+<a name="l01203"></a>01203 <span class="preprocessor">#endif</span>
+<a name="l01204"></a>01204 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01205"></a>01205 <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="l01206"></a>01206 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
+<a name="l01207"></a>01207 <span class="keywordflow">else</span> bp = get_bucket( b );
+<a name="l01208"></a>01208 node_base *n = bp->node_list;
+<a name="l01209"></a>01209 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
+<a name="l01210"></a>01210 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, <span class="stringliteral">"Broken internal structure"</span> );
+<a name="l01211"></a>01211 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01212"></a>01212 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
+<a name="l01213"></a>01213 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
+<a name="l01214"></a>01214 <span class="preprocessor">#endif</span>
+<a name="l01215"></a>01215 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l01216"></a>01216 <span class="preprocessor"></span> <span class="keywordflow">for</span>( ; is_valid(n); n = n->next ) {
+<a name="l01217"></a>01217 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
+<a name="l01218"></a>01218 __TBB_ASSERT( h == b, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
+<a name="l01219"></a>01219 }
+<a name="l01220"></a>01220 <span class="preprocessor">#endif</span>
+<a name="l01221"></a>01221 <span class="preprocessor"></span> }
+<a name="l01222"></a>01222 <span class="preprocessor">#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01223"></a>01223 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01224"></a>01224 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
+<a name="l01225"></a>01225 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
+<a name="l01226"></a>01226 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
+<a name="l01227"></a>01227 tbb::internal::runtime_warning(
+<a name="l01228"></a>01228 <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="l01229"></a>01229 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
+<a name="l01230"></a>01230 reported = <span class="keyword">true</span>;
+<a name="l01231"></a>01231 }
+<a name="l01232"></a>01232 <span class="preprocessor">#endif</span>
+<a name="l01233"></a>01233 <span class="preprocessor"></span>}
+<a name="l01234"></a>01234
+<a name="l01235"></a>01235 <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="l01236"></a><a class="code" href="a00156.html#a9f89be8fe28835749529d91081a2511">01236</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
+<a name="l01237"></a>01237 hashcode_t m = my_mask;
+<a name="l01238"></a>01238 __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l01239"></a>01239 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01240"></a>01240 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01241"></a>01241 <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="l01242"></a>01242 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
+<a name="l01243"></a>01243 <span class="preprocessor">#endif</span>
+<a name="l01244"></a>01244 <span class="preprocessor"></span> bucket *bp = 0;
+<a name="l01245"></a>01245 <span class="comment">// check consistency</span>
+<a name="l01246"></a>01246 <span class="keywordflow">for</span>( segment_index_t b = 0; b <= m; b++ ) {
+<a name="l01247"></a>01247 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
+<a name="l01248"></a>01248 <span class="keywordflow">else</span> bp = get_bucket( b );
+<a name="l01249"></a>01249 node_base *n = bp->node_list;
+<a name="l01250"></a>01250 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
+<a name="l01251"></a>01251 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during clear() execution"</span> );
+<a name="l01252"></a>01252 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01253"></a>01253 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
+<a name="l01254"></a>01254 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n == internal::rehash_req ) buckets--;
+<a name="l01255"></a>01255 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
+<a name="l01256"></a>01256 <span class="preprocessor">#endif</span>
+<a name="l01257"></a>01257 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
+<a name="l01258"></a>01258 <span class="preprocessor"></span> <span class="keywordflow">for</span>(; is_valid(n); n = n->next ) {
+<a name="l01259"></a>01259 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
+<a name="l01260"></a>01260 h &= m;
+<a name="l01261"></a>01261 __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="l01262"></a>01262 }
+<a name="l01263"></a>01263 <span class="preprocessor">#endif</span>
+<a name="l01264"></a>01264 <span class="preprocessor"></span> }
+<a name="l01265"></a>01265 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01266"></a>01266 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
+<a name="l01267"></a>01267 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
+<a name="l01268"></a>01268 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
+<a name="l01269"></a>01269 tbb::internal::runtime_warning(
+<a name="l01270"></a>01270 <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="l01271"></a>01271 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
+<a name="l01272"></a>01272 reported = <span class="keyword">true</span>;
+<a name="l01273"></a>01273 }
+<a name="l01274"></a>01274 <span class="preprocessor">#endif</span>
+<a name="l01275"></a>01275 <span class="preprocessor"></span><span class="preprocessor">#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01276"></a>01276 <span class="preprocessor"></span> my_size = 0;
+<a name="l01277"></a>01277 segment_index_t s = segment_index_of( m );
+<a name="l01278"></a>01278 __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
+<a name="l01279"></a>01279 <a class="code" href="a00151.html">cache_aligned_allocator<bucket></a> alloc;
+<a name="l01280"></a>01280 <span class="keywordflow">do</span> {
+<a name="l01281"></a>01281 __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
+<a name="l01282"></a>01282 segment_ptr_t buckets_ptr = my_table[s];
+<a name="l01283"></a>01283 size_type sz = segment_size( s ? s : 1 );
+<a name="l01284"></a>01284 <span class="keywordflow">for</span>( segment_index_t i = 0; i < sz; i++ )
+<a name="l01285"></a>01285 <span class="keywordflow">for</span>( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
+<a name="l01286"></a>01286 buckets_ptr[i].node_list = n->next;
+<a name="l01287"></a>01287 delete_node( n );
+<a name="l01288"></a>01288 }
+<a name="l01289"></a>01289 <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
+<a name="l01290"></a>01290 alloc.<a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
+<a name="l01291"></a>01291 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
+<a name="l01292"></a>01292 alloc.<a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
+<a name="l01293"></a>01293 <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
+<a name="l01294"></a>01294 } <span class="keywordflow">while</span>(s-- > 0);
+<a name="l01295"></a>01295 my_mask = embedded_buckets - 1;
+<a name="l01296"></a>01296 }
+<a name="l01297"></a>01297
+<a name="l01298"></a>01298 <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="l01299"></a><a class="code" href="a00156.html#3c27779fe66b79505390d084310d997e">01299</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& source ) {
+<a name="l01300"></a>01300 reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
+<a name="l01301"></a>01301 hashcode_t mask = source.my_mask;
+<a name="l01302"></a>01302 <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
+<a name="l01303"></a>01303 bucket *dst = 0, *src = 0;
+<a name="l01304"></a>01304 <span class="keywordtype">bool</span> rehash_required = <span class="keyword">false</span>;
+<a name="l01305"></a>01305 <span class="keywordflow">for</span>( hashcode_t k = 0; k <= mask; k++ ) {
+<a name="l01306"></a>01306 <span class="keywordflow">if</span>( k & (k-2) ) ++dst,src++; <span class="comment">// not the beginning of a segment</span>
+<a name="l01307"></a>01307 <span class="keywordflow">else</span> { dst = get_bucket( k ); src = source.get_bucket( k ); }
+<a name="l01308"></a>01308 __TBB_ASSERT( dst->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
+<a name="l01309"></a>01309 node *n = static_cast<node*>( src->node_list );
+<a name="l01310"></a>01310 <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// source is not rehashed, items are in previous buckets</span>
+<a name="l01311"></a>01311 rehash_required = <span class="keyword">true</span>;
+<a name="l01312"></a>01312 dst->node_list = internal::rehash_req;
+<a name="l01313"></a>01313 } <span class="keywordflow">else</span> <span class="keywordflow">for</span>(; n; n = static_cast<node*>( n->next ) ) {
+<a name="l01314"></a>01314 add_to_bucket( dst, <span class="keyword">new</span>( my_allocator ) node(n->item.first, n->item.second) );
+<a name="l01315"></a>01315 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
+<a name="l01316"></a>01316 }
+<a name="l01317"></a>01317 }
+<a name="l01318"></a>01318 <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00156.html#13f3f2e8de7564be03882c31559493c9">rehash</a>();
+<a name="l01319"></a>01319 } <span class="keywordflow">else</span> <a class="code" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a>( source.<a class="code" href="a00156.html#4a3c58cf1234b74ca796dcf555d32f53">begin</a>(), source.<a class="code" href="a00156.html#28c690486d8db5783475f5b1a59d21bc">end</a>() );
+<a name="l01320"></a>01320 }
+<a name="l01321"></a>01321
+<a name="l01322"></a>01322 <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="l01323"></a>01323 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l01324"></a>01324 <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
+<a name="l01325"></a>01325 hashcode_t m = my_mask;
+<a name="l01326"></a>01326 <span class="keywordflow">for</span>(; first != last; ++first) {
+<a name="l01327"></a>01327 hashcode_t h = my_hash_compare.hash( first->first );
+<a name="l01328"></a>01328 bucket *b = get_bucket( h & m );
+<a name="l01329"></a>01329 __TBB_ASSERT( b->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
+<a name="l01330"></a>01330 node *n = <span class="keyword">new</span>( my_allocator ) node(first->first, first->second);
+<a name="l01331"></a>01331 add_to_bucket( b, n );
+<a name="l01332"></a>01332 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
+<a name="l01333"></a>01333 }
+<a name="l01334"></a>01334 }
+<a name="l01335"></a>01335
+<a name="l01336"></a>01336 } <span class="comment">// namespace interface4</span>
+<a name="l01337"></a>01337
+<a name="l01338"></a>01338 <span class="keyword">using</span> interface4::concurrent_hash_map;
+<a name="l01339"></a>01339
+<a name="l01340"></a>01340
+<a name="l01341"></a>01341 <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="l01342"></a>01342 <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="l01343"></a>01343 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01344"></a>01344 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
+<a name="l01345"></a>01345 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
+<a name="l01346"></a>01346 <span class="keywordflow">for</span>(; i != i_end; ++i) {
+<a name="l01347"></a>01347 j = b.equal_range(i->first).first;
+<a name="l01348"></a>01348 <span class="keywordflow">if</span>( j == j_end || !(i->second == j->second) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01349"></a>01349 }
+<a name="l01350"></a>01350 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01351"></a>01351 }
+<a name="l01352"></a>01352
+<a name="l01353"></a>01353 <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="l01354"></a>01354 <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="l01355"></a>01355 { <span class="keywordflow">return</span> !(a == b); }
+<a name="l01356"></a>01356
+<a name="l01357"></a>01357 <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="l01358"></a>01358 <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="l01359"></a>01359 { a.swap( b ); }
+<a name="l01360"></a>01360
+<a name="l01361"></a>01361 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l01362"></a>01362 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</span>
+<a name="l01363"></a>01363 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4127 is back</span>
+<a name="l01364"></a>01364 <span class="preprocessor"></span>
+<a name="l01365"></a>01365 } <span class="comment">// namespace tbb</span>
+<a name="l01366"></a>01366
+<a name="l01367"></a>01367 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_hash_map_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00292.html b/doc/html/a00335.html
similarity index 51%
rename from doc/html/a00292.html
rename to doc/html/a00335.html
index c1a1cde..243821a 100644
--- a/doc/html/a00292.html
+++ b/doc/html/a00335.html
@@ -50,7 +50,7 @@
<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="a00139.html">00035</a> <span class="keyword">class </span><a class="code" href="a00139.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
+<a name="l00035"></a><a class="code" href="a00160.html">00035</a> <span class="keyword">class </span><a class="code" href="a00160.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;
@@ -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="a00139.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00139.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
+<a name="l00057"></a><a class="code" href="a00160.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00160.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00139.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00139.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
+<a name="l00060"></a><a class="code" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00139.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00139.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
+<a name="l00063"></a><a class="code" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
+<a name="l00066"></a><a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00139.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00139.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
+<a name="l00069"></a><a class="code" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
+<a name="l00072"></a><a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00139.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00139.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00076"></a>00076 internal::concurrent_queue_base_v3<T>( sizeof(T) ), my_allocator( a )
+<a name="l00075"></a><a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00160.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="a00139.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00139.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00083"></a>00083 internal::concurrent_queue_base_v3<T>( sizeof(T) ), my_allocator( a )
+<a name="l00082"></a><a class="code" href="a00160.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00160.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 internal_push(&*begin);
<a name="l00087"></a>00087 }
<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00139.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00139.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00139.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac" [...]
-<a name="l00091"></a>00091 internal::concurrent_queue_base_v3<T>( sizeof(T) ), my_allocator( a )
+<a name="l00090"></a><a class="code" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00160.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00160.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 assign( src );
<a name="l00094"></a>00094 }
<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <a class="code" href="a00139.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
+<a name="l00097"></a>00097 <a class="code" href="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00139.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00139.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00100"></a><a class="code" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
<a name="l00101"></a>00101 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="a00139.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00139.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
+<a name="l00107"></a><a class="code" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
<a name="l00108"></a>00108 <span class="keywordflow">return</span> internal_try_pop( &result );
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110
-<a name="l00112"></a><a class="code" href="a00139.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00139.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="a00160.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00160.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="a00139.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00139.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="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.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="a00139.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
+<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
<a name="l00119"></a>00119
-<a name="l00121"></a><a class="code" href="a00139.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00139.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00139.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="a00160.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00160.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,16 +131,16 @@
<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="a00139.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00139.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137 <a class="code" href="a00139.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
+<a name="l00136"></a><a class="code" href="a00160.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00160.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
+<a name="l00137"></a>00137 <a class="code" href="a00160.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="a00139.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00139.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00139.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
+<a name="l00142"></a><a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00160.html">concurrent_queue<T,A>::clear</a>() {
+<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
<a name="l00144"></a>00144 T value;
-<a name="l00145"></a>00145 internal_try_pop(&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
@@ -148,213 +148,215 @@
<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="a00134.html">00158</a> <span class="keyword">class </span><a class="code" href="a00134.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
+<a name="l00158"></a><a class="code" href="a00155.html">00158</a> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
<a name="l00160"></a>00160
<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
<a name="l00163"></a>00163 page_allocator_type my_allocator;
<a name="l00164"></a>00164
-<a name="l00166"></a>00166 <span class="keyword">class </span>destroyer: internal::no_copy {
-<a name="l00167"></a>00167 T& my_value;
-<a name="l00168"></a>00168 <span class="keyword">public</span>:
-<a name="l00169"></a>00169 destroyer( T& value ) : my_value(value) {}
-<a name="l00170"></a>00170 ~destroyer() {my_value.~T();}
-<a name="l00171"></a>00171 };
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 T& get_ref( page& page, size_t index ) {
-<a name="l00174"></a>00174 __TBB_ASSERT( index<items_per_page, NULL );
-<a name="l00175"></a>00175 <span class="keywordflow">return</span> static_cast<T*>(static_cast<void*>(&page+1))[index];
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177
-<a name="l00178"></a>00178 <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="l00179"></a>00179 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
-<a name="l00180"></a>00180 }
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <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="l00183"></a>00183 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( static_cast<const T*>(static_cast<const void*>(&src+1))[sindex] );
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 <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="l00187"></a>00187 T& from = get_ref(src,index);
-<a name="l00188"></a>00188 destroyer d(from);
-<a name="l00189"></a>00189 *static_cast<T*>(dst) = from;
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00193"></a>00193 size_t n = <span class="keyword">sizeof</span>(page) + items_per_page*item_size;
-<a name="l00194"></a>00194 page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
-<a name="l00195"></a>00195 <span class="keywordflow">if</span>( !p )
-<a name="l00196"></a>00196 internal::throw_exception(internal::eid_bad_alloc);
-<a name="l00197"></a>00197 <span class="keywordflow">return</span> p;
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
-<a name="l00201"></a>00201 size_t n = <span class="keyword">sizeof</span>(page) + items_per_page*item_size;
-<a name="l00202"></a>00202 my_allocator.deallocate( reinterpret_cast<char*>(p), n );
-<a name="l00203"></a>00203 }
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="keyword">public</span>:
-<a name="l00207"></a><a class="code" href="a00134.html#98245517a931e5893f6601e66c51fc75">00207</a> <span class="keyword">typedef</span> T <a class="code" href="a00134.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
-<a name="l00208"></a>00208
-<a name="l00210"></a><a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">00210</a> <span class="keyword">typedef</span> A <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
-<a name="l00211"></a>00211
-<a name="l00213"></a><a class="code" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">00213</a> <span class="keyword">typedef</span> T& <a class="code" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
-<a name="l00214"></a>00214
-<a name="l00216"></a><a class="code" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">00216</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
-<a name="l00217"></a>00217
+<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="a00155.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
+<a name="l00210"></a>00210
+<a name="l00212"></a><a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
+<a name="l00213"></a>00213
+<a name="l00215"></a><a class="code" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
+<a name="l00216"></a>00216
+<a name="l00218"></a><a class="code" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
<a name="l00219"></a>00219
-<a name="l00221"></a><a class="code" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">00221</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
-<a name="l00222"></a>00222
-<a name="l00224"></a><a class="code" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">00224</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
-<a name="l00225"></a>00225
-<a name="l00227"></a><a class="code" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">00227</a> <span class="keyword">explicit</span> <a class="code" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00228"></a>00228 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00229"></a>00229 {
-<a name="l00230"></a>00230 }
-<a name="l00231"></a>00231
-<a name="l00233"></a><a class="code" href="a00134.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00233</a> <a class="code" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00134.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00134.html#2e2726fccf6d975dc [...]
-<a name="l00234"></a>00234 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00235"></a>00235 {
-<a name="l00236"></a>00236 assign( src );
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238
-<a name="l00240"></a>00240 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00241"></a><a class="code" href="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">00241</a> <a class="code" href="a00134.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00242"></a>00242 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00243"></a>00243 {
-<a name="l00244"></a>00244 <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00245"></a>00245 internal_push_if_not_full(&*begin);
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247
-<a name="l00249"></a>00249 <a class="code" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
-<a name="l00250"></a>00250
-<a name="l00252"></a><a class="code" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">00252</a> <span class="keywordtype">void</span> <a class="code" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00253"></a>00253 internal_push( &source );
-<a name="l00254"></a>00254 }
-<a name="l00255"></a>00255
+<a name="l00221"></a>00221
+<a name="l00223"></a><a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
+<a name="l00224"></a>00224
+<a name="l00226"></a><a class="code" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
+<a name="l00227"></a>00227
+<a name="l00229"></a><a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00155.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="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00155.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="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00155.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="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
+<a name="l00252"></a>00252
+<a name="l00254"></a><a class="code" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00155.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="l00258"></a><a class="code" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">00258</a> <span class="keywordtype">void</span> <a class="code" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
-<a name="l00259"></a>00259 internal_pop( &destination );
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261
+<a name="l00259"></a>00259
+<a name="l00260"></a><a class="code" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00155.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><a class="code" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">00265</a> <span class="keywordtype">bool</span> <a class="code" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00266"></a>00266 <span class="keywordflow">return</span> internal_push_if_not_full( &source );
-<a name="l00267"></a>00267 }
-<a name="l00268"></a>00268
+<a name="l00265"></a>00265
+<a name="l00267"></a><a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.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><a class="code" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">00272</a> <span class="keywordtype">bool</span> <a class="code" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
-<a name="l00273"></a>00273 <span class="keywordflow">return</span> internal_pop_if_present( &destination );
-<a name="l00274"></a>00274 }
-<a name="l00275"></a>00275
+<a name="l00272"></a>00272
+<a name="l00274"></a><a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.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="l00280"></a><a class="code" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">00280</a> <a class="code" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
-<a name="l00281"></a>00281
-<a name="l00283"></a><a class="code" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">00283</a> <span class="keywordtype">bool</span> <a class="code" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
-<a name="l00284"></a>00284
-<a name="l00286"></a><a class="code" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">00286</a> <a class="code" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
-<a name="l00287"></a>00287 <span class="keywordflow">return</span> my_capacity;
-<a name="l00288"></a>00288 }
-<a name="l00289"></a>00289
+<a name="l00279"></a>00279
+<a name="l00282"></a><a class="code" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00155.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="a00155.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.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="a00155.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00155.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><a class="code" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">00293</a> <span class="keywordtype">void</span> <a class="code" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">set_capacity</a>( <a class="code" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> ) {
-<a name="l00294"></a>00294 internal_set_capacity( capacity, <span class="keyword">sizeof</span>(T) );
-<a name="l00295"></a>00295 }
-<a name="l00296"></a>00296
-<a name="l00298"></a><a class="code" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">00298</a> <a class="code" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00299"></a>00299
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
-<a name="l00302"></a>00302
-<a name="l00303"></a>00303 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
-<a name="l00304"></a>00304 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00307"></a>00307 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
+<a name="l00293"></a>00293
+<a name="l00295"></a><a class="code" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00155.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="a00155.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00155.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="a00155.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 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00310"></a>00310 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00311"></a>00311 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00312"></a>00312 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 };
+<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 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00317"></a><a class="code" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">00317</a> <a class="code" href="a00134.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00318"></a>00318 <a class="code" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
-<a name="l00319"></a>00319 internal_finish_clear();
-<a name="l00320"></a>00320 }
-<a name="l00321"></a>00321
-<a name="l00322"></a>00322 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00323"></a><a class="code" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">00323</a> <span class="keywordtype">void</span> <a class="code" href="a00134.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00324"></a>00324 <span class="keywordflow">while</span>( !<a class="code" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
-<a name="l00325"></a>00325 T value;
-<a name="l00326"></a>00326 internal_pop_if_present(&value);
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329
-<a name="l00330"></a>00330 <span class="keyword">namespace </span>deprecated {
+<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="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00155.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
+<a name="l00320"></a>00320 <a class="code" href="a00155.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="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_bounded_queue<T,A>::clear</a>() {
+<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00155.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="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00339"></a><a class="code" href="a00140.html">00339</a> <span class="keyword">class </span><a class="code" href="a00140.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00134.html">concurrent_bounded_queue</a><T,A> {
-<a name="l00340"></a>00340 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00341"></a>00341 <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="l00342"></a>00342 <span class="preprocessor">#endif </span>
-<a name="l00343"></a>00343 <span class="preprocessor"></span>
-<a name="l00344"></a>00344 <span class="keyword">public</span>:
-<a name="l00346"></a><a class="code" href="a00140.html#aaf19bd7337b72f3131ece60f7315ef7">00346</a> <span class="keyword">explicit</span> <a class="code" href="a00140.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
-<a name="l00347"></a>00347 <a class="code" href="a00134.html">concurrent_bounded_queue</a><T,A>( a )
-<a name="l00348"></a>00348 {
-<a name="l00349"></a>00349 }
-<a name="l00350"></a>00350
-<a name="l00352"></a><a class="code" href="a00140.html#fc092b9082f233482f3513fc3bb670f7">00352</a> <a class="code" href="a00140.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00140.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
-<a name="l00353"></a>00353 <a class="code" href="a00134.html">concurrent_bounded_queue</a><T,A>( src, a )
-<a name="l00354"></a>00354 {
-<a name="l00355"></a>00355 }
-<a name="l00356"></a>00356
-<a name="l00358"></a>00358 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00359"></a><a class="code" href="a00140.html#383187b910f8c3ca27a39c1638566f15">00359</a> <a class="code" href="a00140.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> A& a = A()) :
-<a name="l00360"></a>00360 <a class="code" href="a00134.html">concurrent_bounded_queue</a><T,A>( begin, end, a )
-<a name="l00361"></a>00361 {
-<a name="l00362"></a>00362 }
-<a name="l00363"></a>00363
+<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="a00161.html">00341</a> <span class="keyword">class </span><a class="code" href="a00161.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00155.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="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
+<a name="l00349"></a>00349 <a class="code" href="a00155.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="a00161.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
+<a name="l00355"></a>00355 <a class="code" href="a00155.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="a00161.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00161.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="a00155.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><a class="code" href="a00140.html#7c45561bafe71107d09b2bc1b8f4e681">00367</a> <span class="keywordtype">bool</span> <a class="code" href="a00140.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00368"></a>00368 <span class="keywordflow">return</span> <a class="code" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
-<a name="l00369"></a>00369 }
-<a name="l00370"></a>00370
+<a name="l00367"></a>00367
+<a name="l00369"></a><a class="code" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00370"></a>00370 <span class="keywordflow">return</span> <a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
+<a name="l00371"></a>00371 }
<a name="l00372"></a>00372
-<a name="l00376"></a><a class="code" href="a00140.html#48da3536245318af6cb5fd58bac78039">00376</a> <span class="keywordtype">bool</span> <a class="code" href="a00140.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00377"></a>00377 <span class="keywordflow">return</span> <a class="code" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379
-<a name="l00380"></a>00380 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00134.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00381"></a>00381 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00134.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
-<a name="l00382"></a>00382 <span class="comment">//</span>
-<a name="l00383"></a>00383 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00384"></a>00384 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
+<a name="l00374"></a>00374
+<a name="l00378"></a><a class="code" href="a00161.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
+<a name="l00379"></a>00379 <span class="keywordflow">return</span> <a class="code" href="a00155.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="a00155.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="a00155.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 iterator begin() {<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00387"></a>00387 iterator end() {<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00388"></a>00388 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00389"></a>00389 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00390"></a>00390 };
-<a name="l00391"></a>00391
-<a name="l00392"></a>00392 }
-<a name="l00393"></a>00393
-<a name="l00394"></a>00394
-<a name="l00395"></a>00395 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00396"></a>00396 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
-<a name="l00397"></a>00397 <span class="preprocessor">#else</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;
-<a name="l00399"></a>00399 <span class="preprocessor">#endif</span>
-<a name="l00400"></a>00400 <span class="preprocessor"></span>
-<a name="l00401"></a>00401 } <span class="comment">// namespace tbb</span>
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</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>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00336.html b/doc/html/a00336.html
new file mode 100644
index 0000000..0c97317
--- /dev/null
+++ b/doc/html/a00336.html
@@ -0,0 +1,263 @@
+<!DOCTYPE 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-2010 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-2010 Intel Corporation. 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/a00338.html b/doc/html/a00338.html
deleted file mode 100644
index aa4733d..0000000
--- a/doc/html/a00338.html
+++ /dev/null
@@ -1,360 +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-2010 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 <new></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 <span class="keyword">namespace </span>internal {
-<a name="l00033"></a>00033
-<a name="l00035"></a>00035 <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="l00036"></a>00036
-<a name="l00038"></a>00038 <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="l00039"></a>00039
-<a name="l00040"></a>00040 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_reduce_store_body( T*& dst, T* src ) {
-<a name="l00041"></a>00041 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span> itt_store_pointer_with_release_v3(&dst,src);
-<a name="l00043"></a>00043 <span class="preprocessor">#else</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span> __TBB_store_with_release(dst,src);
-<a name="l00045"></a>00045 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00046"></a>00046 }
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">inline</span> T* parallel_reduce_load_body( T*& src ) {
-<a name="l00049"></a>00049 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="keywordflow">return</span> static_cast<T*>(itt_load_pointer_with_acquire_v3(&src));
-<a name="l00051"></a>00051 <span class="preprocessor">#else</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_load_with_acquire(src);
-<a name="l00053"></a>00053 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00054"></a>00054 }
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
-<a name="l00059"></a>00059
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00063"></a>00063 <span class="keyword">class </span>finish_reduce: <span class="keyword">public</span> task {
-<a name="l00065"></a>00065 Body* my_body;
-<a name="l00066"></a>00066 <span class="keywordtype">bool</span> has_right_zombie;
-<a name="l00067"></a>00067 <span class="keyword">const</span> reduction_context my_context;
-<a name="l00068"></a>00068 aligned_space<Body,1> zombie_space;
-<a name="l00069"></a>00069 finish_reduce( <span class="keywordtype">char</span> context ) :
-<a name="l00070"></a>00070 my_body(NULL),
-<a name="l00071"></a>00071 has_right_zombie(false),
-<a name="l00072"></a>00072 my_context(context)
-<a name="l00073"></a>00073 {
-<a name="l00074"></a>00074 }
-<a name="l00075"></a>00075 task* execute() {
-<a name="l00076"></a>00076 <span class="keywordflow">if</span>( has_right_zombie ) {
-<a name="l00077"></a>00077 <span class="comment">// Right child was stolen.</span>
-<a name="l00078"></a>00078 Body* s = zombie_space.begin();
-<a name="l00079"></a>00079 my_body->join( *s );
-<a name="l00080"></a>00080 s->~Body();
-<a name="l00081"></a>00081 }
-<a name="l00082"></a>00082 <span class="keywordflow">if</span>( my_context==1 )
-<a name="l00083"></a>00083 parallel_reduce_store_body( static_cast<finish_reduce*>(parent())->my_body, my_body );
-<a name="l00084"></a>00084 <span class="keywordflow">return</span> NULL;
-<a name="l00085"></a>00085 }
-<a name="l00086"></a>00086 <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="l00087"></a>00087 <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
-<a name="l00088"></a>00088 };
-<a name="l00089"></a>00089
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 <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="l00093"></a>00093 <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
-<a name="l00094"></a>00094 <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
-<a name="l00095"></a>00095 Body* my_body;
-<a name="l00096"></a>00096 Range my_range;
-<a name="l00097"></a>00097 <span class="keyword">typename</span> Partitioner::partition_type my_partition;
-<a name="l00098"></a>00098 reduction_context my_context;
-<a name="l00099"></a>00099 <span class="comment">/*override*/</span> task* execute();
-<a name="l00100"></a>00100 <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
-<a name="l00101"></a>00101 <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104 start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
-<a name="l00105"></a>00105 my_body(body),
-<a name="l00106"></a>00106 my_range(range),
-<a name="l00107"></a>00107 my_partition(partitioner),
-<a name="l00108"></a>00108 my_context(0)
-<a name="l00109"></a>00109 {
-<a name="l00110"></a>00110 }
-<a name="l00112"></a>00112
-<a name="l00113"></a>00113 start_reduce( start_reduce& parent, split ) :
-<a name="l00114"></a>00114 my_body(parent.my_body),
-<a name="l00115"></a>00115 my_range(parent.my_range,split()),
-<a name="l00116"></a>00116 my_partition(parent.my_partition,split()),
-<a name="l00117"></a>00117 my_context(2)
-<a name="l00118"></a>00118 {
-<a name="l00119"></a>00119 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00120"></a>00120 parent.my_context = 1;
-<a name="l00121"></a>00121 }
-<a name="l00123"></a>00123 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00124"></a>00124 my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00125"></a>00125 }
-<a name="l00126"></a>00126
-<a name="l00127"></a>00127 <span class="keyword">public</span>:
-<a name="l00128"></a>00128 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
-<a name="l00129"></a>00129 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00130"></a>00130 #<span class="keywordflow">if</span> !__TBB_EXCEPTIONS || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00131"></a>00131 <a class="code" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
-<a name="l00132"></a>00132 <span class="preprocessor">#else</span>
-<a name="l00133"></a>00133 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00134"></a>00134 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00135"></a>00135 task_group_context context;
-<a name="l00136"></a>00136 <a class="code" href="a00174.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 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00141"></a>00141 <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="l00142"></a>00142 <span class="keywordflow">if</span>( !range.empty() )
-<a name="l00143"></a>00143 <a class="code" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00146"></a>00146 };
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <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="l00149"></a>00149 task* start_reduce<Range,Body,Partitioner>::execute() {
-<a name="l00150"></a>00150 <span class="keywordflow">if</span>( my_context==2 ) {
-<a name="l00151"></a>00151 finish_type* p = static_cast<finish_type*>(parent() );
-<a name="l00152"></a>00152 <span class="keywordflow">if</span>( !parallel_reduce_load_body(p->my_body) ) {
-<a name="l00153"></a>00153 my_body = <span class="keyword">new</span>( p->zombie_space.begin() ) Body(*my_body,split());
-<a name="l00154"></a>00154 p->has_right_zombie = <span class="keyword">true</span>;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157 <span class="keywordflow">if</span>( !my_range.is_divisible() || my_partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00158"></a>00158 (*my_body)( my_range );
-<a name="l00159"></a>00159 <span class="keywordflow">if</span>( my_context==1 )
-<a name="l00160"></a>00160 parallel_reduce_store_body(static_cast<finish_type*>(parent())->my_body, my_body );
-<a name="l00161"></a>00161 <span class="keywordflow">return</span> my_partition.continue_after_execute_range(*<span class="keyword">this</span>);
-<a name="l00162"></a>00162 } <span class="keywordflow">else</span> {
-<a name="l00163"></a>00163 finish_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_type(my_context);
-<a name="l00164"></a>00164 recycle_as_child_of(c);
-<a name="l00165"></a>00165 c.set_ref_count(2);
-<a name="l00166"></a>00166 <span class="keywordtype">bool</span> delay = my_partition.decide_whether_to_delay();
-<a name="l00167"></a>00167 start_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_reduce(*<span class="keyword">this</span>,split());
-<a name="l00168"></a>00168 my_partition.spawn_or_delay(delay,*<span class="keyword">this</span>,b);
-<a name="l00169"></a>00169 <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00170"></a>00170 }
-<a name="l00171"></a>00171 }
-<a name="l00172"></a>00172
-<a name="l00174"></a>00174
-<a name="l00178"></a>00178 <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="l00179"></a>00179 <span class="keyword">class </span>lambda_reduce_body {
-<a name="l00180"></a>00180
-<a name="l00181"></a>00181 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
-<a name="l00182"></a>00182 <span class="comment">// (might require some performance measurements)</span>
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="keyword">const</span> Value& identity_element;
-<a name="l00185"></a>00185 <span class="keyword">const</span> RealBody& my_real_body;
-<a name="l00186"></a>00186 <span class="keyword">const</span> Reduction& my_reduction;
-<a name="l00187"></a>00187 Value my_value;
-<a name="l00188"></a>00188 lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
-<a name="l00189"></a>00189 <span class="keyword">public</span>:
-<a name="l00190"></a>00190 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="l00191"></a>00191 : identity_element(identity)
-<a name="l00192"></a>00192 , my_real_body(body)
-<a name="l00193"></a>00193 , my_reduction(reduction)
-<a name="l00194"></a>00194 , my_value(identity)
-<a name="l00195"></a>00195 { }
-<a name="l00196"></a>00196 lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
-<a name="l00197"></a>00197 : identity_element(other.identity_element)
-<a name="l00198"></a>00198 , my_real_body(other.my_real_body)
-<a name="l00199"></a>00199 , my_reduction(other.my_reduction)
-<a name="l00200"></a>00200 , my_value(other.my_value)
-<a name="l00201"></a>00201 { }
-<a name="l00202"></a>00202 lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00173.html">tbb::split</a> )
-<a name="l00203"></a>00203 : identity_element(other.identity_element)
-<a name="l00204"></a>00204 , my_real_body(other.my_real_body)
-<a name="l00205"></a>00205 , my_reduction(other.my_reduction)
-<a name="l00206"></a>00206 , my_value(other.identity_element)
-<a name="l00207"></a>00207 { }
-<a name="l00208"></a>00208 <span class="keywordtype">void</span> operator()(Range& range) {
-<a name="l00209"></a>00209 my_value = my_real_body(range, const_cast<const Value&>(my_value));
-<a name="l00210"></a>00210 }
-<a name="l00211"></a>00211 <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
-<a name="l00212"></a>00212 my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 Value result()<span class="keyword"> const </span>{
-<a name="l00215"></a>00215 <span class="keywordflow">return</span> my_value;
-<a name="l00216"></a>00216 }
-<a name="l00217"></a>00217 };
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 } <span class="comment">// namespace internal</span>
-<a name="l00221"></a>00221 <span class="comment"></span>
-<a name="l00222"></a>00222 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00223"></a>00223
-<a name="l00242"></a>00242
-<a name="l00244"></a>00244
-<a name="l00245"></a>00245 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00246"></a><a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">00246</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00247"></a>00247 internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00248"></a>00248 }
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251
-<a name="l00252"></a>00252 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00253"></a><a class="code" href="a00241.html#gec1b7c03f9da909bef5db12e3d41bed3">00253</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00168.html">simple_partitioner</a>& partitioner ) {
-<a name="l00254"></a>00254 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
-<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="a00241.html#g18a19157e6245992fc00ca0adeb7dd37">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>& partitioner ) {
-<a name="l00261"></a>00261 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
-<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="a00241.html#gc61e73fcc36c92d79a217fc355ff4a6b">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00120.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00268"></a>00268 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270
-<a name="l00271"></a>00271 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span>
-<a name="l00274"></a>00274 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00275"></a><a class="code" href="a00241.html#g45cb00c42a18e334bbde8b7535afe460">00275</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00168.html">simple_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_cont [...]
-<a name="l00276"></a>00276 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00282"></a><a class="code" href="a00241.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00282</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_context</a>& context ) {
-<a name="l00283"></a>00283 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
-<a name="l00284"></a>00284 }
-<a name="l00285"></a>00285
-<a name="l00287"></a>00287
-<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00289"></a><a class="code" href="a00241.html#gd9ac3a3811060314695f33b703c6e11b">00289</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00120.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_context</a>& context ) {
-<a name="l00290"></a>00290 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
-<a name="l00291"></a>00291 }
-<a name="l00292"></a>00292 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00293"></a>00293
-<a name="l00297"></a>00297
-<a name="l00298"></a>00298
-<a name="l00299"></a>00299 <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="l00300"></a><a class="code" href="a00241.html#gc9412e09fb01fcad8c018ea9cffb28ef">00300</a> Value <a class="code" href="a00241.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="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> __TBB_DEFAULT_PARTITIONER>
-<a name="l00303"></a>00303 ::run(range, body, __TBB_DEFAULT_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="a00241.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00310</a> Value <a class="code" href="a00241.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 <span class="keyword">const</span> <a class="code" href="a00168.html">simple_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>,<span class="keyword">const</span> <a class="code" href="a00168.html">simple_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="l00319"></a>00319
-<a name="l00320"></a>00320 <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="l00321"></a><a class="code" href="a00241.html#gb175401f0729e40dd2c5860a17c14385">00321</a> Value <a class="code" href="a00241.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="l00322"></a>00322 <span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>& partitioner ) {
-<a name="l00323"></a>00323 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00324"></a>00324 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>>
-<a name="l00325"></a>00325 ::run( range, body, partitioner );
-<a name="l00326"></a>00326 <span class="keywordflow">return</span> body.result();
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00332"></a><a class="code" href="a00241.html#gb7f1f1828ae2b330ce05b8513a495154">00332</a> Value <a class="code" href="a00241.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="l00333"></a>00333 <a class="code" href="a00120.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00334"></a>00334 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00335"></a>00335 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00120.html">affinity_partitioner</a>>
-<a name="l00336"></a>00336 ::run( range, body, partitioner );
-<a name="l00337"></a>00337 <span class="keywordflow">return</span> body.result();
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339
-<a name="l00340"></a>00340 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00342"></a>00342 <span class="preprocessor"></span>
-<a name="l00343"></a>00343 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00344"></a><a class="code" href="a00241.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00344</a> <span class="preprocessor"></span>Value <a class="code" href="a00241.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 <span class="keyword">const</span> <a class="code" href="a00168.html">simple_partitioner</a>& partitioner, <a class="code" href="a00175.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>,<span class="keyword">const</span> <a class="code" href="a00168.html">simple_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
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 <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="l00355"></a><a class="code" href="a00241.html#g630c90a399937d9d4ae70ff883186dfd">00355</a> Value <a class="code" href="a00241.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="l00356"></a>00356 <span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_context</a>& context ) {
-<a name="l00357"></a>00357 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00358"></a>00358 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>>
-<a name="l00359"></a>00359 ::run( range, body, partitioner, context );
-<a name="l00360"></a>00360 <span class="keywordflow">return</span> body.result();
-<a name="l00361"></a>00361 }
-<a name="l00362"></a>00362
-<a name="l00364"></a>00364
-<a name="l00365"></a>00365 <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="l00366"></a><a class="code" href="a00241.html#g496bd7eadb3b97495ccb5655ef90319e">00366</a> Value <a class="code" href="a00241.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="l00367"></a>00367 <a class="code" href="a00120.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_context</a>& context ) {
-<a name="l00368"></a>00368 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00369"></a>00369 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00120.html">affinity_partitioner</a>>
-<a name="l00370"></a>00370 ::run( range, body, partitioner, context );
-<a name="l00371"></a>00371 <span class="keywordflow">return</span> body.result();
-<a name="l00372"></a>00372 }
-<a name="l00373"></a>00373 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00374"></a>00374
-<a name="l00375"></a>00375
-<a name="l00376"></a>00376 } <span class="comment">// namespace tbb</span>
-<a name="l00377"></a>00377
-<a name="l00378"></a>00378 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
-<a name="l00379"></a>00379
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00341.html b/doc/html/a00341.html
new file mode 100644
index 0000000..32df0c7
--- /dev/null
+++ b/doc/html/a00341.html
@@ -0,0 +1,924 @@
+<!DOCTYPE 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-2010 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 <new></span>
+<a name="l00031"></a>00031
+<a name="l00032"></a>00032 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00033"></a>00033 <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="l00034"></a>00034 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</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 <algorithm></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="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span> <span class="comment">// VS2008/VC9 seems to have an issue; limits pull in math.h</span>
+<a name="l00047"></a>00047 <span class="preprocessor"> #pragma warning( push )</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4985 )</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">#include <limits></span> <span class="comment">/* std::numeric_limits */</span>
+<a name="l00051"></a>00051 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span>
+<a name="l00055"></a>00055 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings in /Wp64 mode</span>
+<a name="l00057"></a>00057 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</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="keyword">namespace </span>tbb {
+<a name="l00062"></a>00062
+<a name="l00063"></a>00063 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
+<a name="l00064"></a>00064 <span class="keyword">class </span>concurrent_vector;
+<a name="l00065"></a>00065
+<a name="l00067"></a>00067 <span class="keyword">namespace </span>internal {
+<a name="l00068"></a>00068
+<a name="l00070"></a>00070 <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="l00071"></a>00071
+<a name="l00073"></a>00073 <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="l00074"></a>00074
+<a name="l00076"></a>00076
+<a name="l00077"></a>00077 <span class="keyword">class </span>concurrent_vector_base_v3 {
+<a name="l00078"></a>00078 <span class="keyword">protected</span>:
+<a name="l00079"></a>00079
+<a name="l00080"></a>00080 <span class="comment">// Basic types declarations</span>
+<a name="l00081"></a>00081 <span class="keyword">typedef</span> size_t segment_index_t;
+<a name="l00082"></a>00082 <span class="keyword">typedef</span> size_t size_type;
+<a name="l00083"></a>00083
+<a name="l00084"></a>00084 <span class="comment">// Using enumerations due to Mac linking problems of static const variables</span>
+<a name="l00085"></a>00085 <span class="keyword">enum</span> {
+<a name="l00086"></a>00086 <span class="comment">// Size constants</span>
+<a name="l00087"></a>00087 default_initial_segments = 1, <span class="comment">// 2 initial items</span>
+<a name="l00089"></a>00089 <span class="comment"></span> pointers_per_short_table = 3, <span class="comment">// to fit into 8 words of entire structure</span>
+<a name="l00090"></a>00090 pointers_per_long_table = <span class="keyword">sizeof</span>(segment_index_t) * 8 <span class="comment">// one segment per bit</span>
+<a name="l00091"></a>00091 };
+<a name="l00092"></a>00092
+<a name="l00093"></a>00093 <span class="comment">// Segment pointer. Can be zero-initialized</span>
+<a name="l00094"></a>00094 <span class="keyword">struct </span>segment_t {
+<a name="l00095"></a>00095 <span class="keywordtype">void</span>* array;
+<a name="l00096"></a>00096 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00097"></a>00097 <span class="preprocessor"></span> ~segment_t() {
+<a name="l00098"></a>00098 __TBB_ASSERT( array <= internal::vector_allocation_error_flag, <span class="stringliteral">"should have been freed by clear"</span> );
+<a name="l00099"></a>00099 }
+<a name="l00100"></a>00100 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00101"></a>00101 };
+<a name="l00102"></a>00102
+<a name="l00103"></a>00103 <span class="comment">// Data fields</span>
+<a name="l00104"></a>00104
+<a name="l00106"></a>00106 <span class="keywordtype">void</span>* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
+<a name="l00107"></a>00107
+<a name="l00109"></a>00109 atomic<size_type> my_first_block;
+<a name="l00110"></a>00110
+<a name="l00112"></a>00112 atomic<size_type> my_early_size;
+<a name="l00113"></a>00113
+<a name="l00115"></a>00115 atomic<segment_t*> my_segment;
+<a name="l00116"></a>00116
+<a name="l00118"></a>00118 segment_t my_storage[pointers_per_short_table];
+<a name="l00119"></a>00119
+<a name="l00120"></a>00120 <span class="comment">// Methods</span>
+<a name="l00121"></a>00121
+<a name="l00122"></a>00122 concurrent_vector_base_v3() {
+<a name="l00123"></a>00123 my_early_size = 0;
+<a name="l00124"></a>00124 my_first_block = 0; <span class="comment">// here is not default_initial_segments</span>
+<a name="l00125"></a>00125 <span class="keywordflow">for</span>( segment_index_t i = 0; i < pointers_per_short_table; i++)
+<a name="l00126"></a>00126 my_storage[i].array = NULL;
+<a name="l00127"></a>00127 my_segment = my_storage;
+<a name="l00128"></a>00128 }
+<a name="l00129"></a>00129 __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
+<a name="l00130"></a>00130
+<a name="l00131"></a>00131 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
+<a name="l00132"></a>00132 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
+<a name="l00133"></a>00133 }
+<a name="l00134"></a>00134
+<a name="l00135"></a>00135 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
+<a name="l00136"></a>00136 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
+<a name="l00137"></a>00137 }
+<a name="l00138"></a>00138
+<a name="l00139"></a>00139 <span class="keyword">static</span> <span class="keyword">inline</span> segment_index_t segment_base_index_of( segment_index_t &index ) {
+<a name="l00140"></a>00140 segment_index_t k = segment_index_of( index );
+<a name="l00141"></a>00141 index -= segment_base(k);
+<a name="l00142"></a>00142 <span class="keywordflow">return</span> k;
+<a name="l00143"></a>00143 }
+<a name="l00144"></a>00144
+<a name="l00145"></a>00145 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
+<a name="l00146"></a>00146 <span class="keywordflow">return</span> segment_index_t(1)<<k; <span class="comment">// fake value for k==0</span>
+<a name="l00147"></a>00147 }
+<a name="l00148"></a>00148
+<a name="l00150"></a>00150 <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op1)(<span class="keywordtype">void</span>* begin, size_type n );
+<a name="l00151"></a>00151
+<a name="l00153"></a>00153 <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="l00154"></a>00154
+<a name="l00156"></a>00156 <span class="keyword">struct </span>internal_segments_table {
+<a name="l00157"></a>00157 segment_index_t first_block;
+<a name="l00158"></a>00158 <span class="keywordtype">void</span>* table[pointers_per_long_table];
+<a name="l00159"></a>00159 };
+<a name="l00160"></a>00160
+<a name="l00161"></a>00161 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
+<a name="l00162"></a>00162 size_type __TBB_EXPORTED_METHOD internal_capacity() <span class="keyword">const</span>;
+<a name="l00163"></a>00163 <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="l00164"></a>00164 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="l00165"></a>00165 <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
+<a name="l00166"></a>00166 segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
+<a name="l00167"></a>00167 <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="l00168"></a>00168 <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="l00169"></a>00169 <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="l00170"></a>00170 internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
+<a name="l00172"></a>00172 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception(size_type) <span class="keyword">const</span>;
+<a name="l00173"></a>00173 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
+<a name="l00174"></a>00174
+<a name="l00175"></a>00175 <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="l00176"></a>00176 internal_array_op1 destroy, internal_array_op2 init );
+<a name="l00177"></a>00177 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="l00178"></a>00178
+<a name="l00180"></a>00180 <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="l00181"></a>00181 <span class="keyword">private</span>:
+<a name="l00183"></a>00183 <span class="keyword">class </span>helper;
+<a name="l00184"></a>00184 <span class="keyword">friend</span> <span class="keyword">class </span>helper;
+<a name="l00185"></a>00185 };
+<a name="l00186"></a>00186
+<a name="l00187"></a>00187 <span class="keyword">typedef</span> concurrent_vector_base_v3 concurrent_vector_base;
+<a name="l00188"></a>00188
+<a name="l00190"></a>00190
+<a name="l00192"></a>00192 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00193"></a>00193 <span class="keyword">class </span>vector_iterator
+<a name="l00194"></a>00194 {
+<a name="l00196"></a>00196 Container* my_vector;
+<a name="l00197"></a>00197
+<a name="l00199"></a>00199 size_t my_index;
+<a name="l00200"></a>00200
+<a name="l00202"></a>00202
+<a name="l00203"></a>00203 <span class="keyword">mutable</span> Value* my_item;
+<a name="l00204"></a>00204
+<a name="l00205"></a>00205 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
+<a name="l00206"></a>00206 <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="l00207"></a>00207
+<a name="l00208"></a>00208 <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="l00209"></a>00209 <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="l00210"></a>00210
+<a name="l00211"></a>00211 <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="l00212"></a>00212 <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="l00213"></a>00213
+<a name="l00214"></a>00214 <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="l00215"></a>00215 <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="l00216"></a>00216
+<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00218"></a>00218 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
+<a name="l00219"></a>00219
+<a name="l00220"></a>00220 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00222"></a>00222 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00162.html">tbb::concurrent_vector</a>;
+<a name="l00223"></a>00223 <span class="preprocessor">#else</span>
+<a name="l00224"></a>00224 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
+<a name="l00225"></a>00225 <span class="preprocessor">#endif </span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span>
+<a name="l00227"></a>00227 vector_iterator( <span class="keyword">const</span> Container& vector, size_t index, <span class="keywordtype">void</span> *ptr = 0 ) :
+<a name="l00228"></a>00228 my_vector(const_cast<Container*>(&vector)),
+<a name="l00229"></a>00229 my_index(index),
+<a name="l00230"></a>00230 my_item(static_cast<Value*>(ptr))
+<a name="l00231"></a>00231 {}
+<a name="l00232"></a>00232
+<a name="l00233"></a>00233 <span class="keyword">public</span>:
+<a name="l00235"></a>00235 vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
+<a name="l00236"></a>00236
+<a name="l00237"></a>00237 vector_iterator( <span class="keyword">const</span> vector_iterator<Container,typename Container::value_type>& other ) :
+<a name="l00238"></a>00238 my_vector(other.my_vector),
+<a name="l00239"></a>00239 my_index(other.my_index),
+<a name="l00240"></a>00240 my_item(other.my_item)
+<a name="l00241"></a>00241 {}
+<a name="l00242"></a>00242
+<a name="l00243"></a>00243 vector_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00244"></a>00244 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index+offset );
+<a name="l00245"></a>00245 }
+<a name="l00246"></a>00246 vector_iterator &operator+=( ptrdiff_t offset ) {
+<a name="l00247"></a>00247 my_index+=offset;
+<a name="l00248"></a>00248 my_item = NULL;
+<a name="l00249"></a>00249 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00250"></a>00250 }
+<a name="l00251"></a>00251 vector_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00252"></a>00252 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index-offset );
+<a name="l00253"></a>00253 }
+<a name="l00254"></a>00254 vector_iterator &operator-=( ptrdiff_t offset ) {
+<a name="l00255"></a>00255 my_index-=offset;
+<a name="l00256"></a>00256 my_item = NULL;
+<a name="l00257"></a>00257 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00258"></a>00258 }
+<a name="l00259"></a>00259 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00260"></a>00260 Value* item = my_item;
+<a name="l00261"></a>00261 <span class="keywordflow">if</span>( !item ) {
+<a name="l00262"></a>00262 item = my_item = &my_vector->internal_subscript(my_index);
+<a name="l00263"></a>00263 }
+<a name="l00264"></a>00264 __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
+<a name="l00265"></a>00265 <span class="keywordflow">return</span> *item;
+<a name="l00266"></a>00266 }
+<a name="l00267"></a>00267 Value& <a class="code" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00268"></a>00268 <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
+<a name="l00269"></a>00269 }
+<a name="l00270"></a>00270 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00271"></a>00271
+<a name="l00273"></a>00273 vector_iterator& operator++() {
+<a name="l00274"></a>00274 size_t k = ++my_index;
+<a name="l00275"></a>00275 <span class="keywordflow">if</span>( my_item ) {
+<a name="l00276"></a>00276 <span class="comment">// Following test uses 2's-complement wizardry</span>
+<a name="l00277"></a>00277 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
+<a name="l00278"></a>00278 <span class="comment">// k is a power of two that is at least k-2</span>
+<a name="l00279"></a>00279 my_item= NULL;
+<a name="l00280"></a>00280 } <span class="keywordflow">else</span> {
+<a name="l00281"></a>00281 ++my_item;
+<a name="l00282"></a>00282 }
+<a name="l00283"></a>00283 }
+<a name="l00284"></a>00284 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00285"></a>00285 }
+<a name="l00286"></a>00286
+<a name="l00288"></a>00288 vector_iterator& operator--() {
+<a name="l00289"></a>00289 __TBB_ASSERT( my_index>0, <span class="stringliteral">"operator--() applied to iterator already at beginning of concurrent_vector"</span> );
+<a name="l00290"></a>00290 size_t k = my_index--;
+<a name="l00291"></a>00291 <span class="keywordflow">if</span>( my_item ) {
+<a name="l00292"></a>00292 <span class="comment">// Following test uses 2's-complement wizardry</span>
+<a name="l00293"></a>00293 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
+<a name="l00294"></a>00294 <span class="comment">// k is a power of two that is at least k-2 </span>
+<a name="l00295"></a>00295 my_item= NULL;
+<a name="l00296"></a>00296 } <span class="keywordflow">else</span> {
+<a name="l00297"></a>00297 --my_item;
+<a name="l00298"></a>00298 }
+<a name="l00299"></a>00299 }
+<a name="l00300"></a>00300 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00301"></a>00301 }
+<a name="l00302"></a>00302
+<a name="l00304"></a>00304 vector_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00305"></a>00305 vector_iterator result = *<span class="keyword">this</span>;
+<a name="l00306"></a>00306 operator++();
+<a name="l00307"></a>00307 <span class="keywordflow">return</span> result;
+<a name="l00308"></a>00308 }
+<a name="l00309"></a>00309
+<a name="l00311"></a>00311 vector_iterator operator--(<span class="keywordtype">int</span>) {
+<a name="l00312"></a>00312 vector_iterator result = *<span class="keyword">this</span>;
+<a name="l00313"></a>00313 operator--();
+<a name="l00314"></a>00314 <span class="keywordflow">return</span> result;
+<a name="l00315"></a>00315 }
+<a name="l00316"></a>00316
+<a name="l00317"></a>00317 <span class="comment">// STL support</span>
+<a name="l00318"></a>00318
+<a name="l00319"></a>00319 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00320"></a>00320 <span class="keyword">typedef</span> Value value_type;
+<a name="l00321"></a>00321 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00322"></a>00322 <span class="keyword">typedef</span> Value& reference;
+<a name="l00323"></a>00323 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
+<a name="l00324"></a>00324 };
+<a name="l00325"></a>00325
+<a name="l00326"></a>00326 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
+<a name="l00327"></a>00327 vector_iterator<Container,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<Container,T>& v ) {
+<a name="l00328"></a>00328 <span class="keywordflow">return</span> vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
+<a name="l00329"></a>00329 }
+<a name="l00330"></a>00330
+<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00332"></a>00332 <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="l00333"></a>00333 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_vector == j.my_vector;
+<a name="l00334"></a>00334 }
+<a name="l00335"></a>00335
+<a name="l00336"></a>00336 <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="l00337"></a>00337 <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="l00338"></a>00338 <span class="keywordflow">return</span> !(i==j);
+<a name="l00339"></a>00339 }
+<a name="l00340"></a>00340
+<a name="l00341"></a>00341 <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="l00342"></a>00342 <span class="keywordtype">bool</span> operator<( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00343"></a>00343 <span class="keywordflow">return</span> i.my_index<j.my_index;
+<a name="l00344"></a>00344 }
+<a name="l00345"></a>00345
+<a name="l00346"></a>00346 <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="l00347"></a>00347 <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="l00348"></a>00348 <span class="keywordflow">return</span> j<i;
+<a name="l00349"></a>00349 }
+<a name="l00350"></a>00350
+<a name="l00351"></a>00351 <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="l00352"></a>00352 <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="l00353"></a>00353 <span class="keywordflow">return</span> !(i<j);
+<a name="l00354"></a>00354 }
+<a name="l00355"></a>00355
+<a name="l00356"></a>00356 <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="l00357"></a>00357 <span class="keywordtype">bool</span> operator<=( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00358"></a>00358 <span class="keywordflow">return</span> !(j<i);
+<a name="l00359"></a>00359 }
+<a name="l00360"></a>00360
+<a name="l00361"></a>00361 <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="l00362"></a>00362 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="l00363"></a>00363 <span class="keywordflow">return</span> ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
+<a name="l00364"></a>00364 }
+<a name="l00365"></a>00365
+<a name="l00366"></a>00366 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00367"></a>00367 <span class="keyword">class </span>allocator_base {
+<a name="l00368"></a>00368 <span class="keyword">public</span>:
+<a name="l00369"></a>00369 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template
+<a name="l00370"></a>00370 rebind<T>::other allocator_type;
+<a name="l00371"></a>00371 allocator_type my_allocator;
+<a name="l00372"></a>00372
+<a name="l00373"></a>00373 allocator_base(<span class="keyword">const</span> allocator_type &a = allocator_type() ) : my_allocator(a) {}
+<a name="l00374"></a>00374 };
+<a name="l00375"></a>00375
+<a name="l00376"></a>00376 } <span class="comment">// namespace internal</span>
+<a name="l00378"></a>00378 <span class="comment"></span>
+<a name="l00380"></a>00380
+<a name="l00441"></a>00441 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00442"></a><a class="code" href="a00162.html">00442</a> <span class="keyword">class </span><a class="code" href="a00162.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
+<a name="l00443"></a>00443 <span class="keyword">private</span> internal::concurrent_vector_base {
+<a name="l00444"></a>00444 <span class="keyword">private</span>:
+<a name="l00445"></a>00445 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00446"></a>00446 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00148.html">blocked_range</a><I> {
+<a name="l00447"></a>00447 <span class="keyword">public</span>:
+<a name="l00448"></a>00448 <span class="keyword">typedef</span> T value_type;
+<a name="l00449"></a>00449 <span class="keyword">typedef</span> T& reference;
+<a name="l00450"></a>00450 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00451"></a>00451 <span class="keyword">typedef</span> I iterator;
+<a name="l00452"></a>00452 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00453"></a>00453 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00148.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
+<a name="l00454"></a>00454 template<typename U>
+<a name="l00455"></a>00455 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00148.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
+<a name="l00456"></a>00456 generic_range_type( generic_range_type& r, <a class="code" href="a00198.html">split</a> ) : <a class="code" href="a00148.html">blocked_range<I></a>(r,<a class="code" href="a00198.html">split</a>()) {}
+<a name="l00457"></a>00457 };
+<a name="l00458"></a>00458
+<a name="l00459"></a>00459 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00460"></a>00460 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
+<a name="l00461"></a>00461 <span class="keyword">public</span>:
+<a name="l00462"></a>00462 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00463"></a>00463 <span class="comment">// STL compatible types</span>
+<a name="l00464"></a>00464 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00465"></a>00465 <span class="keyword">typedef</span> internal::concurrent_vector_base_v3::size_type size_type;
+<a name="l00466"></a>00466 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_base<T, A>::allocator_type allocator_type;
+<a name="l00467"></a>00467
+<a name="l00468"></a>00468 <span class="keyword">typedef</span> T value_type;
+<a name="l00469"></a>00469 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00470"></a>00470 <span class="keyword">typedef</span> T& reference;
+<a name="l00471"></a>00471 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00472"></a>00472 <span class="keyword">typedef</span> T *pointer;
+<a name="l00473"></a>00473 <span class="keyword">typedef</span> <span class="keyword">const</span> T *const_pointer;
+<a name="l00474"></a>00474
+<a name="l00475"></a>00475 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,T> iterator;
+<a name="l00476"></a>00476 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,const T> const_iterator;
+<a name="l00477"></a>00477
+<a name="l00478"></a>00478 <span class="preprocessor">#if !defined(_MSC_VER) || _CPPLIB_VER>=300 </span>
+<a name="l00479"></a>00479 <span class="preprocessor"></span> <span class="comment">// Assume ISO standard definition of std::reverse_iterator</span>
+<a name="l00480"></a>00480 <span class="keyword">typedef</span> std::reverse_iterator<iterator> reverse_iterator;
+<a name="l00481"></a>00481 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator> const_reverse_iterator;
+<a name="l00482"></a>00482 <span class="preprocessor">#else</span>
+<a name="l00483"></a>00483 <span class="preprocessor"></span> <span class="comment">// Use non-standard std::reverse_iterator</span>
+<a name="l00484"></a>00484 <span class="keyword">typedef</span> std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
+<a name="l00485"></a>00485 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
+<a name="l00486"></a>00486 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && (_MSC_VER<1300) */</span>
+<a name="l00487"></a>00487
+<a name="l00488"></a>00488 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00489"></a>00489 <span class="comment">// Parallel algorithm support</span>
+<a name="l00490"></a>00490 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00491"></a>00491 <span class="keyword">typedef</span> generic_range_type<iterator> range_type;
+<a name="l00492"></a>00492 <span class="keyword">typedef</span> generic_range_type<const_iterator> const_range_type;
+<a name="l00493"></a>00493
+<a name="l00494"></a>00494 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00495"></a>00495 <span class="comment">// STL compatible constructors & destructors</span>
+<a name="l00496"></a>00496 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00497"></a>00497
+<a name="l00499"></a><a class="code" href="a00162.html#2c8ca9cabfcd30ad5943324c853664b5">00499</a> <span class="keyword">explicit</span> <a class="code" href="a00162.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00500"></a>00500 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+<a name="l00501"></a>00501 {
+<a name="l00502"></a>00502 vector_allocator_ptr = &internal_allocator;
+<a name="l00503"></a>00503 }
+<a name="l00504"></a>00504
+<a name="l00506"></a><a class="code" href="a00162.html#dd8a200b99a8088435a37934b58fe335">00506</a> <a class="code" href="a00162.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
+<a name="l00507"></a>00507 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+<a name="l00508"></a>00508 {
+<a name="l00509"></a>00509 vector_allocator_ptr = &internal_allocator;
+<a name="l00510"></a>00510 __TBB_TRY {
+<a name="l00511"></a>00511 internal_copy(vector, <span class="keyword">sizeof</span>(T), ©_array);
+<a name="l00512"></a>00512 } __TBB_CATCH(...) {
+<a name="l00513"></a>00513 segment_t *table = my_segment;
+<a name="l00514"></a>00514 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00515"></a>00515 __TBB_RETHROW();
+<a name="l00516"></a>00516 }
+<a name="l00517"></a>00517 }
+<a name="l00518"></a>00518
+<a name="l00520"></a>00520 <span class="keyword">template</span><<span class="keyword">class</span> M>
+<a name="l00521"></a><a class="code" href="a00162.html#64432f13f7b29bfe4acfb5568f34f3a8">00521</a> <a class="code" href="a00162.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
+<a name="l00522"></a>00522 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+<a name="l00523"></a>00523 {
+<a name="l00524"></a>00524 vector_allocator_ptr = &internal_allocator;
+<a name="l00525"></a>00525 __TBB_TRY {
+<a name="l00526"></a>00526 internal_copy(vector.<a class="code" href="a00162.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), ©_array);
+<a name="l00527"></a>00527 } __TBB_CATCH(...) {
+<a name="l00528"></a>00528 segment_t *table = my_segment;
+<a name="l00529"></a>00529 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00530"></a>00530 __TBB_RETHROW();
+<a name="l00531"></a>00531 }
+<a name="l00532"></a>00532 }
+<a name="l00533"></a>00533
+<a name="l00535"></a><a class="code" href="a00162.html#2a2e261dfe1cab3f73f7b1a94137cfca">00535</a> <span class="keyword">explicit</span> <a class="code" href="a00162.html">concurrent_vector</a>(size_type n)
+<a name="l00536"></a>00536 {
+<a name="l00537"></a>00537 vector_allocator_ptr = &internal_allocator;
+<a name="l00538"></a>00538 __TBB_TRY {
+<a name="l00539"></a>00539 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
+<a name="l00540"></a>00540 } __TBB_CATCH(...) {
+<a name="l00541"></a>00541 segment_t *table = my_segment;
+<a name="l00542"></a>00542 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00543"></a>00543 __TBB_RETHROW();
+<a name="l00544"></a>00544 }
+<a name="l00545"></a>00545 }
+<a name="l00546"></a>00546
+<a name="l00548"></a><a class="code" href="a00162.html#3883a8a908b44e249a57f454de3f55d8">00548</a> <a class="code" href="a00162.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00549"></a>00549 : internal::allocator_base<T, A>(a)
+<a name="l00550"></a>00550 {
+<a name="l00551"></a>00551 vector_allocator_ptr = &internal_allocator;
+<a name="l00552"></a>00552 __TBB_TRY {
+<a name="l00553"></a>00553 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00554"></a>00554 } __TBB_CATCH(...) {
+<a name="l00555"></a>00555 segment_t *table = my_segment;
+<a name="l00556"></a>00556 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00557"></a>00557 __TBB_RETHROW();
+<a name="l00558"></a>00558 }
+<a name="l00559"></a>00559 }
+<a name="l00560"></a>00560
+<a name="l00562"></a>00562 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00563"></a><a class="code" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">00563</a> <a class="code" href="a00162.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00564"></a>00564 : internal::allocator_base<T, A>(a)
+<a name="l00565"></a>00565 {
+<a name="l00566"></a>00566 vector_allocator_ptr = &internal_allocator;
+<a name="l00567"></a>00567 __TBB_TRY {
+<a name="l00568"></a>00568 internal_assign_range(first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+<a name="l00569"></a>00569 } __TBB_CATCH(...) {
+<a name="l00570"></a>00570 segment_t *table = my_segment;
+<a name="l00571"></a>00571 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00572"></a>00572 __TBB_RETHROW();
+<a name="l00573"></a>00573 }
+<a name="l00574"></a>00574 }
+<a name="l00575"></a>00575
+<a name="l00577"></a><a class="code" href="a00162.html#691f0f3cda3e489c37a657016e375eaf">00577</a> <a class="code" href="a00162.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector</a>& vector ) {
+<a name="l00578"></a>00578 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
+<a name="l00579"></a>00579 internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
+<a name="l00580"></a>00580 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00581"></a>00581 }
+<a name="l00582"></a>00582
+<a name="l00584"></a>00584 <span class="keyword">template</span><<span class="keyword">class</span> M>
+<a name="l00585"></a><a class="code" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">00585</a> <a class="code" href="a00162.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector<T, M></a>& vector ) {
+<a name="l00586"></a>00586 <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
+<a name="l00587"></a>00587 internal_assign(vector.internal_vector_base(),
+<a name="l00588"></a>00588 <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
+<a name="l00589"></a>00589 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00590"></a>00590 }
+<a name="l00591"></a>00591
+<a name="l00592"></a>00592 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00593"></a>00593 <span class="comment">// Concurrent operations</span>
+<a name="l00594"></a>00594 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00596"></a>00596 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00597"></a>00597 <span class="preprocessor"></span>
+<a name="l00598"></a><a class="code" href="a00162.html#30484e3959892fd5392fa93c873c31f0">00598</a> size_type grow_by( size_type delta ) {
+<a name="l00599"></a>00599 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
+<a name="l00600"></a>00600 }
+<a name="l00601"></a>00601 <span class="preprocessor">#else</span>
+<a name="l00602"></a>00602 <span class="preprocessor"></span>
+<a name="l00603"></a><a class="code" href="a00162.html#c8177b1865270ea68aa1ab9148e5e35e">00603</a> iterator grow_by( size_type delta ) {
+<a name="l00604"></a>00604 <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="l00605"></a>00605 }
+<a name="l00606"></a>00606 <span class="preprocessor">#endif</span>
+<a name="l00607"></a>00607 <span class="preprocessor"></span>
+<a name="l00609"></a>00609 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00610"></a>00610 <span class="preprocessor"></span>
+<a name="l00611"></a><a class="code" href="a00162.html#38274ab3f772ecba600c7daca7690102">00611</a> size_type grow_by( size_type delta, const_reference t ) {
+<a name="l00612"></a>00612 <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="l00613"></a>00613 }
+<a name="l00614"></a>00614 <span class="preprocessor">#else</span>
+<a name="l00615"></a>00615 <span class="preprocessor"></span>
+<a name="l00616"></a><a class="code" href="a00162.html#473a59a4c9308b93411b898b3110d26c">00616</a> iterator grow_by( size_type delta, const_reference t ) {
+<a name="l00617"></a>00617 <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="l00618"></a>00618 }
+<a name="l00619"></a>00619 <span class="preprocessor">#endif</span>
+<a name="l00620"></a>00620 <span class="preprocessor"></span>
+<a name="l00622"></a>00622 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00623"></a>00623 <span class="preprocessor"></span>
+<a name="l00625"></a><a class="code" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">00625</a> <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
+<a name="l00626"></a>00626 <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="l00627"></a>00627 };
+<a name="l00628"></a>00628 <span class="preprocessor">#else</span>
+<a name="l00629"></a>00629 <span class="preprocessor"></span>
+<a name="l00633"></a><a class="code" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">00633</a> iterator grow_to_at_least( size_type n ) {
+<a name="l00634"></a>00634 size_type m=0;
+<a name="l00635"></a>00635 <span class="keywordflow">if</span>( n ) {
+<a name="l00636"></a>00636 m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
+<a name="l00637"></a>00637 <span class="keywordflow">if</span>( m>n ) m=n;
+<a name="l00638"></a>00638 }
+<a name="l00639"></a>00639 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, m);
+<a name="l00640"></a>00640 };
+<a name="l00641"></a>00641 <span class="preprocessor">#endif</span>
+<a name="l00642"></a>00642 <span class="preprocessor"></span>
+<a name="l00644"></a>00644 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00645"></a><a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">00645</a> <span class="preprocessor"></span> size_type push_back( const_reference item )
+<a name="l00646"></a>00646 <span class="preprocessor">#else</span>
+<a name="l00647"></a>00647 <span class="preprocessor"></span>
+<a name="l00648"></a>00648 iterator push_back( const_reference item )
+<a name="l00649"></a>00649 <span class="preprocessor">#endif</span>
+<a name="l00650"></a>00650 <span class="preprocessor"></span> {
+<a name="l00651"></a>00651 size_type k;
+<a name="l00652"></a>00652 <span class="keywordtype">void</span> *ptr = internal_push_back(<span class="keyword">sizeof</span>(T),k);
+<a name="l00653"></a>00653 internal_loop_guide loop(1, ptr);
+<a name="l00654"></a>00654 loop.init(&item);
+<a name="l00655"></a>00655 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00656"></a>00656 <span class="preprocessor"></span> <span class="keywordflow">return</span> k;
+<a name="l00657"></a>00657 <span class="preprocessor">#else</span>
+<a name="l00658"></a>00658 <span class="preprocessor"></span> <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, k, ptr);
+<a name="l00659"></a>00659 <span class="preprocessor">#endif</span>
+<a name="l00660"></a>00660 <span class="preprocessor"></span> }
+<a name="l00661"></a>00661
+<a name="l00663"></a>00663
+<a name="l00665"></a><a class="code" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">00665</a> reference operator[]( size_type index ) {
+<a name="l00666"></a>00666 <span class="keywordflow">return</span> internal_subscript(index);
+<a name="l00667"></a>00667 }
+<a name="l00668"></a>00668
+<a name="l00670"></a><a class="code" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">00670</a> const_reference operator[]( size_type index )<span class="keyword"> const </span>{
+<a name="l00671"></a>00671 <span class="keywordflow">return</span> internal_subscript(index);
+<a name="l00672"></a>00672 }
+<a name="l00673"></a>00673
+<a name="l00675"></a><a class="code" href="a00162.html#0c073ca43e787c7cbf7b0e26d2221748">00675</a> reference at( size_type index ) {
+<a name="l00676"></a>00676 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
+<a name="l00677"></a>00677 }
+<a name="l00678"></a>00678
+<a name="l00680"></a><a class="code" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">00680</a> const_reference at( size_type index )<span class="keyword"> const </span>{
+<a name="l00681"></a>00681 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
+<a name="l00682"></a>00682 }
+<a name="l00683"></a>00683
+<a name="l00685"></a><a class="code" href="a00162.html#a4c6ffff3bf08b92939aa2fc516edfba">00685</a> range_type range( size_t grainsize = 1) {
+<a name="l00686"></a>00686 <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
+<a name="l00687"></a>00687 }
+<a name="l00688"></a>00688
+<a name="l00690"></a><a class="code" href="a00162.html#3d09ccfb581b879ae64203741035e193">00690</a> const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
+<a name="l00691"></a>00691 <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
+<a name="l00692"></a>00692 }
+<a name="l00693"></a>00693 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00694"></a>00694 <span class="comment">// Capacity</span>
+<a name="l00695"></a>00695 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00697"></a><a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">00697</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
+<a name="l00698"></a>00698 size_type sz = my_early_size, cp = internal_capacity();
+<a name="l00699"></a>00699 <span class="keywordflow">return</span> cp < sz ? cp : sz;
+<a name="l00700"></a>00700 }
+<a name="l00701"></a>00701
+<a name="l00703"></a><a class="code" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">00703</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
+<a name="l00704"></a>00704
+<a name="l00706"></a><a class="code" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">00706</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
+<a name="l00707"></a>00707
+<a name="l00709"></a>00709
+<a name="l00711"></a><a class="code" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">00711</a> <span class="keywordtype">void</span> reserve( size_type n ) {
+<a name="l00712"></a>00712 <span class="keywordflow">if</span>( n )
+<a name="l00713"></a>00713 internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
+<a name="l00714"></a>00714 }
+<a name="l00715"></a>00715
+<a name="l00717"></a><a class="code" href="a00162.html#8dfb0cb0eef96d440b4dcf801807a718">00717</a> <span class="keywordtype">void</span> resize( size_type n ) {
+<a name="l00718"></a>00718 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
+<a name="l00719"></a>00719 }
+<a name="l00720"></a>00720
+<a name="l00722"></a><a class="code" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">00722</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
+<a name="l00723"></a>00723 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00724"></a>00724 }
+<a name="l00725"></a>00725
+<a name="l00726"></a>00726 <span class="preprocessor">#if TBB_DEPRECATED </span>
+<a name="l00728"></a><a class="code" href="a00162.html#1693d1da41b1a8235871be9c6633be35">00728</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
+<a name="l00729"></a>00729 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
+<a name="l00730"></a>00730
+<a name="l00732"></a>00732 <span class="keywordtype">void</span> shrink_to_fit();
+<a name="l00733"></a>00733
+<a name="l00735"></a><a class="code" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">00735</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(T);}
+<a name="l00736"></a>00736
+<a name="l00737"></a>00737 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00738"></a>00738 <span class="comment">// STL support</span>
+<a name="l00739"></a>00739 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00740"></a>00740
+<a name="l00742"></a><a class="code" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">00742</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
+<a name="l00744"></a><a class="code" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">00744</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
+<a name="l00746"></a><a class="code" href="a00162.html#78a06182276ff758788d4c0623ae0d71">00746</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00748"></a><a class="code" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00748</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00750"></a><a class="code" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">00750</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00752"></a><a class="code" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">00752</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00754"></a><a class="code" href="a00162.html#5e220926d09236d98f04fe0721e5f9a1">00754</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
+<a name="l00756"></a><a class="code" href="a00162.html#290119a4eb43cd6a9e98fa17016ba3c2">00756</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
+<a name="l00758"></a><a class="code" href="a00162.html#9f9c103e18d5f212703805354074ad44">00758</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00760"></a><a class="code" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">00760</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00762"></a><a class="code" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">00762</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00764"></a><a class="code" href="a00162.html#fff9cece89438587997ebedf93c5e962">00764</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00766"></a><a class="code" href="a00162.html#15181759c0bfa2ddce5d10c7550e0002">00766</a> reference front() {
+<a name="l00767"></a>00767 __TBB_ASSERT( size()>0, NULL);
+<a name="l00768"></a>00768 <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
+<a name="l00769"></a>00769 }
+<a name="l00771"></a><a class="code" href="a00162.html#502615a858eb9fa0390ee59169065e90">00771</a> const_reference front()<span class="keyword"> const </span>{
+<a name="l00772"></a>00772 __TBB_ASSERT( size()>0, NULL);
+<a name="l00773"></a>00773 <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
+<a name="l00774"></a>00774 }
+<a name="l00776"></a><a class="code" href="a00162.html#41ce48d6015a1a2812d41cf620ec3476">00776</a> reference back() {
+<a name="l00777"></a>00777 __TBB_ASSERT( size()>0, NULL);
+<a name="l00778"></a>00778 <span class="keywordflow">return</span> internal_subscript( size()-1 );
+<a name="l00779"></a>00779 }
+<a name="l00781"></a><a class="code" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">00781</a> const_reference back()<span class="keyword"> const </span>{
+<a name="l00782"></a>00782 __TBB_ASSERT( size()>0, NULL);
+<a name="l00783"></a>00783 <span class="keywordflow">return</span> internal_subscript( size()-1 );
+<a name="l00784"></a>00784 }
+<a name="l00786"></a><a class="code" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">00786</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00787"></a>00787
+<a name="l00789"></a><a class="code" href="a00162.html#423e5aa15e0e3309ad86d026fd85f6f6">00789</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
+<a name="l00790"></a>00790 clear();
+<a name="l00791"></a>00791 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00792"></a>00792 }
+<a name="l00793"></a>00793
+<a name="l00795"></a>00795 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00796"></a><a class="code" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">00796</a> <span class="keywordtype">void</span> assign(I first, I last) {
+<a name="l00797"></a>00797 clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+<a name="l00798"></a>00798 }
+<a name="l00799"></a>00799
+<a name="l00801"></a><a class="code" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">00801</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00162.html">concurrent_vector</a> &vector) {
+<a name="l00802"></a>00802 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
+<a name="l00803"></a>00803 concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
+<a name="l00804"></a>00804 std::swap(this->my_allocator, vector.my_allocator);
+<a name="l00805"></a>00805 }
+<a name="l00806"></a>00806 }
+<a name="l00807"></a>00807
+<a name="l00809"></a>00809
+<a name="l00810"></a><a class="code" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">00810</a> <span class="keywordtype">void</span> clear() {
+<a name="l00811"></a>00811 internal_clear(&destroy_array);
+<a name="l00812"></a>00812 }
+<a name="l00813"></a>00813
+<a name="l00815"></a><a class="code" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">00815</a> ~<a class="code" href="a00162.html">concurrent_vector</a>() {
+<a name="l00816"></a>00816 segment_t *table = my_segment;
+<a name="l00817"></a>00817 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00818"></a>00818 <span class="comment">// base class destructor call should be then</span>
+<a name="l00819"></a>00819 }
+<a name="l00820"></a>00820
+<a name="l00821"></a>00821 <span class="keyword">const</span> internal::concurrent_vector_base_v3 &internal_vector_base()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l00822"></a>00822 <span class="keyword">private</span>:
+<a name="l00824"></a>00824 <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
+<a name="l00825"></a>00825 <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
+<a name="l00826"></a>00826 }
+<a name="l00828"></a>00828 <span class="keywordtype">void</span> internal_free_segments(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block);
+<a name="l00829"></a>00829
+<a name="l00831"></a>00831 T& internal_subscript( size_type index ) <span class="keyword">const</span>;
+<a name="l00832"></a>00832
+<a name="l00834"></a>00834 T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
+<a name="l00835"></a>00835
+<a name="l00837"></a>00837 <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
+<a name="l00838"></a>00838 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(p), &destroy_array, p? &initialize_array_by : &initialize_array );
+<a name="l00839"></a>00839 }
+<a name="l00840"></a>00840
+<a name="l00842"></a>00842 <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
+<a name="l00843"></a>00843
+<a name="l00845"></a>00845 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00846"></a>00846 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
+<a name="l00847"></a>00847 internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
+<a name="l00848"></a>00848 }
+<a name="l00850"></a>00850 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00851"></a>00851 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
+<a name="l00852"></a>00852 internal_assign_iterators(first, last);
+<a name="l00853"></a>00853 }
+<a name="l00855"></a>00855 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00856"></a>00856 <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
+<a name="l00857"></a>00857
+<a name="l00859"></a>00859 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>*, size_type n );
+<a name="l00860"></a>00860
+<a name="l00862"></a>00862 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00863"></a>00863
+<a name="l00865"></a>00865 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00866"></a>00866
+<a name="l00868"></a>00868 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00869"></a>00869
+<a name="l00871"></a>00871 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC destroy_array( <span class="keywordtype">void</span>* begin, size_type n );
+<a name="l00872"></a>00872
+<a name="l00874"></a>00874 <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
+<a name="l00875"></a>00875 <span class="keyword">public</span>:
+<a name="l00876"></a>00876 <span class="keyword">const</span> pointer array;
+<a name="l00877"></a>00877 <span class="keyword">const</span> size_type n;
+<a name="l00878"></a>00878 size_type i;
+<a name="l00879"></a>00879 internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
+<a name="l00880"></a>00880 : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
+<a name="l00881"></a>00881 <span class="keywordtype">void</span> init() { <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
+<a name="l00882"></a>00882 <span class="keywordtype">void</span> init(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(*static_cast<const T*>(src)); }
+<a name="l00883"></a>00883 <span class="keywordtype">void</span> copy(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(static_cast<const T*>(src)[i]); }
+<a name="l00884"></a>00884 <span class="keywordtype">void</span> assign(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) array[i] = static_cast<const T*>(src)[i]; }
+<a name="l00885"></a>00885 <span class="keyword">template</span><<span class="keyword">class</span> I> <span class="keywordtype">void</span> iterate(I &src) { <span class="keywordflow">for</span>(; i < n; ++i, ++src) <span class="keyword">new</span>( &array[i] ) T( *src ); }
+<a name="l00886"></a>00886 ~internal_loop_guide() {
+<a name="l00887"></a>00887 <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zerroing on the rest of items</span>
+<a name="l00888"></a>00888 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
+<a name="l00889"></a>00889 }
+<a name="l00890"></a>00890 };
+<a name="l00891"></a>00891 };
+<a name="l00892"></a>00892
+<a name="l00893"></a>00893 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00894"></a><a class="code" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">00894</a> <span class="keywordtype">void</span> <a class="code" href="a00162.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
+<a name="l00895"></a>00895 internal_segments_table old;
+<a name="l00896"></a>00896 __TBB_TRY {
+<a name="l00897"></a>00897 <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, ©_array ) )
+<a name="l00898"></a>00898 internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
+<a name="l00899"></a>00899 } __TBB_CATCH(...) {
+<a name="l00900"></a>00900 <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="l00901"></a>00901 internal_free_segments( old.table, 1, old.first_block );
+<a name="l00902"></a>00902 __TBB_RETHROW();
+<a name="l00903"></a>00903 }
+<a name="l00904"></a>00904 }
+<a name="l00905"></a>00905
+<a name="l00906"></a>00906 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00907"></a>00907 <span class="keywordtype">void</span> <a class="code" href="a00162.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="l00908"></a>00908 <span class="comment">// Free the arrays</span>
+<a name="l00909"></a>00909 <span class="keywordflow">while</span>( k > first_block ) {
+<a name="l00910"></a>00910 --k;
+<a name="l00911"></a>00911 T* array = static_cast<T*>(table[k]);
+<a name="l00912"></a>00912 table[k] = NULL;
+<a name="l00913"></a>00913 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
+<a name="l00914"></a>00914 this->my_allocator.deallocate( array, segment_size(k) );
+<a name="l00915"></a>00915 }
+<a name="l00916"></a>00916 T* array = static_cast<T*>(table[0]);
+<a name="l00917"></a>00917 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
+<a name="l00918"></a>00918 __TBB_ASSERT( first_block > 0, NULL );
+<a name="l00919"></a>00919 <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
+<a name="l00920"></a>00920 this->my_allocator.deallocate( array, segment_size(first_block) );
+<a name="l00921"></a>00921 }
+<a name="l00922"></a>00922 }
+<a name="l00923"></a>00923
+<a name="l00924"></a>00924 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00925"></a>00925 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
+<a name="l00926"></a>00926 __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
+<a name="l00927"></a>00927 size_type j = index;
+<a name="l00928"></a>00928 segment_index_t k = segment_base_index_of( j );
+<a name="l00929"></a>00929 __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
+<a name="l00930"></a>00930 <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
+<a name="l00931"></a>00931 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00932"></a>00932 <span class="preprocessor"></span> T* array = static_cast<T*>( tbb::internal::itt_load_pointer_v3(&my_segment[k].array));
+<a name="l00933"></a>00933 <span class="preprocessor">#else</span>
+<a name="l00934"></a>00934 <span class="preprocessor"></span> T* array = static_cast<T*>(my_segment[k].array);
+<a name="l00935"></a>00935 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
+<a name="l00936"></a>00936 __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
+<a name="l00937"></a>00937 __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
+<a name="l00938"></a>00938 <span class="keywordflow">return</span> array[j];
+<a name="l00939"></a>00939 }
+<a name="l00940"></a>00940
+<a name="l00941"></a>00941 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00942"></a>00942 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
+<a name="l00943"></a>00943 <span class="keywordflow">if</span>( index >= my_early_size )
+<a name="l00944"></a>00944 internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
+<a name="l00945"></a>00945 size_type j = index;
+<a name="l00946"></a>00946 segment_index_t k = segment_base_index_of( j );
+<a name="l00947"></a>00947 <span class="keywordflow">if</span>( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
+<a name="l00948"></a>00948 internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
+<a name="l00949"></a>00949 <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
+<a name="l00950"></a>00950 <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
+<a name="l00951"></a>00951 internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
+<a name="l00952"></a>00952 <span class="keywordflow">return</span> static_cast<T*>(array)[j];
+<a name="l00953"></a>00953 }
+<a name="l00954"></a>00954
+<a name="l00955"></a>00955 <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="l00956"></a>00956 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
+<a name="l00957"></a>00957 __TBB_ASSERT(my_early_size == 0, NULL);
+<a name="l00958"></a>00958 size_type n = std::distance(first, last);
+<a name="l00959"></a>00959 <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
+<a name="l00960"></a>00960 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
+<a name="l00961"></a>00961 my_early_size = n;
+<a name="l00962"></a>00962 segment_index_t k = 0;
+<a name="l00963"></a>00963 size_type sz = segment_size( my_first_block );
+<a name="l00964"></a>00964 <span class="keywordflow">while</span>( sz < n ) {
+<a name="l00965"></a>00965 internal_loop_guide loop(sz, my_segment[k].array);
+<a name="l00966"></a>00966 loop.iterate(first);
+<a name="l00967"></a>00967 n -= sz;
+<a name="l00968"></a>00968 <span class="keywordflow">if</span>( !k ) k = my_first_block;
+<a name="l00969"></a>00969 <span class="keywordflow">else</span> { ++k; sz <<= 1; }
+<a name="l00970"></a>00970 }
+<a name="l00971"></a>00971 internal_loop_guide loop(n, my_segment[k].array);
+<a name="l00972"></a>00972 loop.iterate(first);
+<a name="l00973"></a>00973 }
+<a name="l00974"></a>00974
+<a name="l00975"></a>00975 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00976"></a>00976 <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="l00977"></a>00977 internal_loop_guide loop(n, begin); loop.init();
+<a name="l00978"></a>00978 }
+<a name="l00979"></a>00979
+<a name="l00980"></a>00980 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00981"></a>00981 <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="l00982"></a>00982 internal_loop_guide loop(n, begin); loop.init(src);
+<a name="l00983"></a>00983 }
+<a name="l00984"></a>00984
+<a name="l00985"></a>00985 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00986"></a>00986 <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="l00987"></a>00987 internal_loop_guide loop(n, dst); loop.copy(src);
+<a name="l00988"></a>00988 }
+<a name="l00989"></a>00989
+<a name="l00990"></a>00990 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00991"></a>00991 <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="l00992"></a>00992 internal_loop_guide loop(n, dst); loop.assign(src);
+<a name="l00993"></a>00993 }
+<a name="l00994"></a>00994
+<a name="l00995"></a>00995 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00996"></a>00996 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warning</span>
+<a name="l00997"></a>00997 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00998"></a>00998 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4189)</span>
+<a name="l00999"></a>00999 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l01000"></a>01000 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l01001"></a>01001 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
+<a name="l01002"></a>01002 T* array = static_cast<T*>(begin);
+<a name="l01003"></a>01003 <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
+<a name="l01004"></a>01004 array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
+<a name="l01005"></a>01005 }
+<a name="l01006"></a>01006 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l01007"></a>01007 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l01008"></a>01008 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back </span>
+<a name="l01009"></a>01009 <span class="preprocessor"></span>
+<a name="l01010"></a>01010 <span class="comment">// concurrent_vector's template functions</span>
+<a name="l01011"></a>01011 <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="l01012"></a>01012 <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="l01013"></a>01013 <span class="comment">// Simply: return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
+<a name="l01014"></a>01014 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01015"></a>01015 <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
+<a name="l01016"></a>01016 <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
+<a name="l01017"></a>01017 <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
+<a name="l01018"></a>01018 <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01019"></a>01019 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01020"></a>01020 }
+<a name="l01021"></a>01021
+<a name="l01022"></a>01022 <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="l01023"></a>01023 <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="l01024"></a>01024 { <span class="keywordflow">return</span> !(a == b); }
+<a name="l01025"></a>01025
+<a name="l01026"></a>01026 <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="l01027"></a>01027 <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="l01028"></a>01028 { <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
+<a name="l01029"></a>01029
+<a name="l01030"></a>01030 <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="l01031"></a>01031 <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="l01032"></a>01032 { <span class="keywordflow">return</span> b < a; }
+<a name="l01033"></a>01033
+<a name="l01034"></a>01034 <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="l01035"></a>01035 <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="l01036"></a>01036 { <span class="keywordflow">return</span> !(b < a); }
+<a name="l01037"></a>01037
+<a name="l01038"></a>01038 <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="l01039"></a>01039 <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="l01040"></a>01040 { <span class="keywordflow">return</span> !(a < b); }
+<a name="l01041"></a>01041
+<a name="l01042"></a>01042 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l01043"></a>01043 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
+<a name="l01044"></a>01044 { a.swap( b ); }
+<a name="l01045"></a>01045
+<a name="l01046"></a>01046 } <span class="comment">// namespace tbb</span>
+<a name="l01047"></a>01047
+<a name="l01048"></a>01048 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
+<a name="l01049"></a>01049 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l01050"></a>01050 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
+<a name="l01051"></a>01051 <span class="preprocessor"></span>
+<a name="l01052"></a>01052 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00342.html b/doc/html/a00342.html
deleted file mode 100644
index 5ad4bab..0000000
--- a/doc/html/a00342.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-2010 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="a00159.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00159.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="a00145.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00145.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="a00174.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="a00121.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="a00173.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="a00174.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="a00174.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="a00174.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="a00174.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="a00174.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="a00241.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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="a00241.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00168.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="a00241.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00125.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-2009 Intel Corporation. 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/a00302.html b/doc/html/a00350.html
similarity index 99%
rename from doc/html/a00302.html
rename to doc/html/a00350.html
index 16170d5..2d7dbf7 100644
--- a/doc/html/a00302.html
+++ b/doc/html/a00350.html
@@ -154,7 +154,7 @@
<a name="l00133"></a>00133 <span class="preprocessor">#endif // _TBB_CRITICAL_SECTION_H_</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00353.html b/doc/html/a00353.html
new file mode 100644
index 0000000..f99c54b
--- /dev/null
+++ b/doc/html/a00353.html
@@ -0,0 +1,1019 @@
+<!DOCTYPE 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-2010 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">#if __SUNPRO_CC</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include <string.h></span> <span class="comment">// for memcpy</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span>
+<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 <windows.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="a00267.html#a8622ae61b7e7737dac26542e181178e">00040</a> <span class="keyword">enum</span> <a class="code" href="a00267.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>interface5 {
+<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="a00143.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
+<a name="l00079"></a>00079 __TBB_ASSERT(<span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)==<span class="keyword">sizeof</span>(tbb::atomic<key_type>*), NULL);
+<a name="l00080"></a>00080 <span class="keyword">union </span>{ <span class="keywordtype">void</span>* space; tbb::atomic<key_type>* key_atomic; } helper;
+<a name="l00081"></a>00081 helper.space = &key;
+<a name="l00082"></a>00082 <span class="keywordflow">return</span> helper.key_atomic->compare_and_swap(k,0)==0;
+<a name="l00083"></a>00083 }
+<a name="l00084"></a>00084 };
+<a name="l00085"></a>00085 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
+<a name="l00086"></a>00086 <span class="preprocessor"></span> <span class="keyword">protected</span>:
+<a name="l00087"></a>00087 <span class="preprocessor">#endif</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span>
+<a name="l00089"></a>00089 <span class="keyword">static</span> key_type key_of_current_thread() {
+<a name="l00090"></a>00090 tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
+<a name="l00091"></a>00091 key_type k;
+<a name="l00092"></a>00092 memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
+<a name="l00093"></a>00093 <span class="keywordflow">return</span> k;
+<a name="l00094"></a>00094 }
+<a name="l00095"></a>00095
+<a name="l00097"></a>00097
+<a name="l00099"></a>00099 atomic<array*> my_root;
+<a name="l00100"></a>00100 atomic<size_t> my_count;
+<a name="l00101"></a>00101 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00102"></a>00102 <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="l00103"></a>00103 <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="l00104"></a>00104 array* allocate( size_t lg_size ) {
+<a name="l00105"></a>00105 size_t n = 1<<lg_size;
+<a name="l00106"></a>00106 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
+<a name="l00107"></a>00107 a->lg_size = lg_size;
+<a name="l00108"></a>00108 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
+<a name="l00109"></a>00109 <span class="keywordflow">return</span> a;
+<a name="l00110"></a>00110 }
+<a name="l00111"></a>00111 <span class="keywordtype">void</span> free(array* a) {
+<a name="l00112"></a>00112 size_t n = 1<<(a->lg_size);
+<a name="l00113"></a>00113 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="l00114"></a>00114 }
+<a name="l00115"></a>00115 <span class="keyword">static</span> size_t hash( key_type k ) {
+<a name="l00116"></a>00116 <span class="comment">// Multiplicative hashing. Client should use *upper* bits.</span>
+<a name="l00117"></a>00117 <span class="comment">// casts required for Mac gcc4.* compiler</span>
+<a name="l00118"></a>00118 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
+<a name="l00120"></a>00120 <span class="preprocessor">#else</span>
+<a name="l00121"></a>00121 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
+<a name="l00122"></a>00122 <span class="preprocessor">#endif </span>
+<a name="l00123"></a>00123 <span class="preprocessor"></span> }
+<a name="l00124"></a>00124
+<a name="l00125"></a>00125 ets_base() {my_root=NULL; my_count=0;}
+<a name="l00126"></a>00126 <span class="keyword">virtual</span> ~ets_base(); <span class="comment">// g++ complains if this is not virtual...</span>
+<a name="l00127"></a>00127 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
+<a name="l00128"></a>00128 <span class="keywordtype">void</span> table_clear();
+<a name="l00129"></a>00129 slot& table_find( key_type k ) {
+<a name="l00130"></a>00130 size_t h = hash(k);
+<a name="l00131"></a>00131 array* r = my_root;
+<a name="l00132"></a>00132 size_t mask = r->mask();
+<a name="l00133"></a>00133 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
+<a name="l00134"></a>00134 slot& s = r->at(i);
+<a name="l00135"></a>00135 <span class="keywordflow">if</span>( s.empty() || s.match(k) )
+<a name="l00136"></a>00136 <span class="keywordflow">return</span> s;
+<a name="l00137"></a>00137 }
+<a name="l00138"></a>00138 }
+<a name="l00139"></a>00139 <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
+<a name="l00140"></a>00140 __TBB_ASSERT(!my_root,NULL);
+<a name="l00141"></a>00141 __TBB_ASSERT(!my_count,NULL);
+<a name="l00142"></a>00142 <span class="keywordflow">if</span>( other.my_root ) {
+<a name="l00143"></a>00143 array* a = allocate(other.my_root->lg_size);
+<a name="l00144"></a>00144 a->next = NULL;
+<a name="l00145"></a>00145 my_root = a;
+<a name="l00146"></a>00146 my_count = other.my_count;
+<a name="l00147"></a>00147 }
+<a name="l00148"></a>00148 }
+<a name="l00149"></a>00149 };
+<a name="l00150"></a>00150
+<a name="l00151"></a>00151 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00152"></a>00152 ets_base<ETS_key_type>::~ets_base() {
+<a name="l00153"></a>00153 __TBB_ASSERT(!my_root, NULL);
+<a name="l00154"></a>00154 }
+<a name="l00155"></a>00155
+<a name="l00156"></a>00156 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00157"></a>00157 <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
+<a name="l00158"></a>00158 <span class="keywordflow">while</span>( array* r = my_root ) {
+<a name="l00159"></a>00159 my_root = r->next;
+<a name="l00160"></a>00160 free(r);
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162 my_count = 0;
+<a name="l00163"></a>00163 }
+<a name="l00164"></a>00164
+<a name="l00165"></a>00165 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00166"></a>00166 <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00167"></a>00167 <span class="keyword">const</span> key_type k = key_of_current_thread();
+<a name="l00168"></a>00168
+<a name="l00169"></a>00169 __TBB_ASSERT(k!=0,NULL);
+<a name="l00170"></a>00170 <span class="keywordtype">void</span>* found;
+<a name="l00171"></a>00171 size_t h = hash(k);
+<a name="l00172"></a>00172 <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
+<a name="l00173"></a>00173 size_t mask=r->mask();
+<a name="l00174"></a>00174 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
+<a name="l00175"></a>00175 slot& s = r->at(i);
+<a name="l00176"></a>00176 <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
+<a name="l00177"></a>00177 <span class="keywordflow">if</span>( s.match(k) ) {
+<a name="l00178"></a>00178 <span class="keywordflow">if</span>( r==my_root ) {
+<a name="l00179"></a>00179 <span class="comment">// Success at top level</span>
+<a name="l00180"></a>00180 exists = <span class="keyword">true</span>;
+<a name="l00181"></a>00181 <span class="keywordflow">return</span> s.ptr;
+<a name="l00182"></a>00182 } <span class="keywordflow">else</span> {
+<a name="l00183"></a>00183 <span class="comment">// Success at some other level. Need to insert at top level.</span>
+<a name="l00184"></a>00184 exists = <span class="keyword">true</span>;
+<a name="l00185"></a>00185 found = s.ptr;
+<a name="l00186"></a>00186 <span class="keywordflow">goto</span> insert;
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 }
+<a name="l00189"></a>00189 }
+<a name="l00190"></a>00190 }
+<a name="l00191"></a>00191 <span class="comment">// Key does not yet exist</span>
+<a name="l00192"></a>00192 exists = <span class="keyword">false</span>;
+<a name="l00193"></a>00193 found = create_local();
+<a name="l00194"></a>00194 {
+<a name="l00195"></a>00195 size_t c = ++my_count;
+<a name="l00196"></a>00196 array* r = my_root;
+<a name="l00197"></a>00197 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
+<a name="l00198"></a>00198 size_t s = r ? r->lg_size : 2;
+<a name="l00199"></a>00199 <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
+<a name="l00200"></a>00200 array* a = allocate(s);
+<a name="l00201"></a>00201 <span class="keywordflow">for</span>(;;) {
+<a name="l00202"></a>00202 a->next = my_root;
+<a name="l00203"></a>00203 array* new_r = my_root.compare_and_swap(a,r);
+<a name="l00204"></a>00204 <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
+<a name="l00205"></a>00205 <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
+<a name="l00206"></a>00206 <span class="comment">// Another thread inserted an equal or bigger array, so our array is superfluous.</span>
+<a name="l00207"></a>00207 free(a);
+<a name="l00208"></a>00208 <span class="keywordflow">break</span>;
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210 r = new_r;
+<a name="l00211"></a>00211 }
+<a name="l00212"></a>00212 }
+<a name="l00213"></a>00213 }
+<a name="l00214"></a>00214 insert:
+<a name="l00215"></a>00215 <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="l00216"></a>00216 array* ir = my_root;
+<a name="l00217"></a>00217 size_t mask = ir->mask();
+<a name="l00218"></a>00218 <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
+<a name="l00219"></a>00219 slot& s = ir->at(i);
+<a name="l00220"></a>00220 <span class="keywordflow">if</span>( s.empty() ) {
+<a name="l00221"></a>00221 <span class="keywordflow">if</span>( s.claim(k) ) {
+<a name="l00222"></a>00222 s.ptr = found;
+<a name="l00223"></a>00223 <span class="keywordflow">return</span> found;
+<a name="l00224"></a>00224 }
+<a name="l00225"></a>00225 }
+<a name="l00226"></a>00226 }
+<a name="l00227"></a>00227 };
+<a name="l00228"></a>00228
+<a name="l00230"></a>00230 <span class="keyword">template</span> <>
+<a name="l00231"></a>00231 <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
+<a name="l00232"></a>00232 <span class="keyword">typedef</span> ets_base<ets_no_key> super;
+<a name="l00233"></a>00233 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00234"></a>00234 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
+<a name="l00235"></a>00235 <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
+<a name="l00236"></a>00236 <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
+<a name="l00237"></a>00237 <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
+<a name="l00238"></a>00238 <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
+<a name="l00239"></a>00239 <span class="preprocessor">#else</span>
+<a name="l00240"></a>00240 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
+<a name="l00241"></a>00241 <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
+<a name="l00242"></a>00242 <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
+<a name="l00243"></a>00243 <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="l00244"></a>00244 <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
+<a name="l00245"></a>00245 <span class="preprocessor">#endif</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span> tls_key_t my_key;
+<a name="l00247"></a>00247 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00248"></a>00248 <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="l00249"></a>00249 <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="l00250"></a>00250 <span class="keyword">public</span>:
+<a name="l00251"></a>00251 ets_base() {create_key();}
+<a name="l00252"></a>00252 ~ets_base() {destroy_key();}
+<a name="l00253"></a>00253 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00254"></a>00254 <span class="keywordtype">void</span>* found = get_tls();
+<a name="l00255"></a>00255 <span class="keywordflow">if</span>( found ) {
+<a name="l00256"></a>00256 exists=<span class="keyword">true</span>;
+<a name="l00257"></a>00257 } <span class="keywordflow">else</span> {
+<a name="l00258"></a>00258 found = super::table_lookup(exists);
+<a name="l00259"></a>00259 set_tls(found);
+<a name="l00260"></a>00260 }
+<a name="l00261"></a>00261 <span class="keywordflow">return</span> found;
+<a name="l00262"></a>00262 }
+<a name="l00263"></a>00263 <span class="keywordtype">void</span> table_clear() {
+<a name="l00264"></a>00264 destroy_key();
+<a name="l00265"></a>00265 create_key();
+<a name="l00266"></a>00266 super::table_clear();
+<a name="l00267"></a>00267 }
+<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> Container, <span class="keyword">typename</span> Value >
+<a name="l00272"></a>00272 <span class="keyword">class </span>enumerable_thread_specific_iterator
+<a name="l00273"></a>00273 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00274"></a>00274 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
+<a name="l00275"></a>00275 : public std::iterator<std::random_access_iterator_tag,Value>
+<a name="l00276"></a>00276 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
+<a name="l00277"></a>00277 {
+<a name="l00279"></a>00279
+<a name="l00280"></a>00280 Container *my_container;
+<a name="l00281"></a>00281 <span class="keyword">typename</span> Container::size_type my_index;
+<a name="l00282"></a>00282 <span class="keyword">mutable</span> Value *my_value;
+<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>
+<a name="l00285"></a>00285 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
+<a name="l00286"></a>00286 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
+<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==( <span class="keyword">const</span> 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> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
+<a name="l00294"></a>00294 <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> T, <span class="keyword">typename</span> U>
+<a name="l00297"></a>00297 <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="l00298"></a>00298
+<a name="l00299"></a>00299 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00300"></a>00300 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
+<a name="l00301"></a>00301
+<a name="l00302"></a>00302 <span class="keyword">public</span>:
+<a name="l00303"></a>00303
+<a name="l00304"></a>00304 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
+<a name="l00305"></a>00305 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
+<a name="l00306"></a>00306
+<a name="l00308"></a>00308 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
+<a name="l00309"></a>00309
+<a name="l00310"></a>00310 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00311"></a>00311 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
+<a name="l00312"></a>00312 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
+<a name="l00313"></a>00313
+<a name="l00314"></a>00314 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00315"></a>00315 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
+<a name="l00316"></a>00316 }
+<a name="l00317"></a>00317
+<a name="l00318"></a>00318 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
+<a name="l00319"></a>00319 my_index += offset;
+<a name="l00320"></a>00320 my_value = NULL;
+<a name="l00321"></a>00321 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00322"></a>00322 }
+<a name="l00323"></a>00323
+<a name="l00324"></a>00324 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00325"></a>00325 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
+<a name="l00326"></a>00326 }
+<a name="l00327"></a>00327
+<a name="l00328"></a>00328 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
+<a name="l00329"></a>00329 my_index -= offset;
+<a name="l00330"></a>00330 my_value = NULL;
+<a name="l00331"></a>00331 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00332"></a>00332 }
+<a name="l00333"></a>00333
+<a name="l00334"></a>00334 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00335"></a>00335 Value* value = my_value;
+<a name="l00336"></a>00336 <span class="keywordflow">if</span>( !value ) {
+<a name="l00337"></a>00337 value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
+<a name="l00338"></a>00338 }
+<a name="l00339"></a>00339 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
+<a name="l00340"></a>00340 <span class="keywordflow">return</span> *value;
+<a name="l00341"></a>00341 }
+<a name="l00342"></a>00342
+<a name="l00343"></a>00343 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00344"></a>00344 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
+<a name="l00345"></a>00345 }
+<a name="l00346"></a>00346
+<a name="l00347"></a>00347 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00348"></a>00348
+<a name="l00349"></a>00349 enumerable_thread_specific_iterator& operator++() {
+<a name="l00350"></a>00350 ++my_index;
+<a name="l00351"></a>00351 my_value = NULL;
+<a name="l00352"></a>00352 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00353"></a>00353 }
+<a name="l00354"></a>00354
+<a name="l00355"></a>00355 enumerable_thread_specific_iterator& operator--() {
+<a name="l00356"></a>00356 --my_index;
+<a name="l00357"></a>00357 my_value = NULL;
+<a name="l00358"></a>00358 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00359"></a>00359 }
+<a name="l00360"></a>00360
+<a name="l00362"></a>00362 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00363"></a>00363 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00364"></a>00364 ++my_index;
+<a name="l00365"></a>00365 my_value = NULL;
+<a name="l00366"></a>00366 <span class="keywordflow">return</span> result;
+<a name="l00367"></a>00367 }
+<a name="l00368"></a>00368
+<a name="l00370"></a>00370 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
+<a name="l00371"></a>00371 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00372"></a>00372 --my_index;
+<a name="l00373"></a>00373 my_value = NULL;
+<a name="l00374"></a>00374 <span class="keywordflow">return</span> result;
+<a name="l00375"></a>00375 }
+<a name="l00376"></a>00376
+<a name="l00377"></a>00377 <span class="comment">// STL support</span>
+<a name="l00378"></a>00378 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00379"></a>00379 <span class="keyword">typedef</span> Value value_type;
+<a name="l00380"></a>00380 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00381"></a>00381 <span class="keyword">typedef</span> Value& reference;
+<a name="l00382"></a>00382 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
+<a name="l00383"></a>00383 };
+<a name="l00384"></a>00384
+<a name="l00385"></a>00385 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
+<a name="l00386"></a>00386 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
+<a name="l00387"></a>00387 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
+<a name="l00388"></a>00388 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
+<a name="l00389"></a>00389 }
+<a name="l00390"></a>00390
+<a name="l00391"></a>00391 <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="l00392"></a>00392 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00393"></a>00393 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00394"></a>00394 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
+<a name="l00395"></a>00395 }
+<a name="l00396"></a>00396
+<a name="l00397"></a>00397 <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="l00398"></a>00398 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00399"></a>00399 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00400"></a>00400 <span class="keywordflow">return</span> !(i==j);
+<a name="l00401"></a>00401 }
+<a name="l00402"></a>00402
+<a name="l00403"></a>00403 <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="l00404"></a>00404 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00405"></a>00405 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00406"></a>00406 <span class="keywordflow">return</span> i.my_index<j.my_index;
+<a name="l00407"></a>00407 }
+<a name="l00408"></a>00408
+<a name="l00409"></a>00409 <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="l00410"></a>00410 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00411"></a>00411 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00412"></a>00412 <span class="keywordflow">return</span> j<i;
+<a name="l00413"></a>00413 }
+<a name="l00414"></a>00414
+<a name="l00415"></a>00415 <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="l00416"></a>00416 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00417"></a>00417 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00418"></a>00418 <span class="keywordflow">return</span> !(i<j);
+<a name="l00419"></a>00419 }
+<a name="l00420"></a>00420
+<a name="l00421"></a>00421 <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="l00422"></a>00422 <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00423"></a>00423 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00424"></a>00424 <span class="keywordflow">return</span> !(j<i);
+<a name="l00425"></a>00425 }
+<a name="l00426"></a>00426
+<a name="l00427"></a>00427 <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="l00428"></a>00428 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00429"></a>00429 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00430"></a>00430 <span class="keywordflow">return</span> i.my_index-j.my_index;
+<a name="l00431"></a>00431 }
+<a name="l00432"></a>00432
+<a name="l00433"></a>00433 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
+<a name="l00434"></a>00434 <span class="keyword">class </span>segmented_iterator
+<a name="l00435"></a>00435 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00436"></a>00436 : public std::iterator<std::input_iterator_tag, Value>
+<a name="l00437"></a>00437 #endif
+<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> T, <span class="keyword">typename</span> U>
+<a name="l00443"></a>00443 <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="l00444"></a>00444
+<a name="l00445"></a>00445 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00446"></a>00446 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
+<a name="l00447"></a>00447
+<a name="l00448"></a>00448 <span class="keyword">public</span>:
+<a name="l00449"></a>00449
+<a name="l00450"></a>00450 segmented_iterator() {my_segcont = NULL;}
+<a name="l00451"></a>00451
+<a name="l00452"></a>00452 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
+<a name="l00453"></a>00453 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
+<a name="l00454"></a>00454 outer_iter(my_segcont->end()) { }
+<a name="l00455"></a>00455
+<a name="l00456"></a>00456 ~segmented_iterator() {}
+<a name="l00457"></a>00457
+<a name="l00458"></a>00458 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
+<a name="l00459"></a>00459 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
+<a name="l00460"></a>00460 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
+<a name="l00461"></a>00461
+<a name="l00462"></a>00462 <span class="comment">// STL support</span>
+<a name="l00463"></a>00463 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00464"></a>00464 <span class="keyword">typedef</span> Value value_type;
+<a name="l00465"></a>00465 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
+<a name="l00466"></a>00466 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00467"></a>00467 <span class="keyword">typedef</span> Value& reference;
+<a name="l00468"></a>00468 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
+<a name="l00469"></a>00469
+<a name="l00470"></a>00470 <span class="comment">// Copy Constructor</span>
+<a name="l00471"></a>00471 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00472"></a>00472 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
+<a name="l00473"></a>00473 my_segcont(other.my_segcont),
+<a name="l00474"></a>00474 outer_iter(other.outer_iter),
+<a name="l00475"></a>00475 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
+<a name="l00476"></a>00476 inner_iter(other.inner_iter)
+<a name="l00477"></a>00477 {}
+<a name="l00478"></a>00478
+<a name="l00479"></a>00479 <span class="comment">// assignment</span>
+<a name="l00480"></a>00480 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00481"></a>00481 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
+<a name="l00482"></a>00482 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
+<a name="l00483"></a>00483 my_segcont = other.my_segcont;
+<a name="l00484"></a>00484 outer_iter = other.outer_iter;
+<a name="l00485"></a>00485 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
+<a name="l00486"></a>00486 }
+<a name="l00487"></a>00487 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00488"></a>00488 }
+<a name="l00489"></a>00489
+<a name="l00490"></a>00490 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
+<a name="l00491"></a>00491 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
+<a name="l00492"></a>00492 <span class="comment">// the end of the outer container is reached.</span>
+<a name="l00493"></a>00493 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
+<a name="l00494"></a>00494 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00495"></a>00495 <span class="comment">// check that this iterator points to something inside the segmented container</span>
+<a name="l00496"></a>00496 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
+<a name="l00497"></a>00497 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
+<a name="l00498"></a>00498 inner_iter = outer_iter->begin();
+<a name="l00499"></a>00499 <span class="keywordflow">break</span>;
+<a name="l00500"></a>00500 }
+<a name="l00501"></a>00501 }
+<a name="l00502"></a>00502 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00503"></a>00503 }
+<a name="l00504"></a>00504
+<a name="l00505"></a>00505 <span class="comment">// pre-increment</span>
+<a name="l00506"></a>00506 segmented_iterator& operator++() {
+<a name="l00507"></a>00507 advance_me();
+<a name="l00508"></a>00508 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00509"></a>00509 }
+<a name="l00510"></a>00510
+<a name="l00511"></a>00511 <span class="comment">// post-increment</span>
+<a name="l00512"></a>00512 segmented_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00513"></a>00513 segmented_iterator tmp = *<span class="keyword">this</span>;
+<a name="l00514"></a>00514 operator++();
+<a name="l00515"></a>00515 <span class="keywordflow">return</span> tmp;
+<a name="l00516"></a>00516 }
+<a name="l00517"></a>00517
+<a name="l00518"></a>00518 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00519"></a>00519 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00520"></a>00520 <span class="keywordflow">return</span> (outer_iter == other_outer &&
+<a name="l00521"></a>00521 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
+<a name="l00522"></a>00522 }
+<a name="l00523"></a>00523
+<a name="l00524"></a>00524 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00525"></a>00525 <span class="keywordflow">return</span> !operator==(other_outer);
+<a name="l00526"></a>00526
+<a name="l00527"></a>00527 }
+<a name="l00528"></a>00528
+<a name="l00529"></a>00529 <span class="comment">// (i)* RHS</span>
+<a name="l00530"></a>00530 reference operator*()<span class="keyword"> const </span>{
+<a name="l00531"></a>00531 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00532"></a>00532 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
+<a name="l00533"></a>00533 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
+<a name="l00534"></a>00534 <span class="keywordflow">return</span> *inner_iter;
+<a name="l00535"></a>00535 }
+<a name="l00536"></a>00536
+<a name="l00537"></a>00537 <span class="comment">// i-></span>
+<a name="l00538"></a>00538 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
+<a name="l00539"></a>00539
+<a name="l00540"></a>00540 <span class="keyword">private</span>:
+<a name="l00541"></a>00541 SegmentedContainer* my_segcont;
+<a name="l00542"></a>00542 outer_iterator outer_iter;
+<a name="l00543"></a>00543 inner_iterator inner_iter;
+<a name="l00544"></a>00544
+<a name="l00545"></a>00545 <span class="keywordtype">void</span> advance_me() {
+<a name="l00546"></a>00546 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00547"></a>00547 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
+<a name="l00548"></a>00548 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
+<a name="l00549"></a>00549 ++inner_iter;
+<a name="l00550"></a>00550 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
+<a name="l00551"></a>00551 inner_iter = outer_iter->begin();
+<a name="l00552"></a>00552 }
+<a name="l00553"></a>00553 }
+<a name="l00554"></a>00554 }; <span class="comment">// segmented_iterator</span>
+<a name="l00555"></a>00555
+<a name="l00556"></a>00556 <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="l00557"></a>00557 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
+<a name="l00558"></a>00558 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00559"></a>00559 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00560"></a>00560 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00561"></a>00561 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00562"></a>00562 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00563"></a>00563 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
+<a name="l00564"></a>00564 }
+<a name="l00565"></a>00565
+<a name="l00566"></a>00566 <span class="comment">// !=</span>
+<a name="l00567"></a>00567 <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="l00568"></a>00568 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
+<a name="l00569"></a>00569 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00570"></a>00570 <span class="keywordflow">return</span> !(i==j);
+<a name="l00571"></a>00571 }
+<a name="l00572"></a>00572
+<a name="l00573"></a>00573 <span class="comment">// storage for initialization function pointer</span>
+<a name="l00574"></a>00574 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00575"></a>00575 <span class="keyword">struct </span>callback_base {
+<a name="l00576"></a>00576 <span class="keyword">virtual</span> T apply( ) = 0;
+<a name="l00577"></a>00577 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy( ) = 0;
+<a name="l00578"></a>00578 <span class="comment">// need to be able to create copies of callback_base for copy constructor</span>
+<a name="l00579"></a>00579 <span class="keyword">virtual</span> callback_base* make_copy() = 0;
+<a name="l00580"></a>00580 <span class="comment">// need virtual destructor to satisfy GCC compiler warning</span>
+<a name="l00581"></a>00581 <span class="keyword">virtual</span> ~callback_base() { }
+<a name="l00582"></a>00582 };
+<a name="l00583"></a>00583
+<a name="l00584"></a>00584 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Functor>
+<a name="l00585"></a>00585 <span class="keyword">struct </span>callback_leaf : <span class="keyword">public</span> callback_base<T>, <span class="keyword">public</span> tbb::internal::no_copy {
+<a name="l00586"></a>00586 <span class="keyword">typedef</span> Functor my_callback_type;
+<a name="l00587"></a>00587 <span class="keyword">typedef</span> callback_leaf<T,Functor> my_type;
+<a name="l00588"></a>00588 <span class="keyword">typedef</span> my_type* callback_pointer;
+<a name="l00589"></a>00589 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<my_type></a> my_allocator_type;
+<a name="l00590"></a>00590 Functor f;
+<a name="l00591"></a>00591 callback_leaf( <span class="keyword">const</span> Functor& f_) : f(f_) {
+<a name="l00592"></a>00592 }
+<a name="l00593"></a>00593
+<a name="l00594"></a>00594 <span class="keyword">static</span> callback_pointer new_callback(<span class="keyword">const</span> Functor& f_ ) {
+<a name="l00595"></a>00595 <span class="keywordtype">void</span>* new_void = my_allocator_type().allocate(1);
+<a name="l00596"></a>00596 callback_pointer new_cb = <span class="keyword">new</span> (new_void) callback_leaf<T,Functor>(f_); <span class="comment">// placement new</span>
+<a name="l00597"></a>00597 <span class="keywordflow">return</span> new_cb;
+<a name="l00598"></a>00598 }
+<a name="l00599"></a>00599
+<a name="l00600"></a>00600 <span class="comment">/* override */</span> callback_pointer make_copy() {
+<a name="l00601"></a>00601 <span class="keywordflow">return</span> new_callback( f );
+<a name="l00602"></a>00602 }
+<a name="l00603"></a>00603
+<a name="l00604"></a>00604 <span class="comment">/* override */</span> <span class="keywordtype">void</span> destroy( ) {
+<a name="l00605"></a>00605 callback_pointer my_ptr = <span class="keyword">this</span>;
+<a name="l00606"></a>00606 my_allocator_type().destroy(my_ptr);
+<a name="l00607"></a>00607 my_allocator_type().deallocate(my_ptr,1);
+<a name="l00608"></a>00608 }
+<a name="l00609"></a>00609 <span class="comment">/* override */</span> T apply() { <span class="keywordflow">return</span> f(); } <span class="comment">// does copy construction of returned value.</span>
+<a name="l00610"></a>00610 };
+<a name="l00611"></a>00611
+<a name="l00612"></a>00612
+<a name="l00614"></a>00614
+<a name="l00619"></a>00619 <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
+<a name="l00620"></a>00620 <span class="keyword">struct </span>ets_element {
+<a name="l00621"></a>00621 <span class="keywordtype">char</span> value[<span class="keyword">sizeof</span>(U) + tbb::internal::NFS_MaxLineSize-ModularSize];
+<a name="l00622"></a>00622 <span class="keywordtype">void</span> unconstruct() {
+<a name="l00623"></a>00623 <span class="comment">// "reinterpret_cast<U*>(&value)->~U();" causes type-punning warning with gcc 4.4,</span>
+<a name="l00624"></a>00624 <span class="comment">// "U* u = reinterpret_cast<U*>(&value); u->~U();" causes unused variable warning with VS2010.</span>
+<a name="l00625"></a>00625 <span class="comment">// Thus another "casting via union" hack.</span>
+<a name="l00626"></a>00626 __TBB_ASSERT(<span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)==<span class="keyword">sizeof</span>(U*),NULL);
+<a name="l00627"></a>00627 <span class="keyword">union </span>{ <span class="keywordtype">void</span>* space; U* val; } helper;
+<a name="l00628"></a>00628 helper.space = &value;
+<a name="l00629"></a>00629 helper.val->~U();
+<a name="l00630"></a>00630 }
+<a name="l00631"></a>00631 };
+<a name="l00632"></a>00632
+<a name="l00634"></a>00634 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00635"></a>00635 <span class="keyword">struct </span>ets_element<U,0> {
+<a name="l00636"></a>00636 <span class="keywordtype">char</span> value[<span class="keyword">sizeof</span>(U)];
+<a name="l00637"></a>00637 <span class="keywordtype">void</span> unconstruct() { <span class="comment">// Same implementation as in general case</span>
+<a name="l00638"></a>00638 __TBB_ASSERT(<span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)==<span class="keyword">sizeof</span>(U*),NULL);
+<a name="l00639"></a>00639 <span class="keyword">union </span>{ <span class="keywordtype">void</span>* space; U* val; } helper;
+<a name="l00640"></a>00640 helper.space = &value;
+<a name="l00641"></a>00641 helper.val->~U();
+<a name="l00642"></a>00642 }
+<a name="l00643"></a>00643 };
+<a name="l00644"></a>00644
+<a name="l00645"></a>00645 } <span class="comment">// namespace internal</span>
+<a name="l00647"></a>00647 <span class="comment"></span>
+<a name="l00649"></a>00649
+<a name="l00668"></a>00668 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
+<a name="l00669"></a>00669 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
+<a name="l00670"></a><a class="code" href="a00164.html">00670</a> <a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
+<a name="l00671"></a>00671 <span class="keyword">class </span><a class="code" href="a00164.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> {
+<a name="l00672"></a>00672
+<a name="l00673"></a>00673 <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="a00164.html">enumerable_thread_specific</a>;
+<a name="l00674"></a>00674
+<a name="l00675"></a>00675 <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
+<a name="l00676"></a>00676
+<a name="l00678"></a>00678 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00679"></a>00679 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00148.html">blocked_range</a><I> {
+<a name="l00680"></a>00680 <span class="keyword">public</span>:
+<a name="l00681"></a>00681 <span class="keyword">typedef</span> T value_type;
+<a name="l00682"></a>00682 <span class="keyword">typedef</span> T& reference;
+<a name="l00683"></a>00683 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00684"></a>00684 <span class="keyword">typedef</span> I iterator;
+<a name="l00685"></a>00685 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00686"></a>00686 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00148.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
+<a name="l00687"></a>00687 template<typename U>
+<a name="l00688"></a>00688 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00148.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
+<a name="l00689"></a>00689 generic_range_type( generic_range_type& r, <a class="code" href="a00198.html">split</a> ) : <a class="code" href="a00148.html">blocked_range<I></a>(r,<a class="code" href="a00198.html">split</a>()) {}
+<a name="l00690"></a>00690 };
+<a name="l00691"></a>00691
+<a name="l00692"></a>00692 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
+<a name="l00693"></a>00693 <span class="keyword">typedef</span> <a class="code" href="a00162.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00162.html">internal_collection_type</a>;
+<a name="l00694"></a>00694
+<a name="l00695"></a>00695 internal::callback_base<T> *my_finit_callback;
+<a name="l00696"></a>00696
+<a name="l00697"></a>00697 <span class="comment">// need to use a pointed-to exemplar because T may not be assignable.</span>
+<a name="l00698"></a>00698 <span class="comment">// using tbb_allocator instead of padded_element_allocator because we may be</span>
+<a name="l00699"></a>00699 <span class="comment">// copying an exemplar from one instantiation of ETS to another with a different</span>
+<a name="l00700"></a>00700 <span class="comment">// allocator.</span>
+<a name="l00701"></a>00701 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<padded_element ></a> <a class="code" href="a00204.html">exemplar_allocator_type</a>;
+<a name="l00702"></a>00702 <span class="keyword">static</span> padded_element * create_exemplar(<span class="keyword">const</span> T& my_value) {
+<a name="l00703"></a>00703 padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
+<a name="l00704"></a>00704 <span class="keyword">new</span>(new_exemplar->value) T(my_value);
+<a name="l00705"></a>00705 <span class="keywordflow">return</span> new_exemplar;
+<a name="l00706"></a>00706 }
+<a name="l00707"></a>00707
+<a name="l00708"></a>00708 <span class="keyword">static</span> padded_element *create_exemplar( ) {
+<a name="l00709"></a>00709 padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
+<a name="l00710"></a>00710 <span class="keyword">new</span>(new_exemplar->value) T( );
+<a name="l00711"></a>00711 <span class="keywordflow">return</span> new_exemplar;
+<a name="l00712"></a>00712 }
+<a name="l00713"></a>00713
+<a name="l00714"></a>00714 <span class="keyword">static</span> <span class="keywordtype">void</span> free_exemplar(padded_element *my_ptr) {
+<a name="l00715"></a>00715 my_ptr->unconstruct();
+<a name="l00716"></a>00716 exemplar_allocator_type().destroy(my_ptr);
+<a name="l00717"></a>00717 exemplar_allocator_type().deallocate(my_ptr,1);
+<a name="l00718"></a>00718 }
+<a name="l00719"></a>00719
+<a name="l00720"></a>00720 padded_element* my_exemplar_ptr;
+<a name="l00721"></a>00721
+<a name="l00722"></a>00722 internal_collection_type my_locals;
+<a name="l00723"></a>00723
+<a name="l00724"></a>00724 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
+<a name="l00725"></a>00725 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00726"></a>00726 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00727"></a>00727 <span class="preprocessor">#else</span>
+<a name="l00728"></a>00728 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00729"></a>00729 <span class="preprocessor">#endif</span>
+<a name="l00730"></a>00730 <span class="preprocessor"></span> <span class="keywordflow">if</span>(my_finit_callback) {
+<a name="l00731"></a>00731 <span class="keyword">new</span>(lref) T(my_finit_callback->apply());
+<a name="l00732"></a>00732 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(my_exemplar_ptr) {
+<a name="l00733"></a>00733 pointer t_exemp = reinterpret_cast<T *>(&(my_exemplar_ptr->value));
+<a name="l00734"></a>00734 <span class="keyword">new</span>(lref) T(*t_exemp);
+<a name="l00735"></a>00735 } <span class="keywordflow">else</span> {
+<a name="l00736"></a>00736 <span class="keyword">new</span>(lref) T();
+<a name="l00737"></a>00737 }
+<a name="l00738"></a>00738 <span class="keywordflow">return</span> lref;
+<a name="l00739"></a>00739 }
+<a name="l00740"></a>00740
+<a name="l00741"></a>00741 <span class="keywordtype">void</span> unconstruct_locals() {
+<a name="l00742"></a>00742 <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
+<a name="l00743"></a>00743 cvi->unconstruct();
+<a name="l00744"></a>00744 }
+<a name="l00745"></a>00745 }
+<a name="l00746"></a>00746
+<a name="l00747"></a>00747 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
+<a name="l00748"></a>00748
+<a name="l00749"></a>00749 <span class="comment">// _size is in bytes</span>
+<a name="l00750"></a>00750 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
+<a name="l00751"></a>00751 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00752"></a>00752 <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
+<a name="l00753"></a>00753 }
+<a name="l00754"></a>00754
+<a name="l00755"></a>00755 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
+<a name="l00756"></a>00756 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00757"></a>00757 array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
+<a name="l00758"></a>00758 }
+<a name="l00759"></a>00759
+<a name="l00760"></a>00760 <span class="keyword">public</span>:
+<a name="l00761"></a>00761
+<a name="l00763"></a>00763 <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00764"></a>00764 <span class="keyword">typedef</span> T value_type;
+<a name="l00765"></a>00765 <span class="keyword">typedef</span> T& reference;
+<a name="l00766"></a>00766 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00767"></a>00767 <span class="keyword">typedef</span> T* pointer;
+<a name="l00768"></a>00768 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
+<a name="l00769"></a>00769 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
+<a name="l00770"></a>00770 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
+<a name="l00771"></a>00771
+<a name="l00772"></a>00772 <span class="comment">// Iterator types</span>
+<a name="l00773"></a>00773 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
+<a name="l00774"></a>00774 <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="l00775"></a>00775
+<a name="l00776"></a>00776 <span class="comment">// Parallel range types</span>
+<a name="l00777"></a>00777 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
+<a name="l00778"></a>00778 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
+<a name="l00779"></a>00779
+<a name="l00781"></a>00781 <a class="code" href="a00164.html">enumerable_thread_specific</a>() : my_finit_callback(0) {
+<a name="l00782"></a>00782 my_exemplar_ptr = 0;
+<a name="l00783"></a>00783 }
+<a name="l00784"></a>00784
+<a name="l00786"></a>00786 <span class="comment">// Finit should be a function taking 0 parameters and returning a T</span>
+<a name="l00787"></a><a class="code" href="a00164.html#724ed4c846493da62b4efe032e16eb4a">00787</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
+<a name="l00788"></a>00788 <a class="code" href="a00164.html">enumerable_thread_specific</a>( Finit _finit )
+<a name="l00789"></a>00789 {
+<a name="l00790"></a>00790 my_finit_callback = internal::callback_leaf<T,Finit>::new_callback( _finit );
+<a name="l00791"></a>00791 my_exemplar_ptr = 0; <span class="comment">// don't need exemplar if function is provided</span>
+<a name="l00792"></a>00792 }
+<a name="l00793"></a>00793
+<a name="l00795"></a>00795 <a class="code" href="a00164.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T &_exemplar) : my_finit_callback(0) {
+<a name="l00796"></a>00796 my_exemplar_ptr = create_exemplar(_exemplar);
+<a name="l00797"></a>00797 }
+<a name="l00798"></a>00798
+<a name="l00800"></a>00800 ~<a class="code" href="a00164.html">enumerable_thread_specific</a>() {
+<a name="l00801"></a>00801 <span class="keywordflow">if</span>(my_finit_callback) {
+<a name="l00802"></a>00802 my_finit_callback->destroy();
+<a name="l00803"></a>00803 }
+<a name="l00804"></a>00804 <span class="keywordflow">if</span>(my_exemplar_ptr) {
+<a name="l00805"></a>00805 free_exemplar(my_exemplar_ptr);
+<a name="l00806"></a>00806 }
+<a name="l00807"></a>00807 this->clear(); <span class="comment">// deallocation before the derived class is finished destructing</span>
+<a name="l00808"></a>00808 <span class="comment">// So free(array *) is still accessible</span>
+<a name="l00809"></a>00809 }
+<a name="l00810"></a>00810
+<a name="l00812"></a>00812 reference local() {
+<a name="l00813"></a>00813 <span class="keywordtype">bool</span> exists;
+<a name="l00814"></a>00814 <span class="keywordflow">return</span> local(exists);
+<a name="l00815"></a>00815 }
+<a name="l00816"></a>00816
+<a name="l00818"></a>00818 reference local(<span class="keywordtype">bool</span>& exists) {
+<a name="l00819"></a>00819 __TBB_ASSERT(ETS_key_type==ets_no_key,<span class="stringliteral">"ets_key_per_instance not yet implemented"</span>);
+<a name="l00820"></a>00820 <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
+<a name="l00821"></a>00821 <span class="keywordflow">return</span> *(T*)ptr;
+<a name="l00822"></a>00822 }
+<a name="l00823"></a>00823
+<a name="l00825"></a>00825 size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
+<a name="l00826"></a>00826
+<a name="l00828"></a>00828 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
+<a name="l00829"></a>00829
+<a name="l00831"></a>00831 iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
+<a name="l00833"></a>00833 iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
+<a name="l00834"></a>00834
+<a name="l00836"></a>00836 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
+<a name="l00837"></a>00837
+<a name="l00839"></a>00839 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
+<a name="l00840"></a>00840
+<a name="l00842"></a>00842 range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); }
+<a name="l00843"></a>00843
+<a name="l00845"></a>00845 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="l00846"></a>00846
+<a name="l00848"></a>00848 <span class="keywordtype">void</span> clear() {
+<a name="l00849"></a>00849 unconstruct_locals();
+<a name="l00850"></a>00850 my_locals.<a class="code" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
+<a name="l00851"></a>00851 this->table_clear();
+<a name="l00852"></a>00852 <span class="comment">// callback is not destroyed</span>
+<a name="l00853"></a>00853 <span class="comment">// exemplar is not destroyed</span>
+<a name="l00854"></a>00854 }
+<a name="l00855"></a>00855
+<a name="l00856"></a>00856 <span class="keyword">private</span>:
+<a name="l00857"></a>00857
+<a name="l00858"></a>00858 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00859"></a>00859 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
+<a name="l00860"></a>00860
+<a name="l00861"></a>00861 <span class="keyword">public</span>:
+<a name="l00862"></a>00862
+<a name="l00863"></a>00863 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00864"></a>00864 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00865"></a>00865 {
+<a name="l00866"></a>00866 internal_copy(other);
+<a name="l00867"></a>00867 }
+<a name="l00868"></a>00868
+<a name="l00869"></a>00869 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00870"></a>00870 {
+<a name="l00871"></a>00871 internal_copy(other);
+<a name="l00872"></a>00872 }
+<a name="l00873"></a>00873
+<a name="l00874"></a>00874 <span class="keyword">private</span>:
+<a name="l00875"></a>00875
+<a name="l00876"></a>00876 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00877"></a>00877 enumerable_thread_specific &
+<a name="l00878"></a>00878 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
+<a name="l00879"></a>00879 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
+<a name="l00880"></a>00880 this->clear();
+<a name="l00881"></a>00881 <span class="keywordflow">if</span>(my_finit_callback) {
+<a name="l00882"></a>00882 my_finit_callback->destroy();
+<a name="l00883"></a>00883 my_finit_callback = 0;
+<a name="l00884"></a>00884 }
+<a name="l00885"></a>00885 <span class="keywordflow">if</span>(my_exemplar_ptr) {
+<a name="l00886"></a>00886 free_exemplar(my_exemplar_ptr);
+<a name="l00887"></a>00887 my_exemplar_ptr = 0;
+<a name="l00888"></a>00888 }
+<a name="l00889"></a>00889 internal_copy( other );
+<a name="l00890"></a>00890 }
+<a name="l00891"></a>00891 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00892"></a>00892 }
+<a name="l00893"></a>00893
+<a name="l00894"></a>00894 <span class="keyword">public</span>:
+<a name="l00895"></a>00895
+<a name="l00896"></a>00896 <span class="comment">// assignment</span>
+<a name="l00897"></a>00897 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
+<a name="l00898"></a>00898 <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00899"></a>00899 }
+<a name="l00900"></a>00900
+<a name="l00901"></a>00901 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00902"></a>00902 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
+<a name="l00903"></a>00903 {
+<a name="l00904"></a>00904 <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00905"></a>00905 }
+<a name="l00906"></a>00906
+<a name="l00907"></a>00907 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
+<a name="l00908"></a>00908 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00909"></a>00909 T combine(combine_func_t f_combine) {
+<a name="l00910"></a>00910 <span class="keywordflow">if</span>(begin() == end()) {
+<a name="l00911"></a>00911 <span class="keywordflow">if</span>(my_finit_callback) {
+<a name="l00912"></a>00912 <span class="keywordflow">return</span> my_finit_callback->apply();
+<a name="l00913"></a>00913 }
+<a name="l00914"></a>00914 pointer local_ref = reinterpret_cast<T*>((my_exemplar_ptr->value));
+<a name="l00915"></a>00915 <span class="keywordflow">return</span> T(*local_ref);
+<a name="l00916"></a>00916 }
+<a name="l00917"></a>00917 const_iterator ci = begin();
+<a name="l00918"></a>00918 T my_result = *ci;
+<a name="l00919"></a>00919 <span class="keywordflow">while</span>(++ci != end())
+<a name="l00920"></a>00920 my_result = f_combine( my_result, *ci );
+<a name="l00921"></a>00921 <span class="keywordflow">return</span> my_result;
+<a name="l00922"></a>00922 }
+<a name="l00923"></a>00923
+<a name="l00924"></a>00924 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
+<a name="l00925"></a>00925 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00926"></a>00926 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
+<a name="l00927"></a>00927 <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
+<a name="l00928"></a>00928 f_combine( *ci );
+<a name="l00929"></a>00929 }
+<a name="l00930"></a>00930 }
+<a name="l00931"></a>00931
+<a name="l00932"></a>00932 }; <span class="comment">// enumerable_thread_specific</span>
+<a name="l00933"></a>00933
+<a name="l00934"></a>00934
+<a name="l00935"></a>00935 <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="l00936"></a>00936 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00937"></a>00937 <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="l00938"></a>00938 <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
+<a name="l00939"></a>00939 __TBB_ASSERT(my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
+<a name="l00940"></a>00940 this->table_reserve_for_copy( other );
+<a name="l00941"></a>00941 <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
+<a name="l00942"></a>00942 <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
+<a name="l00943"></a>00943 base::slot& s1 = r->at(i);
+<a name="l00944"></a>00944 <span class="keywordflow">if</span>( !s1.empty() ) {
+<a name="l00945"></a>00945 base::slot& s2 = this->table_find(s1.key);
+<a name="l00946"></a>00946 <span class="keywordflow">if</span>( s2.empty() ) {
+<a name="l00947"></a>00947 #<span class="keywordflow">if</span> TBB_DEPRECATED
+<a name="l00948"></a>00948 <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00949"></a>00949 <span class="preprocessor">#else</span>
+<a name="l00950"></a>00950 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00951"></a>00951 <span class="preprocessor">#endif</span>
+<a name="l00952"></a>00952 <span class="preprocessor"></span> s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
+<a name="l00953"></a>00953 s2.key = s1.key;
+<a name="l00954"></a>00954 } <span class="keywordflow">else</span> {
+<a name="l00955"></a>00955 <span class="comment">// Skip the duplicate</span>
+<a name="l00956"></a>00956 }
+<a name="l00957"></a>00957 }
+<a name="l00958"></a>00958 }
+<a name="l00959"></a>00959 }
+<a name="l00960"></a>00960 <span class="keywordflow">if</span>(other.my_finit_callback) {
+<a name="l00961"></a>00961 my_finit_callback = other.my_finit_callback->make_copy();
+<a name="l00962"></a>00962 } <span class="keywordflow">else</span> {
+<a name="l00963"></a>00963 my_finit_callback = 0;
+<a name="l00964"></a>00964 }
+<a name="l00965"></a>00965 <span class="keywordflow">if</span>(other.my_exemplar_ptr) {
+<a name="l00966"></a>00966 pointer local_ref = reinterpret_cast<U*>(other.my_exemplar_ptr->value);
+<a name="l00967"></a>00967 my_exemplar_ptr = create_exemplar(*local_ref);
+<a name="l00968"></a>00968 } <span class="keywordflow">else</span> {
+<a name="l00969"></a>00969 my_exemplar_ptr = 0;
+<a name="l00970"></a>00970 }
+<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 <span class="keyword">class </span>flattened2d {
+<a name="l00975"></a>00975
+<a name="l00976"></a>00976 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
+<a name="l00977"></a>00977 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
+<a name="l00978"></a>00978
+<a name="l00979"></a>00979 <span class="keyword">public</span>:
+<a name="l00980"></a>00980
+<a name="l00982"></a>00982 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
+<a name="l00983"></a>00983 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
+<a name="l00984"></a>00984 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
+<a name="l00985"></a>00985 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
+<a name="l00986"></a>00986 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
+<a name="l00987"></a>00987 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
+<a name="l00988"></a>00988 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
+<a name="l00989"></a>00989 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
+<a name="l00990"></a>00990
+<a name="l00991"></a>00991 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
+<a name="l00992"></a>00992 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
+<a name="l00993"></a>00993
+<a name="l00994"></a>00994 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="l00995"></a>00995 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
+<a name="l00996"></a>00996
+<a name="l00997"></a>00997 flattened2d( <span class="keyword">const</span> Container &c ) :
+<a name="l00998"></a>00998 my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
+<a name="l00999"></a>00999
+<a name="l01000"></a>01000 iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
+<a name="l01001"></a>01001 iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
+<a name="l01002"></a>01002 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
+<a name="l01003"></a>01003 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
+<a name="l01004"></a>01004
+<a name="l01005"></a>01005 size_type size()<span class="keyword"> const </span>{
+<a name="l01006"></a>01006 size_type tot_size = 0;
+<a name="l01007"></a>01007 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
+<a name="l01008"></a>01008 tot_size += i->size();
+<a name="l01009"></a>01009 }
+<a name="l01010"></a>01010 <span class="keywordflow">return</span> tot_size;
+<a name="l01011"></a>01011 }
+<a name="l01012"></a>01012
+<a name="l01013"></a>01013 <span class="keyword">private</span>:
+<a name="l01014"></a>01014
+<a name="l01015"></a>01015 Container *my_container;
+<a name="l01016"></a>01016 <span class="keyword">typename</span> Container::const_iterator my_begin;
+<a name="l01017"></a>01017 <span class="keyword">typename</span> Container::const_iterator my_end;
+<a name="l01018"></a>01018
+<a name="l01019"></a>01019 };
+<a name="l01020"></a>01020
+<a name="l01021"></a>01021 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l01022"></a>01022 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="l01023"></a>01023 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
+<a name="l01024"></a>01024 }
+<a name="l01025"></a>01025
+<a name="l01026"></a>01026 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l01027"></a>01027 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
+<a name="l01028"></a>01028 <span class="keywordflow">return</span> flattened2d<Container>(c);
+<a name="l01029"></a>01029 }
+<a name="l01030"></a>01030
+<a name="l01031"></a>01031 } <span class="comment">// interface5</span>
+<a name="l01032"></a>01032
+<a name="l01033"></a>01033 <span class="keyword">namespace </span>internal {
+<a name="l01034"></a>01034 <span class="keyword">using</span> interface5::internal::segmented_iterator;
+<a name="l01035"></a>01035 }
+<a name="l01036"></a>01036
+<a name="l01037"></a>01037 <span class="keyword">using</span> interface5::enumerable_thread_specific;
+<a name="l01038"></a>01038 <span class="keyword">using</span> interface5::flattened2d;
+<a name="l01039"></a>01039 <span class="keyword">using</span> interface5::flatten2d;
+<a name="l01040"></a>01040
+<a name="l01041"></a>01041 } <span class="comment">// namespace tbb</span>
+<a name="l01042"></a>01042
+<a name="l01043"></a>01043 <span class="preprocessor">#endif</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00360.html b/doc/html/a00360.html
deleted file mode 100644
index e536029..0000000
--- a/doc/html/a00360.html
+++ /dev/null
@@ -1,237 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>pipeline.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>pipeline.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_pipeline_H </span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_pipeline_H </span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <cstddef></span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">class </span>pipeline;
-<a name="l00031"></a>00031 <span class="keyword">class </span>filter;
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="comment">// The argument for PIPELINE_VERSION should be an integer between 2 and 9</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Token;
-<a name="l00040"></a>00040 <span class="keyword">typedef</span> <span class="keywordtype">long</span> tokendiff_t;
-<a name="l00041"></a>00041 <span class="keyword">class </span>stage_task;
-<a name="l00042"></a>00042 <span class="keyword">class </span>input_buffer;
-<a name="l00043"></a>00043 <span class="keyword">class </span>pipeline_root_task;
-<a name="l00044"></a>00044 <span class="keyword">class </span>pipeline_cleaner;
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 } <span class="comment">// namespace internal</span>
-<a name="l00048"></a>00048 <span class="comment"></span>
-<a name="l00050"></a>00050
-<a name="l00051"></a><a class="code" href="a00144.html">00051</a> <span class="keyword">class </span><a class="code" href="a00144.html">filter</a>: internal::no_copy {
-<a name="l00052"></a>00052 <span class="keyword">private</span>:
-<a name="l00054"></a>00054 <span class="keyword">static</span> <a class="code" href="a00144.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(internal::intptr(-1));}
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_serial = 0x1;
-<a name="l00058"></a>00058
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_out_of_order = 0x1<<4;
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_bound = 0x1<<5;
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> current_version = __TBB_PIPELINE_VERSION(5);
-<a name="l00068"></a>00068 <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="l00069"></a>00069 <span class="keyword">public</span>:
-<a name="l00070"></a><a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">00070</a> <span class="keyword">enum</span> <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> {
-<a name="l00072"></a>00072 <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">parallel</a> = current_version | filter_is_out_of_order,
-<a name="l00074"></a>00074 <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">serial_in_order</a> = current_version | filter_is_serial,
-<a name="l00076"></a>00076 <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">serial_out_of_order</a> = current_version | filter_is_serial | filter_is_out_of_order,
-<a name="l00078"></a>00078 <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">serial</a> = serial_in_order
-<a name="l00079"></a>00079 };
-<a name="l00080"></a>00080 <span class="keyword">protected</span>:
-<a name="l00081"></a>00081 <a class="code" href="a00144.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
-<a name="l00082"></a>00082 next_filter_in_pipeline(not_in_pipeline()),
-<a name="l00083"></a>00083 my_input_buffer(NULL),
-<a name="l00084"></a>00084 my_filter_mode(static_cast<unsigned char>(is_serial_ ? <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">serial</a> : <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">parallel</a>)),
-<a name="l00085"></a>00085 prev_filter_in_pipeline(not_in_pipeline()),
-<a name="l00086"></a>00086 my_pipeline(NULL),
-<a name="l00087"></a>00087 next_segment(NULL)
-<a name="l00088"></a>00088 {}
-<a name="l00089"></a>00089
-<a name="l00090"></a>00090 filter( <a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> filter_mode ) :
-<a name="l00091"></a>00091 next_filter_in_pipeline(not_in_pipeline()),
-<a name="l00092"></a>00092 my_input_buffer(NULL),
-<a name="l00093"></a>00093 my_filter_mode(static_cast<unsigned char>(filter_mode)),
-<a name="l00094"></a>00094 prev_filter_in_pipeline(not_in_pipeline()),
-<a name="l00095"></a>00095 my_pipeline(NULL),
-<a name="l00096"></a>00096 next_segment(NULL)
-<a name="l00097"></a>00097 {}
-<a name="l00098"></a>00098
-<a name="l00099"></a>00099 <span class="keyword">public</span>:
-<a name="l00101"></a><a class="code" href="a00144.html#fcfec27656a69ff2072802ac001e936f">00101</a> <span class="keywordtype">bool</span> <a class="code" href="a00144.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
-<a name="l00102"></a>00102 <span class="keywordflow">return</span> bool( my_filter_mode & filter_is_serial );
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104
-<a name="l00106"></a><a class="code" href="a00144.html#cd53206c4795ef2df5df26b795caf692">00106</a> <span class="keywordtype">bool</span> <a class="code" href="a00144.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
-<a name="l00107"></a>00107 <span class="keywordflow">return</span> (my_filter_mode & (filter_is_out_of_order|filter_is_serial))==filter_is_serial;
-<a name="l00108"></a>00108 }
-<a name="l00109"></a>00109
-<a name="l00111"></a><a class="code" href="a00144.html#15c29cae5d237e6d63dbfe5c94af89d5">00111</a> <span class="keywordtype">bool</span> <a class="code" href="a00144.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
-<a name="l00112"></a>00112 <span class="keywordflow">return</span> ( my_filter_mode & filter_is_bound )==filter_is_bound;
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114
-<a name="l00116"></a>00116
-<a name="l00117"></a>00117 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00144.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
-<a name="l00118"></a>00118
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00144.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span>
-<a name="l00127"></a><a class="code" href="a00144.html#56275eb889c77c4807967133e21401bd">00127</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
-<a name="l00128"></a>00128 <span class="preprocessor">#endif</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span>
-<a name="l00130"></a>00130 <span class="keyword">private</span>:
-<a name="l00132"></a>00132 <a class="code" href="a00144.html">filter</a>* next_filter_in_pipeline;
-<a name="l00133"></a>00133
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 internal::input_buffer* my_input_buffer;
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
-<a name="l00139"></a>00139 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00140"></a>00140 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00158.html">pipeline</a>;
-<a name="l00141"></a>00141 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00182.html">thread_bound_filter</a>;
-<a name="l00142"></a>00142
-<a name="l00144"></a>00144 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
-<a name="l00145"></a>00145
-<a name="l00147"></a>00147 <a class="code" href="a00144.html">filter</a>* prev_filter_in_pipeline;
-<a name="l00148"></a>00148
-<a name="l00150"></a>00150 <a class="code" href="a00158.html">pipeline</a>* my_pipeline;
-<a name="l00151"></a>00151
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <a class="code" href="a00144.html">filter</a>* next_segment;
-<a name="l00155"></a>00155 };
-<a name="l00156"></a>00156
-<a name="l00158"></a>00158
-<a name="l00159"></a><a class="code" href="a00182.html">00159</a> <span class="keyword">class </span><a class="code" href="a00182.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00144.html">filter</a> {
-<a name="l00160"></a>00160 <span class="keyword">public</span>:
-<a name="l00161"></a>00161 <span class="keyword">enum</span> result_type {
-<a name="l00162"></a>00162 <span class="comment">// item was processed</span>
-<a name="l00163"></a>00163 success,
-<a name="l00164"></a>00164 <span class="comment">// item is currently not available</span>
-<a name="l00165"></a>00165 item_not_available,
-<a name="l00166"></a>00166 <span class="comment">// there are no more items to process</span>
-<a name="l00167"></a>00167 end_of_stream
-<a name="l00168"></a>00168 };
-<a name="l00169"></a>00169 <span class="keyword">protected</span>:
-<a name="l00170"></a>00170 <a class="code" href="a00182.html">thread_bound_filter</a>(<a class="code" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">mode</a> filter_mode):
-<a name="l00171"></a>00171 <a class="code" href="a00144.html">filter</a>(static_cast<mode>(filter_mode | filter::filter_is_bound))
-<a name="l00172"></a>00172 {}
-<a name="l00173"></a>00173 <span class="keyword">public</span>:
-<a name="l00175"></a>00175
-<a name="l00180"></a>00180 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00182.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
-<a name="l00181"></a>00181
-<a name="l00183"></a>00183
-<a name="l00187"></a>00187 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00182.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 <span class="keyword">private</span>:
-<a name="l00191"></a>00191 result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
-<a name="l00192"></a>00192 };
-<a name="l00193"></a>00193
-<a name="l00195"></a>00195
-<a name="l00196"></a><a class="code" href="a00158.html">00196</a> <span class="keyword">class </span><a class="code" href="a00158.html">pipeline</a> {
-<a name="l00197"></a>00197 <span class="keyword">public</span>:
-<a name="l00199"></a>00199 __TBB_EXPORTED_METHOD <a class="code" href="a00158.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
-<a name="l00200"></a>00200
-<a name="l00203"></a>00203 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00158.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
-<a name="l00204"></a>00204
-<a name="l00206"></a>00206 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00158.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00144.html">filter</a>& filter_ );
-<a name="l00207"></a>00207
-<a name="l00209"></a>00209 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00158.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
-<a name="l00210"></a>00210
-<a name="l00211"></a>00211 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00213"></a>00213 <span class="preprocessor"> void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</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="l00217"></a>00217 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00158.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 <span class="keyword">private</span>:
-<a name="l00220"></a>00220 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
-<a name="l00221"></a>00221 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00222"></a>00222 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00144.html">filter</a>;
-<a name="l00223"></a>00223 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00182.html">thread_bound_filter</a>;
-<a name="l00224"></a>00224 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
-<a name="l00225"></a>00225
-<a name="l00227"></a>00227 <a class="code" href="a00144.html">filter</a>* filter_list;
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <a class="code" href="a00144.html">filter</a>* filter_end;
-<a name="l00231"></a>00231
-<a name="l00233"></a>00233 <a class="code" href="a00174.html">task</a>* end_counter;
-<a name="l00234"></a>00234
-<a name="l00236"></a>00236 <a class="code" href="a00122.html">atomic<internal::Token></a> input_tokens;
-<a name="l00237"></a>00237
-<a name="l00239"></a>00239 <a class="code" href="a00122.html">atomic<internal::Token></a> token_counter;
-<a name="l00240"></a>00240
-<a name="l00242"></a>00242 <span class="keywordtype">bool</span> end_of_input;
-<a name="l00243"></a>00243
-<a name="l00245"></a>00245 <span class="keywordtype">bool</span> has_thread_bound_filters;
-<a name="l00246"></a>00246
-<a name="l00248"></a>00248 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00144.html">filter</a>& filter_ );
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00174.html">task</a>& <span class="keyword">self</span> );
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00255"></a>00255 <span class="preprocessor"> void clear_filters();</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
-<a name="l00259"></a>00259 } <span class="comment">// tbb</span>
-<a name="l00260"></a>00260
-<a name="l00261"></a>00261 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_pipeline_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00361.html b/doc/html/a00361.html
deleted file mode 100644
index ebb635f..0000000
--- a/doc/html/a00361.html
+++ /dev/null
@@ -1,124 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>queuing_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstring></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031
-<a name="l00032"></a><a class="code" href="a00160.html">00032</a> <span class="keyword">class </span><a class="code" href="a00160.html">queuing_mutex</a> {
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00160.html#b389ad9c4db7293e4bdb5b8cda69ec04">00035</a> <a class="code" href="a00160.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
-<a name="l00036"></a>00036 q_tail = NULL;
-<a name="l00037"></a>00037 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span> internal_construct();
-<a name="l00039"></a>00039 <span class="preprocessor">#endif</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span> }
-<a name="l00041"></a>00041
-<a name="l00043"></a>00043
-<a name="l00045"></a><a class="code" href="a00161.html">00045</a> <span class="keyword">class </span><a class="code" href="a00161.html">scoped_lock</a>: internal::no_copy {
-<a name="l00047"></a>00047 <span class="keywordtype">void</span> initialize() {
-<a name="l00048"></a>00048 <a class="code" href="a00150.html">mutex</a> = NULL;
-<a name="l00049"></a>00049 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> internal::poison_pointer(next);
-<a name="l00051"></a>00051 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053 <span class="keyword">public</span>:
-<a name="l00055"></a>00055
-<a name="l00056"></a><a class="code" href="a00161.html#db0fa3967491014572e24d6607bdc971">00056</a> <a class="code" href="a00161.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059
-<a name="l00060"></a><a class="code" href="a00161.html#9b51ef972f5618ac17caadb58841ab6d">00060</a> <a class="code" href="a00161.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00160.html">queuing_mutex</a>& m ) {
-<a name="l00061"></a>00061 initialize();
-<a name="l00062"></a>00062 <a class="code" href="a00161.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
-<a name="l00063"></a>00063 }
-<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00161.html#ac2c576a93570957d694192a5f491443">00066</a> <a class="code" href="a00161.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00067"></a>00067 <span class="keywordflow">if</span>( <a class="code" href="a00150.html">mutex</a> ) <a class="code" href="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069
-<a name="l00071"></a>00071 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00161.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00160.html">queuing_mutex</a>& m );
-<a name="l00072"></a>00072
-<a name="l00074"></a>00074 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00161.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00160.html">queuing_mutex</a>& m );
-<a name="l00075"></a>00075
-<a name="l00077"></a>00077 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00078"></a>00078
-<a name="l00079"></a>00079 <span class="keyword">private</span>:
-<a name="l00081"></a>00081 <a class="code" href="a00160.html">queuing_mutex</a>* <a class="code" href="a00150.html">mutex</a>;
-<a name="l00082"></a>00082
-<a name="l00084"></a>00084 <a class="code" href="a00161.html">scoped_lock</a> *next;
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087
-<a name="l00090"></a>00090 internal::uintptr going;
-<a name="l00091"></a>00091 };
-<a name="l00092"></a>00092
-<a name="l00093"></a>00093 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="comment">// Mutex traits</span>
-<a name="l00096"></a>00096 <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="l00097"></a>00097 <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="l00098"></a>00098 <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="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00101"></a>00101 <span class="keyword">private</span>:
-<a name="l00103"></a>00103 <a class="code" href="a00122.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 };
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
-<a name="l00108"></a>00108
-<a name="l00109"></a>00109 } <span class="comment">// namespace tbb</span>
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00362.html
index a547547..b13baca 100644
--- a/doc/html/a00362.html
+++ b/doc/html/a00362.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>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_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 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,115 +39,204 @@
<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_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_mutex_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstring></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031
-<a name="l00034"></a><a class="code" href="a00162.html">00034</a> <span class="keyword">class </span><a class="code" href="a00162.html">queuing_rw_mutex</a> {
-<a name="l00035"></a>00035 <span class="keyword">public</span>:
-<a name="l00037"></a><a class="code" href="a00162.html#85c90877c3447690ac4e2ac4ff8dea5e">00037</a> <a class="code" href="a00162.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
-<a name="l00038"></a>00038 q_tail = NULL;
-<a name="l00039"></a>00039 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span> internal_construct();
-<a name="l00041"></a>00041 <span class="preprocessor">#endif</span>
-<a name="l00042"></a>00042 <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 <windows.h></span>
+<a name="l00026"></a>00026 <span class="preprocessor"> #if !defined(_WIN32_WINNT)</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// The following Windows API function is declared explicitly;</span>
+<a name="l00028"></a>00028 <span class="comment">// otherwise any user would have to specify /D_WIN32_WINNT=0x0400</span>
+<a name="l00029"></a>00029 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+<a name="l00030"></a>00030 <span class="preprocessor"> #endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* if not _WIN32||_WIN64 */</span>
+<a name="l00032"></a>00032 <span class="preprocessor"> #include <pthread.h></span>
+<a name="l00033"></a>00033 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00034"></a>00034
+<a name="l00035"></a>00035 <span class="preprocessor">#include <new></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00039"></a>00039
+<a name="l00040"></a>00040 <span class="keyword">namespace </span>tbb {
+<a name="l00041"></a>00041
<a name="l00043"></a>00043
-<a name="l00045"></a><a class="code" href="a00162.html#1ba73e3d95cfdf8323880bc623af9099">00045</a> <a class="code" href="a00162.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
-<a name="l00046"></a>00046 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> __TBB_ASSERT( !q_tail, <span class="stringliteral">"destruction of an acquired mutex"</span>);
-<a name="l00048"></a>00048 <span class="preprocessor">#endif</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span> }
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 <span class="keyword">class </span>scoped_lock;
-<a name="l00052"></a>00052 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00053"></a>00053
-<a name="l00055"></a>00055
-<a name="l00057"></a><a class="code" href="a00163.html">00057</a> <span class="keyword">class </span><a class="code" href="a00163.html">scoped_lock</a>: internal::no_copy {
-<a name="l00059"></a>00059 <span class="keywordtype">void</span> initialize() {
-<a name="l00060"></a>00060 <a class="code" href="a00150.html">mutex</a> = NULL;
-<a name="l00061"></a>00061 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span> state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00063"></a>00063 internal::poison_pointer(next);
-<a name="l00064"></a>00064 internal::poison_pointer(prev);
-<a name="l00065"></a>00065 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00066"></a>00066 }
-<a name="l00067"></a>00067 <span class="keyword">public</span>:
-<a name="l00069"></a>00069
-<a name="l00070"></a><a class="code" href="a00163.html#c62e365be7bcbba091c9ea7454a4d22c">00070</a> <a class="code" href="a00163.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
-<a name="l00071"></a>00071
-<a name="l00073"></a>00073
-<a name="l00074"></a><a class="code" href="a00163.html#fbb8798792d3aebb136c46fc63d2529e">00074</a> <a class="code" href="a00163.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00162.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
-<a name="l00075"></a>00075 initialize();
-<a name="l00076"></a>00076 <a class="code" href="a00163.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
-<a name="l00077"></a>00077 }
-<a name="l00078"></a>00078
-<a name="l00080"></a><a class="code" href="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">00080</a> <a class="code" href="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00081"></a>00081 <span class="keywordflow">if</span>( <a class="code" href="a00150.html">mutex</a> ) <a class="code" href="a00163.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00082"></a>00082 }
-<a name="l00083"></a>00083
-<a name="l00085"></a>00085 <span class="keywordtype">void</span> <a class="code" href="a00163.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00162.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00086"></a>00086
-<a name="l00088"></a>00088 <span class="keywordtype">bool</span> <a class="code" href="a00163.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00162.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00089"></a>00089
-<a name="l00091"></a>00091 <span class="keywordtype">void</span> <a class="code" href="a00163.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00092"></a>00092
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="keywordtype">bool</span> <a class="code" href="a00163.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
+<a name="l00045"></a><a class="code" href="a00172.html">00045</a> <span class="keyword">class </span><a class="code" href="a00172.html">mutex</a> {
+<a name="l00046"></a>00046 <span class="keyword">public</span>:
+<a name="l00048"></a><a class="code" href="a00172.html#05313cb77d4f85213103d4dab74ed454">00048</a> <a class="code" href="a00172.html#05313cb77d4f85213103d4dab74ed454">mutex</a>() {
+<a name="l00049"></a>00049 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span> internal_construct();
+<a name="l00051"></a>00051 <span class="preprocessor">#else</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span> InitializeCriticalSection(&impl);
+<a name="l00054"></a>00054 <span class="preprocessor"> #else</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span> <span class="keywordtype">int</span> error_code = pthread_mutex_init(&impl,NULL);
+<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">"mutex: pthread_mutex_init failed"</span>);
+<a name="l00058"></a>00058 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
+<a name="l00059"></a>00059 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00060"></a>00060 };
+<a name="l00061"></a>00061
+<a name="l00062"></a>00062 ~<a class="code" href="a00172.html">mutex</a>() {
+<a name="l00063"></a>00063 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00064"></a>00064 <span class="preprocessor"></span> internal_destroy();
+<a name="l00065"></a>00065 <span class="preprocessor">#else</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00067"></a>00067 <span class="preprocessor"></span> DeleteCriticalSection(&impl);
+<a name="l00068"></a>00068 <span class="preprocessor"> #else</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span> pthread_mutex_destroy(&impl);
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00073"></a>00073 };
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075 <span class="keyword">class </span>scoped_lock;
+<a name="l00076"></a>00076 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
+<a name="l00077"></a>00077
+<a name="l00079"></a>00079
+<a name="l00081"></a><a class="code" href="a00173.html">00081</a> <span class="keyword">class </span><a class="code" href="a00173.html">scoped_lock</a> : internal::no_copy {
+<a name="l00082"></a>00082 <span class="keyword">public</span>:
+<a name="l00084"></a><a class="code" href="a00173.html#1d403ae51b484df5d86d85ae38f11e6e">00084</a> <a class="code" href="a00173.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
+<a name="l00085"></a>00085
+<a name="l00087"></a><a class="code" href="a00173.html#605a6b9af0f8cdabdf81825e0de99600">00087</a> <a class="code" href="a00173.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00172.html">mutex</a>& <a class="code" href="a00172.html">mutex</a> ) {
+<a name="l00088"></a>00088 <a class="code" href="a00173.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
+<a name="l00089"></a>00089 }
+<a name="l00090"></a>00090
+<a name="l00092"></a><a class="code" href="a00173.html#0ebbbecaf4311e9df7362cb76ceaa368">00092</a> <a class="code" href="a00173.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>() {
+<a name="l00093"></a>00093 <span class="keywordflow">if</span>( my_mutex )
+<a name="l00094"></a>00094 <a class="code" href="a00173.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
+<a name="l00095"></a>00095 }
<a name="l00096"></a>00096
-<a name="l00098"></a>00098 <span class="keywordtype">bool</span> <a class="code" href="a00163.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="keyword">private</span>:
-<a name="l00102"></a>00102 <a class="code" href="a00162.html">queuing_rw_mutex</a>* <a class="code" href="a00150.html">mutex</a>;
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105 <a class="code" href="a00163.html">scoped_lock</a> * prev, * next;
+<a name="l00098"></a><a class="code" href="a00173.html#862e022841cdc522e4296a5533b22efd">00098</a> <span class="keywordtype">void</span> <a class="code" href="a00173.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00172.html">mutex</a>& <a class="code" href="a00172.html">mutex</a> ) {
+<a name="l00099"></a>00099 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00100"></a>00100 <span class="preprocessor"></span> internal_acquire(mutex);
+<a name="l00101"></a>00101 <span class="preprocessor">#else</span>
+<a name="l00102"></a>00102 <span class="preprocessor"></span> mutex.<a class="code" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">lock</a>();
+<a name="l00103"></a>00103 my_mutex = &mutex;
+<a name="l00104"></a>00104 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00105"></a>00105 }
<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
-<a name="l00108"></a>00108
-<a name="l00110"></a>00110 <a class="code" href="a00122.html">atomic<state_t></a> state;
-<a name="l00111"></a>00111
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
-<a name="l00115"></a>00115
-<a name="l00117"></a>00117 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
+<a name="l00108"></a><a class="code" href="a00173.html#591e0c49b82bcedffcbe0923f1b915ec">00108</a> <span class="keywordtype">bool</span> <a class="code" href="a00173.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00172.html">mutex</a>& <a class="code" href="a00172.html">mutex</a> ) {
+<a name="l00109"></a>00109 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire (mutex);
+<a name="l00111"></a>00111 <span class="preprocessor">#else</span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00172.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>();
+<a name="l00113"></a>00113 <span class="keywordflow">if</span>( result )
+<a name="l00114"></a>00114 my_mutex = &mutex;
+<a name="l00115"></a>00115 <span class="keywordflow">return</span> result;
+<a name="l00116"></a>00116 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00117"></a>00117 }
<a name="l00118"></a>00118
-<a name="l00120"></a>00120 <span class="keywordtype">void</span> acquire_internal_lock();
-<a name="l00121"></a>00121
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="keywordtype">bool</span> try_acquire_internal_lock();
-<a name="l00125"></a>00125
-<a name="l00127"></a>00127 <span class="keywordtype">void</span> release_internal_lock();
+<a name="l00120"></a><a class="code" href="a00173.html#0d51d18cd99df3b2e93bf07378d0992c">00120</a> <span class="keywordtype">void</span> <a class="code" href="a00173.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>() {
+<a name="l00121"></a>00121 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span> internal_release ();
+<a name="l00123"></a>00123 <span class="preprocessor">#else</span>
+<a name="l00124"></a>00124 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>();
+<a name="l00125"></a>00125 my_mutex = NULL;
+<a name="l00126"></a>00126 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00127"></a>00127 }
<a name="l00128"></a>00128
-<a name="l00130"></a>00130 <span class="keywordtype">void</span> wait_for_release_of_internal_lock();
-<a name="l00131"></a>00131
-<a name="l00133"></a>00133 <span class="keywordtype">void</span> unblock_or_wait_on_internal_lock( uintptr_t );
-<a name="l00134"></a>00134 };
+<a name="l00129"></a>00129 <span class="keyword">private</span>:
+<a name="l00131"></a>00131 <a class="code" href="a00172.html">mutex</a>* my_mutex;
+<a name="l00132"></a>00132
+<a name="l00134"></a>00134 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00172.html">mutex</a>& m );
<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="comment">// Mutex traits</span>
-<a name="l00139"></a>00139 <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="l00140"></a>00140 <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="l00141"></a>00141 <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="l00142"></a>00142
-<a name="l00143"></a>00143 <span class="keyword">private</span>:
-<a name="l00145"></a>00145 <a class="code" href="a00122.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 };
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 __TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 } <span class="comment">// namespace tbb</span>
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
+<a name="l00137"></a>00137 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00172.html">mutex</a>& m );
+<a name="l00138"></a>00138
+<a name="l00140"></a>00140 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
+<a name="l00141"></a>00141
+<a name="l00142"></a>00142 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00172.html">mutex</a>;
+<a name="l00143"></a>00143 };
+<a name="l00144"></a>00144
+<a name="l00145"></a>00145 <span class="comment">// Mutex traits</span>
+<a name="l00146"></a>00146 <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="l00147"></a>00147 <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="l00148"></a>00148 <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="l00149"></a>00149
+<a name="l00150"></a>00150 <span class="comment">// ISO C++0x compatibility methods</span>
+<a name="l00151"></a>00151
+<a name="l00153"></a><a class="code" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">00153</a> <span class="keywordtype">void</span> <a class="code" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
+<a name="l00154"></a>00154 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00155"></a>00155 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00156"></a>00156 <span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00173.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00157"></a>00157 <span class="preprocessor">#else</span>
+<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00159"></a>00159 <span class="preprocessor"></span> EnterCriticalSection(&impl);
+<a name="l00160"></a>00160 <span class="preprocessor"> #else</span>
+<a name="l00161"></a>00161 <span class="preprocessor"></span> pthread_mutex_lock(&impl);
+<a name="l00162"></a>00162 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00163"></a>00163 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00164"></a>00164 }
+<a name="l00165"></a>00165
+<a name="l00167"></a>00167
+<a name="l00168"></a><a class="code" href="a00172.html#4331652c79dea1c1131bd59ab161b234">00168</a> <span class="keywordtype">bool</span> <a class="code" href="a00172.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
+<a name="l00169"></a>00169 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00170"></a>00170 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00171"></a>00171 <a class="code" href="a00173.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00172"></a>00172 s.<a class="code" href="a00173.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
+<a name="l00173"></a>00173 <span class="keywordflow">return</span> s.<a class="code" href="a00173.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
+<a name="l00174"></a>00174 <span class="preprocessor">#else</span>
+<a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
+<a name="l00177"></a>00177 <span class="preprocessor"> #else</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span> <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
+<a name="l00179"></a>00179 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00180"></a>00180 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00181"></a>00181 }
+<a name="l00182"></a>00182
+<a name="l00184"></a><a class="code" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">00184</a> <span class="keywordtype">void</span> <a class="code" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
+<a name="l00185"></a>00185 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00187"></a>00187 <a class="code" href="a00173.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00188"></a>00188 s.<a class="code" href="a00173.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00189"></a>00189 s.<a class="code" href="a00173.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
+<a name="l00190"></a>00190 <span class="preprocessor">#else</span>
+<a name="l00191"></a>00191 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00192"></a>00192 <span class="preprocessor"></span> LeaveCriticalSection(&impl);
+<a name="l00193"></a>00193 <span class="preprocessor"> #else</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span> pthread_mutex_unlock(&impl);
+<a name="l00195"></a>00195 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00196"></a>00196 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00197"></a>00197 }
+<a name="l00198"></a>00198
+<a name="l00200"></a>00200 <span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00201"></a><a class="code" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">00201</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
+<a name="l00202"></a>00202 <span class="preprocessor"> #else</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
+<a name="l00204"></a>00204 <span class="preprocessor"> #endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span> <a class="code" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>) &impl; }
+<a name="l00206"></a>00206
+<a name="l00207"></a>00207 <span class="keyword">enum</span> state_t {
+<a name="l00208"></a>00208 INITIALIZED=0x1234,
+<a name="l00209"></a>00209 DESTROYED=0x789A,
+<a name="l00210"></a>00210 HELD=0x56CD
+<a name="l00211"></a>00211 };
+<a name="l00212"></a>00212 <span class="keyword">private</span>:
+<a name="l00213"></a>00213 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00214"></a>00214 <span class="preprocessor"></span> CRITICAL_SECTION impl;
+<a name="l00215"></a>00215 <span class="keyword">enum</span> state_t state;
+<a name="l00216"></a>00216 <span class="preprocessor">#else</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span> pthread_mutex_t impl;
+<a name="l00218"></a>00218 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00219"></a>00219
+<a name="l00221"></a>00221 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00222"></a>00222
+<a name="l00224"></a>00224 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
+<a name="l00225"></a>00225
+<a name="l00226"></a>00226 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="keyword">public</span>:
+<a name="l00229"></a><a class="code" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">00229</a> <span class="keywordtype">void</span> <a class="code" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>( state_t to ) { state = to; }
+<a name="l00230"></a>00230 <span class="preprocessor">#endif</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span>};
+<a name="l00232"></a>00232
+<a name="l00233"></a>00233 __TBB_DEFINE_PROFILING_SET_NAME(mutex)
+<a name="l00234"></a>00234
+<a name="l00235"></a>00235 } <span class="comment">// namespace tbb </span>
+<a name="l00236"></a>00236
+<a name="l00237"></a>00237 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_mutex_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00363.html b/doc/html/a00363.html
deleted file mode 100644
index 8cdb4d5..0000000
--- a/doc/html/a00363.html
+++ /dev/null
@@ -1,247 +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-2010 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>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <windows.h></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if !defined(_WIN32_WINNT)</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="comment">// The following Windows API function is declared explicitly;</span>
-<a name="l00029"></a>00029 <span class="comment">// otherwise any user would have to specify /D_WIN32_WINNT=0x0400</span>
-<a name="l00030"></a>00030 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
-<a name="l00031"></a>00031 <span class="preprocessor">#endif</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#else </span><span class="comment">/* if not _WIN32||_WIN64 */</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#include <pthread.h></span>
-<a name="l00036"></a>00036 <span class="keyword">namespace </span>tbb { <span class="keyword">namespace </span>internal {
-<a name="l00037"></a>00037 <span class="comment">// Use this internal TBB function to throw an exception</span>
-<a name="l00038"></a>00038 <span class="keyword">extern</span> <span class="keywordtype">void</span> handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* what );
-<a name="l00039"></a>00039 } } <span class="comment">//namespaces</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="preprocessor">#include <new></span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">namespace </span>tbb {
-<a name="l00050"></a>00050
-<a name="l00052"></a><a class="code" href="a00164.html">00052</a> <span class="keyword">class </span><a class="code" href="a00164.html">recursive_mutex</a> {
-<a name="l00053"></a>00053 <span class="keyword">public</span>:
-<a name="l00055"></a><a class="code" href="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00055</a> <a class="code" href="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>() {
-<a name="l00056"></a>00056 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span> internal_construct();
-<a name="l00058"></a>00058 <span class="preprocessor">#else</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span> InitializeCriticalSection(&impl);
-<a name="l00061"></a>00061 <span class="preprocessor"> #else</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span> pthread_mutexattr_t mtx_attr;
-<a name="l00063"></a>00063 <span class="keywordtype">int</span> error_code = pthread_mutexattr_init( &mtx_attr );
-<a name="l00064"></a>00064 <span class="keywordflow">if</span>( error_code )
-<a name="l00065"></a>00065 tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutexattr_init failed"</span>);
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );
-<a name="l00068"></a>00068 error_code = pthread_mutex_init( &impl, &mtx_attr );
-<a name="l00069"></a>00069 <span class="keywordflow">if</span>( error_code )
-<a name="l00070"></a>00070 tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutex_init failed"</span>);
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 pthread_mutexattr_destroy( &mtx_attr );
-<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 ~<a class="code" href="a00164.html">recursive_mutex</a>() {
-<a name="l00078"></a>00078 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span> internal_destroy();
-<a name="l00080"></a>00080 <span class="preprocessor">#else</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span> DeleteCriticalSection(&impl);
-<a name="l00083"></a>00083 <span class="preprocessor"> #else</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span> pthread_mutex_destroy(&impl);
-<a name="l00085"></a>00085
-<a name="l00086"></a>00086 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00087"></a>00087 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00088"></a>00088 };
-<a name="l00089"></a>00089
-<a name="l00090"></a>00090 <span class="keyword">class </span>scoped_lock;
-<a name="l00091"></a>00091 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00092"></a>00092
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00165.html">00096</a> <span class="keyword">class </span><a class="code" href="a00165.html">scoped_lock</a>: internal::no_copy {
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00099"></a><a class="code" href="a00165.html#d82d4d36fbf9727a493d26ae50855fe7">00099</a> <a class="code" href="a00165.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
-<a name="l00100"></a>00100
-<a name="l00102"></a><a class="code" href="a00165.html#dec17713c4c1321ac8fec66816d0c602">00102</a> <a class="code" href="a00165.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00164.html">recursive_mutex</a>& <a class="code" href="a00150.html">mutex</a> ) {
-<a name="l00103"></a>00103 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span> my_mutex = &mutex;
-<a name="l00105"></a>00105 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00106"></a>00106 <a class="code" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108
-<a name="l00110"></a><a class="code" href="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00110</a> <a class="code" href="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>() {
-<a name="l00111"></a>00111 <span class="keywordflow">if</span>( my_mutex )
-<a name="l00112"></a>00112 <a class="code" href="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114
-<a name="l00116"></a><a class="code" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">00116</a> <span class="keywordtype">void</span> <a class="code" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00164.html">recursive_mutex</a>& <a class="code" href="a00150.html">mutex</a> ) {
-<a name="l00117"></a>00117 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span> internal_acquire( mutex );
-<a name="l00119"></a>00119 <span class="preprocessor">#else</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span> my_mutex = &mutex;
-<a name="l00121"></a>00121 mutex.<a class="code" href="a00164.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>();
-<a name="l00122"></a>00122 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00123"></a>00123 }
-<a name="l00124"></a>00124
-<a name="l00126"></a><a class="code" href="a00165.html#36bfc3e93e3ef6340abef4901444d340">00126</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00164.html">recursive_mutex</a>& <a class="code" href="a00150.html">mutex</a> ) {
-<a name="l00127"></a>00127 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire( mutex );
-<a name="l00129"></a>00129 <span class="preprocessor">#else</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00164.html#86e719b0afee25704af11ab97694d240">try_lock</a>();
-<a name="l00131"></a>00131 <span class="keywordflow">if</span>( result )
-<a name="l00132"></a>00132 my_mutex = &mutex;
-<a name="l00133"></a>00133 <span class="keywordflow">return</span> result;
-<a name="l00134"></a>00134 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00135"></a>00135 }
-<a name="l00136"></a>00136
-<a name="l00138"></a><a class="code" href="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">00138</a> <span class="keywordtype">void</span> <a class="code" href="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>() {
-<a name="l00139"></a>00139 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span> internal_release();
-<a name="l00141"></a>00141 <span class="preprocessor">#else</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00164.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>();
-<a name="l00143"></a>00143 my_mutex = NULL;
-<a name="l00144"></a>00144 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<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="a00164.html">recursive_mutex</a>* my_mutex;
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00164.html">recursive_mutex</a>& m );
-<a name="l00153"></a>00153
-<a name="l00155"></a>00155 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00164.html">recursive_mutex</a>& m );
-<a name="l00156"></a>00156
-<a name="l00158"></a>00158 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00164.html">recursive_mutex</a>;
-<a name="l00161"></a>00161 };
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="comment">// Mutex traits</span>
-<a name="l00164"></a>00164 <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="l00165"></a>00165 <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="l00166"></a>00166 <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="l00167"></a>00167
-<a name="l00168"></a>00168 <span class="comment">// C++0x compatibility interface</span>
-<a name="l00169"></a>00169
-<a name="l00171"></a><a class="code" href="a00164.html#4c342c69d47f4bb0b393535dee4015d6">00171</a> <span class="keywordtype">void</span> <a class="code" href="a00164.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>() {
-<a name="l00172"></a>00172 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span> <a class="code" href="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00174"></a>00174 <span class="keyword">new</span>(tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00165.html">scoped_lock</a>(*<span class="keyword">this</span>);
-<a name="l00175"></a>00175 <span class="preprocessor">#else</span>
-<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span> EnterCriticalSection(&impl);
-<a name="l00178"></a>00178 <span class="preprocessor"> #else</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span> pthread_mutex_lock(&impl);
-<a name="l00180"></a>00180 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00181"></a>00181 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00186"></a><a class="code" href="a00164.html#86e719b0afee25704af11ab97694d240">00186</a> <span class="keywordtype">bool</span> <a class="code" href="a00164.html#86e719b0afee25704af11ab97694d240">try_lock</a>() {
-<a name="l00187"></a>00187 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span> <a class="code" href="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00189"></a>00189 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00165.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
-<a name="l00190"></a>00190 <span class="preprocessor">#else </span>
-<a name="l00191"></a>00191 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00192"></a>00192 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
-<a name="l00193"></a>00193 <span class="preprocessor"> #else</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span> <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
-<a name="l00195"></a>00195 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00196"></a>00196 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198
-<a name="l00200"></a><a class="code" href="a00164.html#f0a96e26b7f074588dc31e32524856ae">00200</a> <span class="keywordtype">void</span> <a class="code" href="a00164.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>() {
-<a name="l00201"></a>00201 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00202"></a>00202 <span class="preprocessor"></span> <a class="code" href="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00203"></a>00203 <a class="code" href="a00165.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00204"></a>00204 s.<a class="code" href="a00165.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00205"></a>00205 s.<a class="code" href="a00165.html#43ed37cec508072e53a52113c8040137">internal_release</a>();
-<a name="l00206"></a>00206 <span class="preprocessor">#else</span>
-<a name="l00207"></a>00207 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span> LeaveCriticalSection(&impl);
-<a name="l00209"></a>00209 <span class="preprocessor"> #else</span>
-<a name="l00210"></a>00210 <span class="preprocessor"></span> pthread_mutex_unlock(&impl);
-<a name="l00211"></a>00211 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00212"></a>00212 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="keyword">private</span>:
-<a name="l00216"></a>00216 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00217"></a>00217 <span class="preprocessor"></span> CRITICAL_SECTION impl;
-<a name="l00218"></a>00218 <span class="keyword">enum</span> state_t {
-<a name="l00219"></a>00219 INITIALIZED=0x1234,
-<a name="l00220"></a>00220 DESTROYED=0x789A,
-<a name="l00221"></a>00221 } state;
-<a name="l00222"></a>00222 <span class="preprocessor">#else</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span> pthread_mutex_t impl;
-<a name="l00224"></a>00224 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00225"></a>00225
-<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00231"></a>00231 };
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 __TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)
-<a name="l00234"></a>00234
-<a name="l00235"></a>00235 } <span class="comment">// namespace tbb </span>
-<a name="l00236"></a>00236
-<a name="l00237"></a>00237 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_recursive_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00364.html b/doc/html/a00364.html
index aa6817f..4713d74 100644
--- a/doc/html/a00364.html
+++ b/doc/html/a00364.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>scalable_allocator.h Source File</title>
+<title>null_mutex.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -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>scalable_allocator.h</h1><a href="a00218.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>null_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 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,158 +39,40 @@
<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="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_null_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_null_mutex_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00166.html">00111</a> <span class="keyword">class </span><a class="code" href="a00166.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="a00166.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="a00166.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00125"></a>00125 <a class="code" href="a00166.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00166.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="a00166.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00166.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="a00166.html#726b1586d05d44665a36e1c7b2699bfd">00132</a> pointer <a class="code" href="a00166.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="a00243.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="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
-<a name="l00138"></a>00138 <a class="code" href="a00243.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00142"></a><a class="code" href="a00166.html#880e766f1d913988c21973dbdd874fd5">00142</a> size_type <a class="code" href="a00166.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="a00167.html">00157</a> <span class="keyword">class </span><a class="code" href="a00166.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="a00166.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="a00166.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00166.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>
+<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="a00174.html">00029</a> <span class="keyword">class </span><a class="code" href="a00174.html">null_mutex</a> {
+<a name="l00031"></a>00031 <a class="code" href="a00174.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00174.html">null_mutex</a>& );
+<a name="l00032"></a>00032 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00174.html">null_mutex</a>& );
+<a name="l00033"></a>00033 <span class="keyword">public</span>:
+<a name="l00035"></a><a class="code" href="a00175.html">00035</a> <span class="keyword">class </span><a class="code" href="a00175.html">scoped_lock</a> {
+<a name="l00036"></a>00036 <span class="keyword">public</span>:
+<a name="l00037"></a>00037 <a class="code" href="a00175.html">scoped_lock</a>() {}
+<a name="l00038"></a>00038 <a class="code" href="a00175.html">scoped_lock</a>( <a class="code" href="a00174.html">null_mutex</a>& ) {}
+<a name="l00039"></a>00039 ~<a class="code" href="a00175.html">scoped_lock</a>() {}
+<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00174.html">null_mutex</a>& ) {}
+<a name="l00041"></a>00041 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00174.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="a00174.html">null_mutex</a>() {}
+<a name="l00046"></a>00046
+<a name="l00047"></a>00047 <span class="comment">// Mutex traits </span>
+<a name="l00048"></a>00048 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
+<a name="l00049"></a>00049 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
+<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
+<a name="l00051"></a>00051 };
+<a name="l00052"></a>00052
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054
+<a name="l00055"></a>00055 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_null_mutex_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00365.html b/doc/html/a00365.html
index 10c360e..b2fc592 100644
--- a/doc/html/a00365.html
+++ b/doc/html/a00365.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>spin_mutex.h Source File</title>
+<title>null_rw_mutex.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -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>spin_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>null_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 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,151 +39,42 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_spin_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_spin_mutex_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_null_rw_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_null_rw_mutex_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstddef></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>tbb {
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00039"></a><a class="code" href="a00169.html">00039</a> <span class="keyword">class </span><a class="code" href="a00169.html">spin_mutex</a> {
-<a name="l00041"></a>00041 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> 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="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a> <a class="code" href="a00169.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="a00170.html">00053</a> <span class="keyword">class </span><a class="code" href="a00170.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="a00169.html">spin_mutex</a>* my_mutex;
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 internal::uintptr 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="a00169.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="a00169.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="a00169.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="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a> <a class="code" href="a00170.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="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a> <a class="code" href="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00169.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="a00169.html#81b0b05fb71280ce0c79708e82569d86">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="a00170.html#3ee3c338732b1f64b0b32a757807a30d">00088</a> <span class="keywordtype">void</span> <a class="code" href="a00170.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00169.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="a00169.html#81b0b05fb71280ce0c79708e82569d86">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="a00170.html#9297ec188534b45dc0ca48f2f39a0501">00099</a> <span class="keywordtype">bool</span> <a class="code" href="a00170.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00169.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="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>);
-<a name="l00104"></a>00104 <span class="keywordflow">if</span>( result ) {
-<a name="l00105"></a>00105 my_unlock_value = 0;
-<a name="l00106"></a>00106 my_mutex = &m;
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> result;
-<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00113"></a><a class="code" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00170.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_store_with_release(my_mutex-><a class="code" href="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>, static_cast<unsigned char>(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="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a> <a class="code" href="a00170.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_store_with_release(my_mutex-><a class="code" href="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>, static_cast<unsigned char>(my_unlock_value));
-<a name="l00129"></a>00129 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132 };
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="comment">// Mutex traits</span>
-<a name="l00137"></a>00137 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00138"></a>00138 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00139"></a>00139 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00142"></a>00142
-<a name="l00144"></a><a class="code" href="a00169.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00169.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="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00170.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="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00169.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="a00121.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="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00170.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="a00169.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00169.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="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00168"></a>00168 <a class="code" href="a00170.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00169"></a>00169 s.<a class="code" href="a00170.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00170"></a>00170 s.<a class="code" href="a00170.html#0821c9dc231cd41586306fd54f701873">my_unlock_value</a> = 0;
-<a name="l00171"></a>00171 s.<a class="code" href="a00170.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
-<a name="l00172"></a>00172 <span class="preprocessor">#else</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span> __TBB_store_with_release(flag, 0);
-<a name="l00174"></a>00174 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 __TBB_DEFINE_PROFILING_SET_NAME(spin_mutex)
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 } <span class="comment">// namespace tbb</span>
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_mutex_H */</span>
+<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="a00176.html">00029</a> <span class="keyword">class </span><a class="code" href="a00176.html">null_rw_mutex</a> {
+<a name="l00031"></a>00031 <a class="code" href="a00176.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00176.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="a00176.html">null_rw_mutex</a>& );
+<a name="l00033"></a>00033 <span class="keyword">public</span>:
+<a name="l00035"></a><a class="code" href="a00177.html">00035</a> <span class="keyword">class </span><a class="code" href="a00177.html">scoped_lock</a> {
+<a name="l00036"></a>00036 <span class="keyword">public</span>:
+<a name="l00037"></a>00037 <a class="code" href="a00177.html">scoped_lock</a>() {}
+<a name="l00038"></a>00038 <a class="code" href="a00177.html">scoped_lock</a>( <a class="code" href="a00176.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
+<a name="l00039"></a>00039 ~<a class="code" href="a00177.html">scoped_lock</a>() {}
+<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00176.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="a00176.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="a00176.html">null_rw_mutex</a>() {}
+<a name="l00048"></a>00048
+<a name="l00049"></a>00049 <span class="comment">// Mutex traits </span>
+<a name="l00050"></a>00050 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
+<a name="l00051"></a>00051 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
+<a name="l00052"></a>00052 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
+<a name="l00053"></a>00053 };
+<a name="l00054"></a>00054
+<a name="l00055"></a>00055 }
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_null_rw_mutex_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00366.html b/doc/html/a00366.html
index 2443c51..d809dc8 100644
--- a/doc/html/a00366.html
+++ b/doc/html/a00366.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>spin_rw_mutex.h Source File</title>
+<title>parallel_do.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -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>spin_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>parallel_do.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 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,177 +39,439 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_spin_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_spin_rw_mutex_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_do_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_do_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include <iterator></span>
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">class </span>spin_rw_mutex_v3;
-<a name="l00031"></a>00031 <span class="keyword">typedef</span> spin_rw_mutex_v3 spin_rw_mutex;
-<a name="l00032"></a>00032
+<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
+<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item> <span class="keyword">class </span>parallel_do_feeder_impl;
+<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> Body> <span class="keyword">class </span>do_group_task;
<a name="l00034"></a>00034
-<a name="l00035"></a><a class="code" href="a00171.html">00035</a> <span class="keyword">class </span><a class="code" href="a00171.html">spin_rw_mutex_v3</a> {
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_acquire_writer();
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release_writer();
-<a name="l00044"></a>00044
-<a name="l00046"></a>00046 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire_reader();
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_upgrade();
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_downgrade();
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release_reader();
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_writer();
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_reader();
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00067"></a><a class="code" href="a00171.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00171.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="a00171.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="a00172.html">00083</a> <span class="keyword">class </span><a class="code" href="a00172.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="a00172.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00172.html">scoped_lock</a>() : <a class="code" href="a00150.html">mutex</a>(NULL), is_writer(false) {}
+<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00037"></a>00037 <span class="keyword">struct </span>strip { <span class="keyword">typedef</span> T type; };
+<a name="l00038"></a>00038 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00039"></a>00039 <span class="keyword">struct </span>strip<T&> { <span class="keyword">typedef</span> T type; };
+<a name="l00040"></a>00040 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00041"></a>00041 <span class="keyword">struct </span>strip<const T&> { <span class="keyword">typedef</span> T type; };
+<a name="l00042"></a>00042 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00043"></a>00043 <span class="keyword">struct </span>strip<volatile T&> { <span class="keyword">typedef</span> T type; };
+<a name="l00044"></a>00044 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00045"></a>00045 <span class="keyword">struct </span>strip<const volatile T&> { <span class="keyword">typedef</span> T type; };
+<a name="l00046"></a>00046 <span class="comment">// Most of the compilers remove cv-qualifiers from non-reference function argument types. </span>
+<a name="l00047"></a>00047 <span class="comment">// But unfortunately there are those that don't.</span>
+<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00049"></a>00049 <span class="keyword">struct </span>strip<const T> { <span class="keyword">typedef</span> T type; };
+<a name="l00050"></a>00050 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00051"></a>00051 <span class="keyword">struct </span>strip<volatile T> { <span class="keyword">typedef</span> T type; };
+<a name="l00052"></a>00052 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00053"></a>00053 <span class="keyword">struct </span>strip<const volatile T> { <span class="keyword">typedef</span> T type; };
+<a name="l00054"></a>00054 } <span class="comment">// namespace internal</span>
+<a name="l00056"></a>00056 <span class="comment"></span>
+<a name="l00058"></a>00058
+<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> Item>
+<a name="l00060"></a><a class="code" href="a00178.html">00060</a> <span class="keyword">class </span><a class="code" href="a00178.html">parallel_do_feeder</a>: internal::no_copy
+<a name="l00061"></a>00061 {
+<a name="l00062"></a>00062 <a class="code" href="a00178.html">parallel_do_feeder</a>() {}
+<a name="l00063"></a>00063 <span class="keyword">virtual</span> ~<a class="code" href="a00178.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="a00178.html#40baaf0f6856f4491dd0adf896c93516">00068</a> <span class="keywordtype">void</span> <a class="code" href="a00178.html#40baaf0f6856f4491dd0adf896c93516">add</a>( <span class="keyword">const</span> Item& item ) {internal_add(item);}
+<a name="l00069"></a>00069 };
+<a name="l00070"></a>00070
+<a name="l00072"></a>00072 <span class="keyword">namespace </span>internal {
+<a name="l00074"></a>00074
+<a name="l00076"></a>00076 <span class="keyword">template</span><<span class="keyword">class</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00077"></a>00077 <span class="keyword">class </span>parallel_do_operator_selector
+<a name="l00078"></a>00078 {
+<a name="l00079"></a>00079 <span class="keyword">typedef</span> parallel_do_feeder<Item> Feeder;
+<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2, <span class="keyword">typename</span> CvItem >
+<a name="l00081"></a>00081 <span class="keyword">static</span> <span class="keywordtype">void</span> internal_call( <span class="keyword">const</span> Body& obj, A1& arg1, A2&, <span class="keywordtype">void</span> (Body::*)(CvItem) <span class="keyword">const</span> ) {
+<a name="l00082"></a>00082 obj(arg1);
+<a name="l00083"></a>00083 }
+<a name="l00084"></a>00084 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2, <span class="keyword">typename</span> CvItem >
+<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keywordtype">void</span> internal_call( <span class="keyword">const</span> Body& obj, A1& arg1, A2& arg2, <span class="keywordtype">void</span> (Body::*)(CvItem, parallel_do_feeder<Item>&) <span class="keyword">const</span> ) {
+<a name="l00086"></a>00086 obj(arg1, arg2);
+<a name="l00087"></a>00087 }
<a name="l00088"></a>00088
-<a name="l00090"></a>00090
-<a name="l00091"></a><a class="code" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">00091</a> <a class="code" href="a00172.html">scoped_lock</a>( <a class="code" href="a00171.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00150.html">mutex</a>(NULL) {
-<a name="l00092"></a>00092 <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00096</a> ~<a class="code" href="a00172.html">scoped_lock</a>() {
-<a name="l00097"></a>00097 <span class="keywordflow">if</span>( <a class="code" href="a00150.html">mutex</a> ) <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l00098"></a>00098 }
-<a name="l00099"></a>00099
-<a name="l00101"></a><a class="code" href="a00172.html#b0b646ec5be02a127d159bbb7ca65353">00101</a> <span class="keywordtype">void</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00171.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00102"></a>00102 __TBB_ASSERT( !<a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00103"></a>00103 is_writer = write;
-<a name="l00104"></a>00104 <a class="code" href="a00150.html">mutex</a> = &m;
-<a name="l00105"></a>00105 <span class="keywordflow">if</span>( write ) <a class="code" href="a00150.html">mutex</a>->internal_acquire_writer();
-<a name="l00106"></a>00106 <span class="keywordflow">else</span> <a class="code" href="a00150.html">mutex</a>->internal_acquire_reader();
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108
-<a name="l00110"></a>00110
-<a name="l00111"></a><a class="code" href="a00172.html#3f0b1e3f2efab63336400348bd070226">00111</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
-<a name="l00112"></a>00112 __TBB_ASSERT( <a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00113"></a>00113 __TBB_ASSERT( !is_writer, <span class="stringliteral">"not a reader"</span> );
-<a name="l00114"></a>00114 is_writer = <span class="keyword">true</span>;
-<a name="l00115"></a>00115 <span class="keywordflow">return</span> <a class="code" href="a00150.html">mutex</a>->internal_upgrade();
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00119"></a><a class="code" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">00119</a> <span class="keywordtype">void</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00120"></a>00120 __TBB_ASSERT( <a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00121"></a>00121 <a class="code" href="a00171.html">spin_rw_mutex</a> *m = <a class="code" href="a00150.html">mutex</a>;
-<a name="l00122"></a>00122 <a class="code" href="a00150.html">mutex</a> = NULL;
-<a name="l00123"></a>00123 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) m->internal_release_writer();
-<a name="l00125"></a>00125 <span class="keywordflow">else</span> m->internal_release_reader();
-<a name="l00126"></a>00126 <span class="preprocessor">#else</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00171.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
-<a name="l00128"></a>00128 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00171.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
-<a name="l00129"></a>00129 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131
-<a name="l00133"></a><a class="code" href="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">00133</a> <span class="keywordtype">bool</span> downgrade_to_reader() {
-<a name="l00134"></a>00134 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span> __TBB_ASSERT( <a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00136"></a>00136 __TBB_ASSERT( is_writer, <span class="stringliteral">"not a writer"</span> );
-<a name="l00137"></a>00137 <a class="code" href="a00150.html">mutex</a>->internal_downgrade();
-<a name="l00138"></a>00138 <span class="preprocessor">#else</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span> __TBB_FetchAndAddW( &<a class="code" href="a00150.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
-<a name="l00140"></a>00140 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00141"></a>00141 is_writer = <span class="keyword">false</span>;
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00144"></a>00144 }
+<a name="l00089"></a>00089 <span class="keyword">public</span>:
+<a name="l00090"></a>00090 <span class="keyword">template</span><<span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2 >
+<a name="l00091"></a>00091 <span class="keyword">static</span> <span class="keywordtype">void</span> call( <span class="keyword">const</span> Body& obj, A1& arg1, A2& arg2 )
+<a name="l00092"></a>00092 {
+<a name="l00093"></a>00093 internal_call( obj, arg1, arg2, &Body::operator() );
+<a name="l00094"></a>00094 }
+<a name="l00095"></a>00095 };
+<a name="l00096"></a>00096
+<a name="l00098"></a>00098
+<a name="l00100"></a>00100 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00101"></a>00101 <span class="keyword">class </span>do_iteration_task: <span class="keyword">public</span> task
+<a name="l00102"></a>00102 {
+<a name="l00103"></a>00103 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
+<a name="l00104"></a>00104
+<a name="l00105"></a>00105 Item my_value;
+<a name="l00106"></a>00106 feeder_type& my_feeder;
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108 do_iteration_task( <span class="keyword">const</span> Item& value, feeder_type& feeder ) :
+<a name="l00109"></a>00109 my_value(value), my_feeder(feeder)
+<a name="l00110"></a>00110 {}
+<a name="l00111"></a>00111
+<a name="l00112"></a>00112 <span class="comment">/*override*/</span>
+<a name="l00113"></a>00113 task* execute()
+<a name="l00114"></a>00114 {
+<a name="l00115"></a>00115 parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, my_value, my_feeder);
+<a name="l00116"></a>00116 <span class="keywordflow">return</span> NULL;
+<a name="l00117"></a>00117 }
+<a name="l00118"></a>00118
+<a name="l00119"></a>00119 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>parallel_do_feeder_impl;
+<a name="l00120"></a>00120 }; <span class="comment">// class do_iteration_task</span>
+<a name="l00121"></a>00121
+<a name="l00122"></a>00122 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00123"></a>00123 <span class="keyword">class </span>do_iteration_task_iter: <span class="keyword">public</span> task
+<a name="l00124"></a>00124 {
+<a name="l00125"></a>00125 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
+<a name="l00126"></a>00126
+<a name="l00127"></a>00127 Iterator my_iter;
+<a name="l00128"></a>00128 feeder_type& my_feeder;
+<a name="l00129"></a>00129
+<a name="l00130"></a>00130 do_iteration_task_iter( <span class="keyword">const</span> Iterator& iter, feeder_type& feeder ) :
+<a name="l00131"></a>00131 my_iter(iter), my_feeder(feeder)
+<a name="l00132"></a>00132 {}
+<a name="l00133"></a>00133
+<a name="l00134"></a>00134 <span class="comment">/*override*/</span>
+<a name="l00135"></a>00135 task* execute()
+<a name="l00136"></a>00136 {
+<a name="l00137"></a>00137 parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, *my_iter, my_feeder);
+<a name="l00138"></a>00138 <span class="keywordflow">return</span> NULL;
+<a name="l00139"></a>00139 }
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_group_task_forward;
+<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_group_task_input;
+<a name="l00143"></a>00143 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
+<a name="l00144"></a>00144 }; <span class="comment">// class do_iteration_task_iter</span>
<a name="l00145"></a>00145
-<a name="l00147"></a><a class="code" href="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">00147</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00171.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00148"></a>00148 __TBB_ASSERT( !<a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00149"></a>00149 <span class="keywordtype">bool</span> result;
-<a name="l00150"></a>00150 is_writer = write;
-<a name="l00151"></a>00151 result = write? m.internal_try_acquire_writer()
-<a name="l00152"></a>00152 : m.internal_try_acquire_reader();
-<a name="l00153"></a>00153 <span class="keywordflow">if</span>( result )
-<a name="l00154"></a>00154 <a class="code" href="a00150.html">mutex</a> = &m;
-<a name="l00155"></a>00155 <span class="keywordflow">return</span> result;
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keyword">private</span>:
-<a name="l00160"></a>00160 <a class="code" href="a00171.html">spin_rw_mutex</a>* <a class="code" href="a00150.html">mutex</a>;
-<a name="l00161"></a>00161
-<a name="l00163"></a>00163
-<a name="l00164"></a>00164 <span class="keywordtype">bool</span> is_writer;
-<a name="l00165"></a>00165 };
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 <span class="comment">// Mutex traits</span>
-<a name="l00168"></a>00168 <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="l00169"></a>00169 <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="l00170"></a>00170 <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="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00173"></a>00173
-<a name="l00175"></a><a class="code" href="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">00175</a> <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
-<a name="l00176"></a>00176
-<a name="l00178"></a>00178
-<a name="l00179"></a><a class="code" href="a00171.html#088bb256be794cc47d3b83791632fdfc">00179</a> <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
-<a name="l00180"></a>00180
-<a name="l00182"></a><a class="code" href="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">00182</a> <span class="keywordtype">void</span> unlock() {
-<a name="l00183"></a>00183 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) internal_release_writer();
-<a name="l00185"></a>00185 <span class="keywordflow">else</span> internal_release_reader();
-<a name="l00186"></a>00186 <span class="preprocessor">#else</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) __TBB_AtomicAND( &state, READERS );
-<a name="l00188"></a>00188 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);
-<a name="l00189"></a>00189 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="comment">// Methods for reader locks that resemble ISO C++0x compatibility methods.</span>
-<a name="l00193"></a>00193
-<a name="l00195"></a><a class="code" href="a00171.html#13f799708ac4ca437a16be202e263e18">00195</a> <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
+<a name="l00147"></a>00147
+<a name="l00149"></a>00149 <span class="keyword">template</span><<span class="keyword">class</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00150"></a>00150 <span class="keyword">class </span>parallel_do_feeder_impl : <span class="keyword">public</span> parallel_do_feeder<Item>
+<a name="l00151"></a>00151 {
+<a name="l00152"></a>00152 <span class="comment">/*override*/</span>
+<a name="l00153"></a>00153 <span class="keywordtype">void</span> internal_add( <span class="keyword">const</span> Item& item )
+<a name="l00154"></a>00154 {
+<a name="l00155"></a>00155 <span class="keyword">typedef</span> do_iteration_task<Body, Item> iteration_type;
+<a name="l00156"></a>00156
+<a name="l00157"></a>00157 iteration_type& t = *<span class="keyword">new</span> (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *<span class="keyword">this</span>);
+<a name="l00158"></a>00158
+<a name="l00159"></a>00159 t.spawn( t );
+<a name="l00160"></a>00160 }
+<a name="l00161"></a>00161 <span class="keyword">public</span>:
+<a name="l00162"></a>00162 <span class="keyword">const</span> Body* my_body;
+<a name="l00163"></a>00163 empty_task* my_barrier;
+<a name="l00164"></a>00164
+<a name="l00165"></a>00165 parallel_do_feeder_impl()
+<a name="l00166"></a>00166 {
+<a name="l00167"></a>00167 my_barrier = <span class="keyword">new</span>( <a class="code" href="a00199.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="a00201.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="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(context) ) empty_task();
+<a name="l00175"></a>00175 __TBB_ASSERT(my_barrier, <span class="stringliteral">"root task allocation failed"</span>);
+<a name="l00176"></a>00176 }
+<a name="l00177"></a>00177 <span class="preprocessor">#endif</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>
+<a name="l00179"></a>00179 ~parallel_do_feeder_impl()
+<a name="l00180"></a>00180 {
+<a name="l00181"></a>00181 my_barrier->destroy(*my_barrier);
+<a name="l00182"></a>00182 }
+<a name="l00183"></a>00183 }; <span class="comment">// class parallel_do_feeder_impl</span>
+<a name="l00184"></a>00184
+<a name="l00185"></a>00185
+<a name="l00187"></a>00187
+<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00191"></a>00191 <span class="keyword">class </span>do_group_task_forward: <span class="keyword">public</span> task
+<a name="l00192"></a>00192 {
+<a name="l00193"></a>00193 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
+<a name="l00194"></a>00194
+<a name="l00195"></a>00195 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
<a name="l00196"></a>00196
-<a name="l00198"></a>00198
-<a name="l00199"></a><a class="code" href="a00171.html#b8667415869013f840d976aa406d385a">00199</a> <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="keyword">private</span>:
-<a name="l00202"></a>00202 <span class="keyword">typedef</span> intptr_t state_t;
-<a name="l00203"></a>00203 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER = 1;
-<a name="l00204"></a>00204 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER_PENDING = 2;
-<a name="l00205"></a>00205 <span class="keyword">static</span> <span class="keyword">const</span> state_t READERS = ~(WRITER | WRITER_PENDING);
-<a name="l00206"></a>00206 <span class="keyword">static</span> <span class="keyword">const</span> state_t ONE_READER = 4;
-<a name="l00207"></a>00207 <span class="keyword">static</span> <span class="keyword">const</span> state_t BUSY = WRITER | READERS;
-<a name="l00209"></a>00209
-<a name="l00212"></a>00212 state_t state;
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00215"></a>00215 };
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 __TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 } <span class="comment">// namespace tbb</span>
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_rw_mutex_H */</span>
+<a name="l00197"></a>00197 feeder_type& my_feeder;
+<a name="l00198"></a>00198 Iterator my_first;
+<a name="l00199"></a>00199 size_t my_size;
+<a name="l00200"></a>00200
+<a name="l00201"></a>00201 do_group_task_forward( Iterator first, size_t size, feeder_type& feeder )
+<a name="l00202"></a>00202 : my_feeder(feeder), my_first(first), my_size(size)
+<a name="l00203"></a>00203 {}
+<a name="l00204"></a>00204
+<a name="l00205"></a>00205 <span class="comment">/*override*/</span> task* execute()
+<a name="l00206"></a>00206 {
+<a name="l00207"></a>00207 <span class="keyword">typedef</span> do_iteration_task_iter<Iterator, Body, Item> iteration_type;
+<a name="l00208"></a>00208 __TBB_ASSERT( my_size>0, NULL );
+<a name="l00209"></a>00209 task_list list;
+<a name="l00210"></a>00210 task* t;
+<a name="l00211"></a>00211 size_t k=0;
+<a name="l00212"></a>00212 <span class="keywordflow">for</span>(;;) {
+<a name="l00213"></a>00213 t = <span class="keyword">new</span>( allocate_child() ) iteration_type( my_first, my_feeder );
+<a name="l00214"></a>00214 ++my_first;
+<a name="l00215"></a>00215 <span class="keywordflow">if</span>( ++k==my_size ) <span class="keywordflow">break</span>;
+<a name="l00216"></a>00216 list.push_back(*t);
+<a name="l00217"></a>00217 }
+<a name="l00218"></a>00218 set_ref_count(<span class="keywordtype">int</span>(k+1));
+<a name="l00219"></a>00219 spawn(list);
+<a name="l00220"></a>00220 spawn_and_wait_for_all(*t);
+<a name="l00221"></a>00221 <span class="keywordflow">return</span> NULL;
+<a name="l00222"></a>00222 }
+<a name="l00223"></a>00223
+<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> _Item> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
+<a name="l00225"></a>00225 }; <span class="comment">// class do_group_task_forward</span>
+<a name="l00226"></a>00226
+<a name="l00227"></a>00227 <span class="keyword">template</span><<span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00228"></a>00228 <span class="keyword">class </span>do_group_task_input: <span class="keyword">public</span> task
+<a name="l00229"></a>00229 {
+<a name="l00230"></a>00230 <span class="keyword">static</span> <span class="keyword">const</span> size_t max_arg_size = 4;
+<a name="l00231"></a>00231
+<a name="l00232"></a>00232 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
+<a name="l00233"></a>00233
+<a name="l00234"></a>00234 feeder_type& my_feeder;
+<a name="l00235"></a>00235 size_t my_size;
+<a name="l00236"></a>00236 aligned_space<Item, max_arg_size> my_arg;
+<a name="l00237"></a>00237
+<a name="l00238"></a>00238 do_group_task_input( feeder_type& feeder )
+<a name="l00239"></a>00239 : my_feeder(feeder), my_size(0)
+<a name="l00240"></a>00240 {}
+<a name="l00241"></a>00241
+<a name="l00242"></a>00242 <span class="comment">/*override*/</span> task* execute()
+<a name="l00243"></a>00243 {
+<a name="l00244"></a>00244 <span class="keyword">typedef</span> do_iteration_task_iter<Item*, Body, Item> iteration_type;
+<a name="l00245"></a>00245 __TBB_ASSERT( my_size>0, NULL );
+<a name="l00246"></a>00246 task_list list;
+<a name="l00247"></a>00247 task* t;
+<a name="l00248"></a>00248 size_t k=0;
+<a name="l00249"></a>00249 <span class="keywordflow">for</span>(;;) {
+<a name="l00250"></a>00250 t = <span class="keyword">new</span>( allocate_child() ) iteration_type( my_arg.begin() + k, my_feeder );
+<a name="l00251"></a>00251 <span class="keywordflow">if</span>( ++k==my_size ) <span class="keywordflow">break</span>;
+<a name="l00252"></a>00252 list.push_back(*t);
+<a name="l00253"></a>00253 }
+<a name="l00254"></a>00254 set_ref_count(<span class="keywordtype">int</span>(k+1));
+<a name="l00255"></a>00255 spawn(list);
+<a name="l00256"></a>00256 spawn_and_wait_for_all(*t);
+<a name="l00257"></a>00257 <span class="keywordflow">return</span> NULL;
+<a name="l00258"></a>00258 }
+<a name="l00259"></a>00259
+<a name="l00260"></a>00260 ~do_group_task_input(){
+<a name="l00261"></a>00261 <span class="keywordflow">for</span>( size_t k=0; k<my_size; ++k)
+<a name="l00262"></a>00262 (my_arg.begin() + k)->~Item();
+<a name="l00263"></a>00263 }
+<a name="l00264"></a>00264
+<a name="l00265"></a>00265 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator_, <span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>do_task_iter;
+<a name="l00266"></a>00266 }; <span class="comment">// class do_group_task_input</span>
+<a name="l00267"></a>00267
+<a name="l00269"></a>00269
+<a name="l00271"></a>00271 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00272"></a>00272 <span class="keyword">class </span>do_task_iter: <span class="keyword">public</span> task
+<a name="l00273"></a>00273 {
+<a name="l00274"></a>00274 <span class="keyword">typedef</span> parallel_do_feeder_impl<Body, Item> feeder_type;
+<a name="l00275"></a>00275
+<a name="l00276"></a>00276 <span class="keyword">public</span>:
+<a name="l00277"></a>00277 do_task_iter( Iterator first, Iterator last , feeder_type& feeder ) :
+<a name="l00278"></a>00278 my_first(first), my_last(last), my_feeder(feeder)
+<a name="l00279"></a>00279 {}
+<a name="l00280"></a>00280
+<a name="l00281"></a>00281 <span class="keyword">private</span>:
+<a name="l00282"></a>00282 Iterator my_first;
+<a name="l00283"></a>00283 Iterator my_last;
+<a name="l00284"></a>00284 feeder_type& my_feeder;
+<a name="l00285"></a>00285
+<a name="l00286"></a>00286 <span class="comment">/* Do not merge run(xxx) and run_xxx() methods. They are separated in order</span>
+<a name="l00287"></a>00287 <span class="comment"> to make sure that compilers will eliminate unused argument of type xxx</span>
+<a name="l00288"></a>00288 <span class="comment"> (that is will not put it on stack). The sole purpose of this argument </span>
+<a name="l00289"></a>00289 <span class="comment"> is overload resolution.</span>
+<a name="l00290"></a>00290 <span class="comment"> </span>
+<a name="l00291"></a>00291 <span class="comment"> An alternative could be using template functions, but explicit specialization </span>
+<a name="l00292"></a>00292 <span class="comment"> of member function templates is not supported for non specialized class </span>
+<a name="l00293"></a>00293 <span class="comment"> templates. Besides template functions would always fall back to the least </span>
+<a name="l00294"></a>00294 <span class="comment"> efficient variant (the one for input iterators) in case of iterators having </span>
+<a name="l00295"></a>00295 <span class="comment"> custom tags derived from basic ones. */</span>
+<a name="l00296"></a>00296 <span class="comment">/*override*/</span> task* execute()
+<a name="l00297"></a>00297 {
+<a name="l00298"></a>00298 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::iterator_traits<Iterator>::iterator_category iterator_tag;
+<a name="l00299"></a>00299 <span class="keywordflow">return</span> run( (iterator_tag*)NULL );
+<a name="l00300"></a>00300 }
+<a name="l00301"></a>00301
+<a name="l00304"></a>00304 <span class="keyword">inline</span> task* run( <span class="keywordtype">void</span>* ) { <span class="keywordflow">return</span> run_for_input_iterator(); }
+<a name="l00305"></a>00305
+<a name="l00306"></a>00306 task* run_for_input_iterator() {
+<a name="l00307"></a>00307 <span class="keyword">typedef</span> do_group_task_input<Body, Item> block_type;
+<a name="l00308"></a>00308
+<a name="l00309"></a>00309 block_type& t = *<span class="keyword">new</span>( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(my_feeder);
+<a name="l00310"></a>00310 size_t k=0;
+<a name="l00311"></a>00311 <span class="keywordflow">while</span>( !(my_first == my_last) ) {
+<a name="l00312"></a>00312 <span class="keyword">new</span> (t.my_arg.begin() + k) Item(*my_first);
+<a name="l00313"></a>00313 ++my_first;
+<a name="l00314"></a>00314 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
+<a name="l00315"></a>00315 <span class="keywordflow">if</span> ( !(my_first == my_last) )
+<a name="l00316"></a>00316 recycle_to_reexecute();
+<a name="l00317"></a>00317 <span class="keywordflow">break</span>;
+<a name="l00318"></a>00318 }
+<a name="l00319"></a>00319 }
+<a name="l00320"></a>00320 <span class="keywordflow">if</span>( k==0 ) {
+<a name="l00321"></a>00321 destroy(t);
+<a name="l00322"></a>00322 <span class="keywordflow">return</span> NULL;
+<a name="l00323"></a>00323 } <span class="keywordflow">else</span> {
+<a name="l00324"></a>00324 t.my_size = k;
+<a name="l00325"></a>00325 <span class="keywordflow">return</span> &t;
+<a name="l00326"></a>00326 }
+<a name="l00327"></a>00327 }
+<a name="l00328"></a>00328
+<a name="l00329"></a>00329 <span class="keyword">inline</span> task* run( std::forward_iterator_tag* ) { <span class="keywordflow">return</span> run_for_forward_iterator(); }
+<a name="l00330"></a>00330
+<a name="l00331"></a>00331 task* run_for_forward_iterator() {
+<a name="l00332"></a>00332 <span class="keyword">typedef</span> do_group_task_forward<Iterator, Body, Item> block_type;
+<a name="l00333"></a>00333
+<a name="l00334"></a>00334 Iterator first = my_first;
+<a name="l00335"></a>00335 size_t k=0;
+<a name="l00336"></a>00336 <span class="keywordflow">while</span>( !(my_first==my_last) ) {
+<a name="l00337"></a>00337 ++my_first;
+<a name="l00338"></a>00338 <span class="keywordflow">if</span>( ++k==block_type::max_arg_size ) {
+<a name="l00339"></a>00339 <span class="keywordflow">if</span> ( !(my_first==my_last) )
+<a name="l00340"></a>00340 recycle_to_reexecute();
+<a name="l00341"></a>00341 <span class="keywordflow">break</span>;
+<a name="l00342"></a>00342 }
+<a name="l00343"></a>00343 }
+<a name="l00344"></a>00344 <span class="keywordflow">return</span> k==0 ? NULL : <span class="keyword">new</span>( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(first, k, my_feeder);
+<a name="l00345"></a>00345 }
+<a name="l00346"></a>00346
+<a name="l00347"></a>00347 <span class="keyword">inline</span> task* run( std::random_access_iterator_tag* ) { <span class="keywordflow">return</span> run_for_random_access_iterator(); }
+<a name="l00348"></a>00348
+<a name="l00349"></a>00349 task* run_for_random_access_iterator() {
+<a name="l00350"></a>00350 <span class="keyword">typedef</span> do_group_task_forward<Iterator, Body, Item> block_type;
+<a name="l00351"></a>00351 <span class="keyword">typedef</span> do_iteration_task_iter<Iterator, Body, Item> iteration_type;
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353 size_t k = static_cast<size_t>(my_last-my_first);
+<a name="l00354"></a>00354 <span class="keywordflow">if</span>( k > block_type::max_arg_size ) {
+<a name="l00355"></a>00355 Iterator middle = my_first + k/2;
+<a name="l00356"></a>00356
+<a name="l00357"></a>00357 empty_task& c = *<span class="keyword">new</span>( allocate_continuation() ) empty_task;
+<a name="l00358"></a>00358 do_task_iter& b = *<span class="keyword">new</span>( c.allocate_child() ) do_task_iter(middle, my_last, my_feeder);
+<a name="l00359"></a>00359 recycle_as_child_of(c);
+<a name="l00360"></a>00360
+<a name="l00361"></a>00361 my_last = middle;
+<a name="l00362"></a>00362 c.set_ref_count(2);
+<a name="l00363"></a>00363 c.spawn(b);
+<a name="l00364"></a>00364 <span class="keywordflow">return</span> <span class="keyword">this</span>;
+<a name="l00365"></a>00365 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>( k != 0 ) {
+<a name="l00366"></a>00366 task_list list;
+<a name="l00367"></a>00367 task* t;
+<a name="l00368"></a>00368 size_t k1=0;
+<a name="l00369"></a>00369 <span class="keywordflow">for</span>(;;) {
+<a name="l00370"></a>00370 t = <span class="keyword">new</span>( allocate_child() ) iteration_type(my_first, my_feeder);
+<a name="l00371"></a>00371 ++my_first;
+<a name="l00372"></a>00372 <span class="keywordflow">if</span>( ++k1==k ) <span class="keywordflow">break</span>;
+<a name="l00373"></a>00373 list.push_back(*t);
+<a name="l00374"></a>00374 }
+<a name="l00375"></a>00375 set_ref_count(<span class="keywordtype">int</span>(k+1));
+<a name="l00376"></a>00376 spawn(list);
+<a name="l00377"></a>00377 spawn_and_wait_for_all(*t);
+<a name="l00378"></a>00378 }
+<a name="l00379"></a>00379 <span class="keywordflow">return</span> NULL;
+<a name="l00380"></a>00380 }
+<a name="l00381"></a>00381 }; <span class="comment">// class do_task_iter</span>
+<a name="l00382"></a>00382
+<a name="l00384"></a>00384
+<a name="l00386"></a>00386 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00387"></a>00387 <span class="keywordtype">void</span> run_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body
+<a name="l00388"></a>00388 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00389"></a>00389 , task_group_context& context
+<a name="l00390"></a>00390 #endif
+<a name="l00391"></a>00391 )
+<a name="l00392"></a>00392 {
+<a name="l00393"></a>00393 <span class="keyword">typedef</span> do_task_iter<Iterator, Body, Item> root_iteration_task;
+<a name="l00394"></a>00394 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00395"></a>00395 <span class="preprocessor"></span> parallel_do_feeder_impl<Body, Item> feeder(context);
+<a name="l00396"></a>00396 <span class="preprocessor">#else</span>
+<a name="l00397"></a>00397 <span class="preprocessor"></span> parallel_do_feeder_impl<Body, Item> feeder;
+<a name="l00398"></a>00398 <span class="preprocessor">#endif</span>
+<a name="l00399"></a>00399 <span class="preprocessor"></span> feeder.my_body = &body;
+<a name="l00400"></a>00400
+<a name="l00401"></a>00401 root_iteration_task &t = *<span class="keyword">new</span>( feeder.my_barrier->allocate_child() ) root_iteration_task(first, last, feeder);
+<a name="l00402"></a>00402
+<a name="l00403"></a>00403 feeder.my_barrier->set_ref_count(2);
+<a name="l00404"></a>00404 feeder.my_barrier->spawn_and_wait_for_all(t);
+<a name="l00405"></a>00405 }
+<a name="l00406"></a>00406
+<a name="l00408"></a>00408
+<a name="l00410"></a>00410 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item>
+<a name="l00411"></a>00411 <span class="keywordtype">void</span> select_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <span class="keywordtype">void</span> (Body::*)(Item) <span class="keyword">const</span>
+<a name="l00412"></a>00412 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00413"></a>00413 , task_group_context& context
+<a name="l00414"></a>00414 #endif <span class="comment">// __TBB_TASK_GROUP_CONTEXT </span>
+<a name="l00415"></a>00415 )
+<a name="l00416"></a>00416 {
+<a name="l00417"></a>00417 run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
+<a name="l00418"></a>00418 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00419"></a>00419 <span class="preprocessor"></span> , context
+<a name="l00420"></a>00420 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT </span>
+<a name="l00421"></a>00421 <span class="preprocessor"></span> );
+<a name="l00422"></a>00422 }
+<a name="l00423"></a>00423
+<a name="l00425"></a>00425
+<a name="l00427"></a>00427 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Item, <span class="keyword">typename</span> _Item>
+<a name="l00428"></a>00428 <span class="keywordtype">void</span> select_parallel_do( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <span class="keywordtype">void</span> (Body::*)(Item, parallel_do_feeder<_Item>&) <span class="keyword">const</span>
+<a name="l00429"></a>00429 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00430"></a>00430 , task_group_context& context
+<a name="l00431"></a>00431 #endif <span class="comment">// __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00432"></a>00432 )
+<a name="l00433"></a>00433 {
+<a name="l00434"></a>00434 run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
+<a name="l00435"></a>00435 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00436"></a>00436 <span class="preprocessor"></span> , context
+<a name="l00437"></a>00437 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00438"></a>00438 <span class="preprocessor"></span> );
+<a name="l00439"></a>00439 }
+<a name="l00440"></a>00440
+<a name="l00441"></a>00441 } <span class="comment">// namespace internal</span>
+<a name="l00443"></a>00443 <span class="comment"></span>
+<a name="l00444"></a>00444
+<a name="l00467"></a>00467
+<a name="l00468"></a>00468
+<a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body>
+<a name="l00470"></a><a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00201.html">task_group_context</a> context;
+<a name="l00476"></a>00476 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00477"></a>00477 <span class="preprocessor"></span> internal::select_parallel_do( first, last, body, &Body::operator()
+<a name="l00478"></a>00478 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00479"></a>00479 , context
+<a name="l00480"></a>00480 #endif <span class="comment">// __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00481"></a>00481 );
+<a name="l00482"></a>00482 }
+<a name="l00483"></a>00483
+<a name="l00484"></a>00484 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00486"></a>00486 <span class="preprocessor"></span>
+<a name="l00487"></a>00487 <span class="preprocessor">template<typename Iterator, typename Body> </span>
+<a name="l00488"></a><a class="code" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00201.html">task_group_context</a>& context )
+<a name="l00489"></a>00489 {
+<a name="l00490"></a>00490 <span class="keywordflow">if</span> ( first == last )
+<a name="l00491"></a>00491 <span class="keywordflow">return</span>;
+<a name="l00492"></a>00492 internal::select_parallel_do( first, last, body, &Body::operator(), context );
+<a name="l00493"></a>00493 }
+<a name="l00494"></a>00494 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00495"></a>00495 <span class="preprocessor"></span>
+<a name="l00497"></a>00497
+<a name="l00498"></a>00498 } <span class="comment">// namespace </span>
+<a name="l00499"></a>00499
+<a name="l00500"></a>00500 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_do_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00367.html b/doc/html/a00367.html
deleted file mode 100644
index 61d92ad..0000000
--- a/doc/html/a00367.html
+++ /dev/null
@@ -1,609 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>task.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">class </span>task;
-<a name="l00030"></a>00030 <span class="keyword">class </span>task_list;
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="keyword">class </span>task_group_context;
-<a name="l00034"></a>00034 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00035"></a>00035
-<a name="l00037"></a>00037 <span class="keyword">namespace </span>internal {
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">class </span>scheduler: no_copy {
-<a name="l00040"></a>00040 <span class="keyword">public</span>:
-<a name="l00042"></a>00042 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( task& first, task*& next ) = 0;
-<a name="l00043"></a>00043
-<a name="l00045"></a>00045 <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( task& parent, task* child ) = 0;
-<a name="l00046"></a>00046
-<a name="l00048"></a>00048 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( task& first, task*& next ) = 0;
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051 <span class="comment">// Have to have it just to shut up overzealous compilation warnings</span>
-<a name="l00052"></a>00052 <span class="keyword">virtual</span> ~scheduler() = 0;
-<a name="l00053"></a>00053 };
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="keyword">typedef</span> intptr reference_count;
-<a name="l00058"></a>00058
-<a name="l00060"></a>00060 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> affinity_id;
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span> <span class="keyword">struct </span>context_list_node_t {
-<a name="l00064"></a>00064 context_list_node_t *my_prev,
-<a name="l00065"></a>00065 *my_next;
-<a name="l00066"></a>00066 };
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 <span class="keyword">class </span>allocate_root_with_context_proxy: no_assign {
-<a name="l00069"></a>00069 task_group_context& my_context;
-<a name="l00070"></a>00070 <span class="keyword">public</span>:
-<a name="l00071"></a>00071 allocate_root_with_context_proxy ( task_group_context& ctx ) : my_context(ctx) {}
-<a name="l00072"></a>00072 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00073"></a>00073 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00074"></a>00074 };
-<a name="l00075"></a>00075 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="keyword">class </span>allocate_root_proxy: no_assign {
-<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00079"></a>00079 <span class="keyword">static</span> task& __TBB_EXPORTED_FUNC allocate( size_t size );
-<a name="l00080"></a>00080 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free( task& );
-<a name="l00081"></a>00081 };
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="keyword">class </span>allocate_continuation_proxy: no_assign {
-<a name="l00084"></a>00084 <span class="keyword">public</span>:
-<a name="l00085"></a>00085 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00086"></a>00086 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="keyword">class </span>allocate_child_proxy: no_assign {
-<a name="l00090"></a>00090 <span class="keyword">public</span>:
-<a name="l00091"></a>00091 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00092"></a>00092 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00093"></a>00093 };
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="keyword">class </span>allocate_additional_child_of_proxy: no_assign {
-<a name="l00096"></a>00096 task& <span class="keyword">self</span>;
-<a name="l00097"></a>00097 task& parent;
-<a name="l00098"></a>00098 <span class="keyword">public</span>:
-<a name="l00099"></a>00099 allocate_additional_child_of_proxy( task& self_, task& parent_ ) : self(self_), parent(parent_) {}
-<a name="l00100"></a>00100 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00101"></a>00101 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00102"></a>00102 };
-<a name="l00103"></a>00103
-<a name="l00104"></a>00104 <span class="keyword">class </span>task_group_base;
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107
-<a name="l00112"></a>00112 <span class="keyword">class </span>task_prefix {
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00114"></a>00114 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00174.html">tbb::task</a>;
-<a name="l00115"></a>00115 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00176.html">tbb::task_list</a>;
-<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00117"></a>00117 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00118"></a>00118 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00119"></a>00119 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00120"></a>00120 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00121"></a>00121 <span class="keyword">friend</span> <span class="keyword">class </span>internal::task_group_base;
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span>
-<a name="l00128"></a>00128 <span class="preprocessor"> task_group_context *context;</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00130"></a>00130
-<a name="l00132"></a>00132
-<a name="l00137"></a>00137 scheduler* origin;
-<a name="l00138"></a>00138
-<a name="l00140"></a>00140 scheduler* owner;
-<a name="l00141"></a>00141
-<a name="l00143"></a>00143
-<a name="l00146"></a>00146 <a class="code" href="a00174.html">tbb::task</a>* parent;
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149
-<a name="l00153"></a>00153 reference_count ref_count;
-<a name="l00154"></a>00154
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 <span class="keywordtype">int</span> depth;
-<a name="l00158"></a>00158
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
-<a name="l00162"></a>00162
-<a name="l00164"></a>00164
-<a name="l00169"></a>00169 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 affinity_id affinity;
-<a name="l00172"></a>00172
-<a name="l00174"></a>00174 <a class="code" href="a00174.html">tbb::task</a>* next;
-<a name="l00175"></a>00175
-<a name="l00177"></a>00177 <a class="code" href="a00174.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 } <span class="comment">// namespace internal</span>
-<a name="l00182"></a>00182 <span class="comment"></span>
-<a name="l00183"></a>00183 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span>
-<a name="l00185"></a>00185 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keyword">class </span>tbb_exception;
-<a name="l00187"></a>00187 <span class="preprocessor">#else</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
-<a name="l00189"></a>00189 <span class="keyword">class </span>tbb_exception_ptr;
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00192"></a>00192
-<a name="l00194"></a>00194
-<a name="l00214"></a><a class="code" href="a00175.html">00214</a> <span class="keyword">class </span><a class="code" href="a00175.html">task_group_context</a> : internal::no_copy
-<a name="l00215"></a>00215 {
-<a name="l00216"></a>00216 <span class="keyword">private</span>:
-<a name="l00217"></a>00217 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00180.html">tbb_exception</a> <a class="code" href="a00180.html">exception_container_type</a>;
-<a name="l00219"></a>00219 <span class="preprocessor">#else</span>
-<a name="l00220"></a>00220 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00181.html">internal::tbb_exception_ptr</a> <a class="code" href="a00180.html">exception_container_type</a>;
-<a name="l00221"></a>00221 <span class="preprocessor">#endif</span>
-<a name="l00222"></a>00222 <span class="preprocessor"></span>
-<a name="l00223"></a>00223 <span class="keyword">enum</span> version_traits_word_layout {
-<a name="l00224"></a>00224 traits_offset = 16,
-<a name="l00225"></a>00225 version_mask = 0xFFFF,
-<a name="l00226"></a>00226 traits_mask = 0xFFFFul << traits_offset
-<a name="l00227"></a>00227 };
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">public</span>:
-<a name="l00230"></a>00230 <span class="keyword">enum</span> kind_type {
-<a name="l00231"></a>00231 isolated,
-<a name="l00232"></a>00232 bound
-<a name="l00233"></a>00233 };
-<a name="l00234"></a>00234
-<a name="l00235"></a>00235 <span class="keyword">enum</span> traits_type {
-<a name="l00236"></a>00236 exact_exception = 0x0001ul << traits_offset,
-<a name="l00237"></a>00237 no_cancellation = 0x0002ul << traits_offset,
-<a name="l00238"></a>00238 concurrent_wait = 0x0004ul << traits_offset,
-<a name="l00239"></a>00239 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span> default_traits = 0
-<a name="l00241"></a>00241 <span class="preprocessor">#else</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span> default_traits = exact_exception
-<a name="l00243"></a>00243 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00244"></a>00244 };
-<a name="l00245"></a>00245
-<a name="l00246"></a>00246 <span class="keyword">private</span>:
-<a name="l00247"></a>00247 <span class="keyword">union </span>{
-<a name="l00249"></a>00249 kind_type my_kind;
-<a name="l00250"></a>00250 uintptr_t _my_kind_aligner;
-<a name="l00251"></a>00251 };
-<a name="l00252"></a>00252
-<a name="l00254"></a>00254 <a class="code" href="a00175.html">task_group_context</a> *my_parent;
-<a name="l00255"></a>00255
-<a name="l00257"></a>00257
-<a name="l00259"></a>00259 internal::context_list_node_t my_node;
-<a name="l00260"></a>00260
-<a name="l00262"></a>00262
-<a name="l00265"></a>00265 <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize -
-<a name="l00266"></a>00266 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="l00267"></a>00267
-<a name="l00269"></a>00269 uintptr_t my_cancellation_requested;
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272
-<a name="l00275"></a>00275 uintptr_t my_version_and_traits;
-<a name="l00276"></a>00276
-<a name="l00278"></a>00278 <a class="code" href="a00180.html">exception_container_type</a> *my_exception;
-<a name="l00279"></a>00279
-<a name="l00281"></a>00281
-<a name="l00284"></a>00284 <span class="keywordtype">void</span> *my_owner;
-<a name="l00285"></a>00285
-<a name="l00287"></a>00287
-<a name="l00288"></a>00288 <span class="keywordtype">char</span> _trailing_padding[internal::NFS_MaxLineSize - <span class="keyword">sizeof</span>(intptr_t) - 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)];
-<a name="l00289"></a>00289
-<a name="l00290"></a>00290 <span class="keyword">public</span>:
-<a name="l00292"></a>00292
-<a name="l00319"></a><a class="code" href="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">00319</a> <a class="code" href="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a> ( kind_type relation_with_parent = bound,
-<a name="l00320"></a>00320 uintptr_t traits = default_traits )
-<a name="l00321"></a>00321 : my_kind(relation_with_parent)
-<a name="l00322"></a>00322 , my_version_and_traits(1 | traits)
-<a name="l00323"></a>00323 {
-<a name="l00324"></a>00324 <a class="code" href="a00175.html#49a55352084fd44b8863d182e839e6dc">init</a>();
-<a name="l00325"></a>00325 }
-<a name="l00326"></a>00326
-<a name="l00327"></a>00327 __TBB_EXPORTED_METHOD ~<a class="code" href="a00175.html">task_group_context</a> ();
-<a name="l00328"></a>00328
-<a name="l00330"></a>00330
-<a name="l00337"></a>00337 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00175.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a> ();
-<a name="l00338"></a>00338
-<a name="l00340"></a>00340
-<a name="l00347"></a>00347 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00175.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a> ();
-<a name="l00348"></a>00348
-<a name="l00350"></a>00350 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00175.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () <span class="keyword">const</span>;
-<a name="l00351"></a>00351
-<a name="l00353"></a>00353
-<a name="l00359"></a>00359 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00175.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ();
-<a name="l00360"></a>00360
-<a name="l00361"></a>00361 <span class="keyword">protected</span>:
-<a name="l00363"></a>00363
-<a name="l00364"></a>00364 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00175.html#49a55352084fd44b8863d182e839e6dc">init</a> ();
-<a name="l00365"></a>00365
-<a name="l00366"></a>00366 <span class="keyword">private</span>:
-<a name="l00367"></a>00367 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00174.html">task</a>;
-<a name="l00368"></a>00368 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00369"></a>00369
-<a name="l00370"></a>00370 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
-<a name="l00371"></a>00371 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
-<a name="l00372"></a>00372
-<a name="l00375"></a>00375 <span class="keywordtype">void</span> propagate_cancellation_from_ancestors ();
-<a name="l00376"></a>00376
-<a name="l00378"></a>00378 <span class="keywordtype">bool</span> is_alive () {
-<a name="l00379"></a>00379 <span class="preprocessor">#if TBB_USE_DEBUG</span>
-<a name="l00380"></a>00380 <span class="preprocessor"></span> <span class="keywordflow">return</span> my_version_and_traits != 0xDeadBeef;
-<a name="l00381"></a>00381 <span class="preprocessor">#else</span>
-<a name="l00382"></a>00382 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00383"></a>00383 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
-<a name="l00384"></a>00384 }
-<a name="l00385"></a>00385 }; <span class="comment">// class task_group_context</span>
-<a name="l00386"></a>00386
-<a name="l00387"></a>00387 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00388"></a>00388
-<a name="l00390"></a>00390
-<a name="l00391"></a><a class="code" href="a00174.html">00391</a> <span class="keyword">class </span><a class="code" href="a00174.html">task</a>: internal::no_copy {
-<a name="l00393"></a>00393 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
-<a name="l00394"></a>00394
-<a name="l00396"></a>00396 internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
-<a name="l00397"></a>00397
-<a name="l00398"></a>00398 <span class="keyword">protected</span>:
-<a name="l00400"></a><a class="code" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">00400</a> <a class="code" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>() {prefix().extra_state=1;}
-<a name="l00401"></a>00401
-<a name="l00402"></a>00402 <span class="keyword">public</span>:
-<a name="l00404"></a><a class="code" href="a00174.html#98245ee0473f84cb19dbbf8c81134908">00404</a> <span class="keyword">virtual</span> <a class="code" href="a00174.html#98245ee0473f84cb19dbbf8c81134908">~task</a>() {}
-<a name="l00405"></a>00405
-<a name="l00407"></a>00407 <span class="keyword">virtual</span> <a class="code" href="a00174.html">task</a>* <a class="code" href="a00174.html#22c298cd40937a431a06777423f002f6">execute</a>() = 0;
-<a name="l00408"></a>00408
-<a name="l00410"></a><a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e">00410</a> <span class="keyword">enum</span> <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
-<a name="l00412"></a>00412 <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a name="l00414"></a>00414 <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a name="l00416"></a>00416 <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a name="l00418"></a>00418 <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
-<a name="l00420"></a>00420 <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a name="l00422"></a>00422 <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
-<a name="l00423"></a>00423 };
-<a name="l00424"></a>00424
-<a name="l00425"></a>00425 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00426"></a>00426 <span class="comment">// Allocating tasks</span>
-<a name="l00427"></a>00427 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00428"></a>00428
-<a name="l00430"></a><a class="code" href="a00174.html#23acb0da0afd690da797f9f882027d34">00430</a> <span class="keyword">static</span> internal::allocate_root_proxy <a class="code" href="a00174.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>() {
-<a name="l00431"></a>00431 <span class="keywordflow">return</span> internal::allocate_root_proxy();
-<a name="l00432"></a>00432 }
-<a name="l00433"></a>00433
-<a name="l00434"></a>00434 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00436"></a><a class="code" href="a00174.html#8ccc518caf31075a3e073996d2d240a4">00436</a> <span class="preprocessor"> static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
-<a name="l00437"></a>00437 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
-<a name="l00438"></a>00438 }
-<a name="l00439"></a>00439 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00440"></a>00440
-<a name="l00442"></a>00442
-<a name="l00443"></a><a class="code" href="a00174.html#1434c79a5138993269d034008bff7329">00443</a> internal::allocate_continuation_proxy& allocate_continuation() {
-<a name="l00444"></a>00444 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
-<a name="l00445"></a>00445 }
-<a name="l00446"></a>00446
-<a name="l00448"></a><a class="code" href="a00174.html#1ff794f7053cd9148d5f280fbf07377f">00448</a> internal::allocate_child_proxy& allocate_child() {
-<a name="l00449"></a>00449 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
-<a name="l00450"></a>00450 }
-<a name="l00451"></a>00451
-<a name="l00453"></a>00453
-<a name="l00455"></a><a class="code" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">00455</a> internal::allocate_additional_child_of_proxy allocate_additional_child_of( <a class="code" href="a00174.html">task</a>& t ) {
-<a name="l00456"></a>00456 <span class="keywordflow">return</span> internal::allocate_additional_child_of_proxy(*<span class="keyword">this</span>,t);
-<a name="l00457"></a>00457 }
-<a name="l00458"></a>00458
-<a name="l00460"></a>00460
-<a name="l00464"></a>00464 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD destroy( <a class="code" href="a00174.html">task</a>& victim );
-<a name="l00465"></a>00465
-<a name="l00466"></a>00466 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00467"></a>00467 <span class="comment">// Recycling of tasks</span>
-<a name="l00468"></a>00468 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00469"></a>00469
-<a name="l00471"></a>00471
-<a name="l00477"></a><a class="code" href="a00174.html#a67a79e18f62b43a623a00cfbd76db4c">00477</a> <span class="keywordtype">void</span> recycle_as_continuation() {
-<a name="l00478"></a>00478 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00479"></a>00479 prefix().state = allocated;
-<a name="l00480"></a>00480 }
-<a name="l00481"></a>00481
-<a name="l00483"></a>00483
-<a name="l00484"></a><a class="code" href="a00174.html#3b290d14109704e2b69dc1ac980a7a76">00484</a> <span class="keywordtype">void</span> recycle_as_safe_continuation() {
-<a name="l00485"></a>00485 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00486"></a>00486 prefix().state = recycle;
-<a name="l00487"></a>00487 }
-<a name="l00488"></a>00488
-<a name="l00490"></a><a class="code" href="a00174.html#db399855177438bbc9cc61d508dae8d2">00490</a> <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00174.html">task</a>& new_parent ) {
-<a name="l00491"></a>00491 internal::task_prefix& p = prefix();
-<a name="l00492"></a>00492 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00493"></a>00493 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
-<a name="l00494"></a>00494 __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
-<a name="l00495"></a>00495 __TBB_ASSERT( new_parent.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
-<a name="l00496"></a>00496 __TBB_ASSERT( new_parent.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
-<a name="l00497"></a>00497 p.state = allocated;
-<a name="l00498"></a>00498 p.parent = &new_parent;
-<a name="l00499"></a>00499 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00500"></a>00500 <span class="preprocessor"></span> p.<a class="code" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
-<a name="l00501"></a>00501 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00502"></a>00502 }
-<a name="l00503"></a>00503
-<a name="l00505"></a>00505
-<a name="l00506"></a><a class="code" href="a00174.html#4f1be9bbcdb487830dbe298b68d85144">00506</a> <span class="keywordtype">void</span> recycle_to_reexecute() {
-<a name="l00507"></a>00507 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00508"></a>00508 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
-<a name="l00509"></a>00509 prefix().state = reexecute;
-<a name="l00510"></a>00510 }
-<a name="l00511"></a>00511
-<a name="l00512"></a>00512 <span class="comment">// All depth-related methods are obsolete, and are retained for the sake </span>
-<a name="l00513"></a>00513 <span class="comment">// of backward source compatibility only</span>
-<a name="l00514"></a>00514 intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
-<a name="l00515"></a>00515 <span class="keywordtype">void</span> set_depth( intptr_t ) {}
-<a name="l00516"></a>00516 <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
-<a name="l00517"></a>00517
-<a name="l00518"></a>00518
-<a name="l00519"></a>00519 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00520"></a>00520 <span class="comment">// Spawning and blocking</span>
-<a name="l00521"></a>00521 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00522"></a>00522
-<a name="l00524"></a><a class="code" href="a00174.html#06a4206a57e8e12a439b14d6d41cfd92">00524</a> <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
-<a name="l00525"></a>00525 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span> internal_set_ref_count(count);
-<a name="l00527"></a>00527 <span class="preprocessor">#else</span>
-<a name="l00528"></a>00528 <span class="preprocessor"></span> prefix().ref_count = count;
-<a name="l00529"></a>00529 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00530"></a>00530 }
-<a name="l00531"></a>00531
-<a name="l00533"></a>00533
-<a name="l00534"></a><a class="code" href="a00174.html#f5fb43c7ad0de5a4b95703cebc39e345">00534</a> <span class="keywordtype">void</span> increment_ref_count() {
-<a name="l00535"></a>00535 __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
-<a name="l00536"></a>00536 }
-<a name="l00537"></a>00537
-<a name="l00539"></a>00539
-<a name="l00540"></a><a class="code" href="a00174.html#ef4680f5c148020c5e7e43ddef44cd5d">00540</a> <span class="keywordtype">int</span> decrement_ref_count() {
-<a name="l00541"></a>00541 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00542"></a>00542 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(internal_decrement_ref_count());
-<a name="l00543"></a>00543 <span class="preprocessor">#else</span>
-<a name="l00544"></a>00544 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
-<a name="l00545"></a>00545 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00546"></a>00546 }
-<a name="l00547"></a>00547
-<a name="l00549"></a>00549
-<a name="l00553"></a><a class="code" href="a00174.html#f7737143d458f1ed1c0d7da3971d9e6b">00553</a> <span class="keywordtype">void</span> spawn( <a class="code" href="a00174.html">task</a>& child ) {
-<a name="l00554"></a>00554 prefix().owner->spawn( child, child.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
-<a name="l00555"></a>00555 }
-<a name="l00556"></a>00556
-<a name="l00558"></a>00558 <span class="keywordtype">void</span> spawn( <a class="code" href="a00176.html">task_list</a>& list );
-<a name="l00559"></a>00559
-<a name="l00561"></a><a class="code" href="a00174.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00561</a> <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00174.html">task</a>& child ) {
-<a name="l00562"></a>00562 prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
-<a name="l00563"></a>00563 }
-<a name="l00564"></a>00564
-<a name="l00566"></a>00566 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00176.html">task_list</a>& list );
-<a name="l00567"></a>00567
-<a name="l00569"></a>00569
-<a name="l00571"></a><a class="code" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">00571</a> <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00174.html">task</a>& root ) {
-<a name="l00572"></a>00572 root.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
-<a name="l00573"></a>00573 }
-<a name="l00574"></a>00574
-<a name="l00576"></a>00576
-<a name="l00578"></a>00578 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00176.html">task_list</a>& root_list );
-<a name="l00579"></a>00579
-<a name="l00581"></a>00581
-<a name="l00582"></a><a class="code" href="a00174.html#53d2615ad9c38859b4c8080936600283">00582</a> <span class="keywordtype">void</span> wait_for_all() {
-<a name="l00583"></a>00583 prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
-<a name="l00584"></a>00584 }
-<a name="l00585"></a>00585
-<a name="l00587"></a>00587 <span class="keyword">static</span> <a class="code" href="a00174.html">task</a>& __TBB_EXPORTED_FUNC <span class="keyword">self</span>();
-<a name="l00588"></a>00588
-<a name="l00590"></a><a class="code" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">00590</a> <a class="code" href="a00174.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
-<a name="l00591"></a>00591
-<a name="l00592"></a>00592 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00594"></a><a class="code" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">00594</a> <span class="preprocessor"> task_group_context* context() {return prefix().context;}</span>
-<a name="l00595"></a>00595 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00596"></a>00596
-<a name="l00598"></a><a class="code" href="a00174.html#f9169402702f56bf519448aaf34450aa">00598</a> <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
-<a name="l00599"></a>00599 <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
-<a name="l00600"></a>00600 }
-<a name="l00601"></a>00601
-<a name="l00602"></a>00602 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00603"></a>00603 <span class="comment">// Debugging</span>
-<a name="l00604"></a>00604 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00605"></a>00605
-<a name="l00607"></a><a class="code" href="a00174.html#0af7b2d7e6e8b4333b2accfce3dfb374">00607</a> <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00174.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
-<a name="l00608"></a>00608
-<a name="l00610"></a><a class="code" href="a00174.html#ad774f55eaec008ae02b236423209ced">00610</a> <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
-<a name="l00611"></a>00611 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00612"></a>00612 <span class="preprocessor"></span> internal::reference_count ref_count = prefix().ref_count;
-<a name="l00613"></a>00613 __TBB_ASSERT( ref_count==<span class="keywordtype">int</span>(ref_count), <span class="stringliteral">"integer overflow error"</span>);
-<a name="l00614"></a>00614 <span class="preprocessor">#endif</span>
-<a name="l00615"></a>00615 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(prefix().ref_count);
-<a name="l00616"></a>00616 }
-<a name="l00617"></a>00617
-<a name="l00619"></a>00619 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
-<a name="l00620"></a>00620
-<a name="l00621"></a>00621 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00622"></a>00622 <span class="comment">// Affinity</span>
-<a name="l00623"></a>00623 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00624"></a>00624
-<a name="l00626"></a>00626
-<a name="l00627"></a><a class="code" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">00627</a> <span class="keyword">typedef</span> internal::affinity_id affinity_id;
-<a name="l00628"></a>00628
-<a name="l00630"></a><a class="code" href="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">00630</a> <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
-<a name="l00631"></a>00631
-<a name="l00633"></a><a class="code" href="a00174.html#3a920a56b0bcf2801518fb45b2c9d2be">00633</a> affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
-<a name="l00634"></a>00634
-<a name="l00636"></a>00636
-<a name="l00640"></a>00640 <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
-<a name="l00641"></a>00641
-<a name="l00642"></a>00642 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00644"></a>00644 <span class="preprocessor"></span>
-<a name="l00645"></a><a class="code" href="a00174.html#0f3fb4aac549ab642022450a4bd13326">00645</a> <span class="preprocessor"> bool cancel_group_execution () { return prefix().context->cancel_group_execution(); }</span>
-<a name="l00646"></a>00646 <span class="preprocessor"></span>
-<a name="l00648"></a><a class="code" href="a00174.html#025f18118c057c4c8db87ff2ce8df975">00648</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="l00649"></a>00649 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00650"></a>00650
-<a name="l00651"></a>00651 <span class="keyword">private</span>:
-<a name="l00652"></a>00652 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00176.html">task_list</a>;
-<a name="l00653"></a>00653 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00654"></a>00654 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00655"></a>00655 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00656"></a>00656 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00657"></a>00657 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00658"></a>00658 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00659"></a>00659 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00660"></a>00660 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00661"></a>00661
-<a name="l00662"></a>00662 <span class="keyword">friend</span> <span class="keyword">class </span>internal::task_group_base;
-<a name="l00663"></a>00663
-<a name="l00665"></a>00665
-<a name="l00666"></a>00666 internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
-<a name="l00667"></a>00667 <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
-<a name="l00668"></a>00668 }
-<a name="l00669"></a>00669 }; <span class="comment">// class task</span>
-<a name="l00670"></a>00670
-<a name="l00672"></a>00672
-<a name="l00673"></a><a class="code" href="a00142.html">00673</a> <span class="keyword">class </span><a class="code" href="a00142.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00174.html">task</a> {
-<a name="l00674"></a>00674 <span class="comment">/*override*/</span> <a class="code" href="a00174.html">task</a>* execute() {
-<a name="l00675"></a>00675 <span class="keywordflow">return</span> NULL;
-<a name="l00676"></a>00676 }
-<a name="l00677"></a>00677 };
-<a name="l00678"></a>00678
-<a name="l00680"></a>00680
-<a name="l00682"></a><a class="code" href="a00176.html">00682</a> <span class="keyword">class </span><a class="code" href="a00176.html">task_list</a>: internal::no_copy {
-<a name="l00683"></a>00683 <span class="keyword">private</span>:
-<a name="l00684"></a>00684 <a class="code" href="a00174.html">task</a>* first;
-<a name="l00685"></a>00685 <a class="code" href="a00174.html">task</a>** next_ptr;
-<a name="l00686"></a>00686 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00174.html">task</a>;
-<a name="l00687"></a>00687 <span class="keyword">public</span>:
-<a name="l00689"></a><a class="code" href="a00176.html#416341c2047eaef50417b41eaf7e9de6">00689</a> <a class="code" href="a00176.html">task_list</a>() : first(NULL), next_ptr(&first) {}
-<a name="l00690"></a>00690
-<a name="l00692"></a><a class="code" href="a00176.html#6d438f1499a02db1e59c24ab6043e5ba">00692</a> ~<a class="code" href="a00176.html">task_list</a>() {}
-<a name="l00693"></a>00693
-<a name="l00695"></a><a class="code" href="a00176.html#f3ac31e092814b90929f81bb30441959">00695</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
-<a name="l00696"></a>00696
-<a name="l00698"></a><a class="code" href="a00176.html#4cd34756bc4763dafb8c84838a0124ff">00698</a> <span class="keywordtype">void</span> push_back( <a class="code" href="a00174.html">task</a>& <a class="code" href="a00174.html">task</a> ) {
-<a name="l00699"></a>00699 task.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
-<a name="l00700"></a>00700 *next_ptr = &task;
-<a name="l00701"></a>00701 next_ptr = &task.<a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00702"></a>00702 }
-<a name="l00703"></a>00703
-<a name="l00705"></a><a class="code" href="a00176.html#5fe85df5ed524418389d34051750347d">00705</a> <a class="code" href="a00174.html">task</a>& pop_front() {
-<a name="l00706"></a>00706 __TBB_ASSERT( !empty(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
-<a name="l00707"></a>00707 <a class="code" href="a00174.html">task</a>* result = first;
-<a name="l00708"></a>00708 first = result-><a class="code" href="a00174.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00709"></a>00709 <span class="keywordflow">if</span>( !first ) next_ptr = &first;
-<a name="l00710"></a>00710 <span class="keywordflow">return</span> *result;
-<a name="l00711"></a>00711 }
-<a name="l00712"></a>00712
-<a name="l00714"></a><a class="code" href="a00176.html#fce446ee13e025969945328f3ff59b95">00714</a> <span class="keywordtype">void</span> clear() {
-<a name="l00715"></a>00715 first=NULL;
-<a name="l00716"></a>00716 next_ptr=&first;
-<a name="l00717"></a>00717 }
-<a name="l00718"></a>00718 };
-<a name="l00719"></a>00719
-<a name="l00720"></a><a class="code" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">00720</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> task::spawn( <a class="code" href="a00176.html">task_list</a>& list ) {
-<a name="l00721"></a>00721 <span class="keywordflow">if</span>( <a class="code" href="a00174.html">task</a>* t = list.<a class="code" href="a00176.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
-<a name="l00722"></a>00722 prefix().owner->spawn( *t, *list.<a class="code" href="a00176.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
-<a name="l00723"></a>00723 list.<a class="code" href="a00176.html#fce446ee13e025969945328f3ff59b95">clear</a>();
-<a name="l00724"></a>00724 }
-<a name="l00725"></a>00725 }
-<a name="l00726"></a>00726
-<a name="l00727"></a><a class="code" href="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">00727</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00176.html">task_list</a>& root_list ) {
-<a name="l00728"></a>00728 <span class="keywordflow">if</span>( <a class="code" href="a00174.html">task</a>* t = root_list.<a class="code" href="a00176.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
-<a name="l00729"></a>00729 t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00176.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
-<a name="l00730"></a>00730 root_list.<a class="code" href="a00176.html#fce446ee13e025969945328f3ff59b95">clear</a>();
-<a name="l00731"></a>00731 }
-<a name="l00732"></a>00732 }
-<a name="l00733"></a>00733
-<a name="l00734"></a>00734 } <span class="comment">// namespace tbb</span>
-<a name="l00735"></a>00735
-<a name="l00736"></a>00736 <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="l00737"></a>00737 <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
-<a name="l00738"></a>00738 }
-<a name="l00739"></a>00739
-<a name="l00740"></a>00740 <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="l00741"></a>00741 tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
-<a name="l00742"></a>00742 }
-<a name="l00743"></a>00743
-<a name="l00744"></a>00744 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00745"></a>00745 <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="l00746"></a>00746 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00747"></a>00747 }
-<a name="l00748"></a>00748
-<a name="l00749"></a>00749 <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="l00750"></a>00750 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00751"></a>00751 }
-<a name="l00752"></a>00752 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00753"></a>00753
-<a name="l00754"></a>00754 <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="l00755"></a>00755 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00756"></a>00756 }
-<a name="l00757"></a>00757
-<a name="l00758"></a>00758 <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="l00759"></a>00759 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00760"></a>00760 }
-<a name="l00761"></a>00761
-<a name="l00762"></a>00762 <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="l00763"></a>00763 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00764"></a>00764 }
-<a name="l00765"></a>00765
-<a name="l00766"></a>00766 <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="l00767"></a>00767 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00768"></a>00768 }
-<a name="l00769"></a>00769
-<a name="l00770"></a>00770 <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="l00771"></a>00771 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00772"></a>00772 }
-<a name="l00773"></a>00773
-<a name="l00774"></a>00774 <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="l00775"></a>00775 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00776"></a>00776 }
-<a name="l00777"></a>00777
-<a name="l00778"></a>00778 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00326.html b/doc/html/a00375.html
similarity index 79%
rename from doc/html/a00326.html
rename to doc/html/a00375.html
index 6d3085f..bde914e 100644
--- a/doc/html/a00326.html
+++ b/doc/html/a00375.html
@@ -67,10 +67,10 @@
<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="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 }
@@ -80,39 +80,39 @@
<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_EXCEPTIONS || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00068"></a>00068 start_for& a = *<span class="keyword">new</span>(<a class="code" href="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_for(range,body,const_cast<Partitioner&>(partitioner));
+<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="a00199.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_EXCEPTIONS && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00075"></a>00075 <a class="code" href="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
+<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="a00199.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_EXCEPTIONS</span>
+<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="a00174.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
+<a name="l00082"></a>00082 <a class="code" href="a00199.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_EXCEPTIONS */</span>
+<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(*<span class="keyword">this</span>);
+<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,*<span class="keyword">this</span>,b);
+<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 }
@@ -124,47 +124,47 @@
<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="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">00123</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
+<a name="l00123"></a><a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">00123</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.html#g13cac5dd55c7533bccea43a51c33d0e5">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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="a00168.html">simple_partitioner</a>& partitioner ) {
+<a name="l00130"></a><a class="code" href="a00274.html#g13cac5dd55c7533bccea43a51c33d0e5">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00193.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="a00241.html#ga7ac75d532389b55b9247f3fdb0b00d1">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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="a00125.html">auto_partitioner</a>& partitioner ) {
+<a name="l00137"></a><a class="code" href="a00274.html#ga7ac75d532389b55b9247f3fdb0b00d1">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00146.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="a00241.html#g9cd1b210ceb1c040f30e390b4a21bde8">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00120.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00144"></a><a class="code" href="a00274.html#g9cd1b210ceb1c040f30e390b4a21bde8">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00141.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_EXCEPTIONS</span>
+<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="a00241.html#g2d317a5e0078cd193125439fed60dfdc">00152</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00241.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="a00168.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
+<a name="l00152"></a><a class="code" href="a00274.html#g2d317a5e0078cd193125439fed60dfdc">00152</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00274.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="a00193.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="a00241.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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="a00125.html">auto_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_context< [...]
+<a name="l00159"></a><a class="code" href="a00274.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00146.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.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="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="a00241.html#g04b4696b67370c01353ff5974c8f1196">00166</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00120.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00175.html">task_group_context</a>& context ) {
+<a name="l00166"></a><a class="code" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">00166</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.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_EXCEPTIONS */</span>
+<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 {
@@ -177,8 +177,8 @@
<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="a00127.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="a00127.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
+<a name="l00184"></a>00184 <span class="keywordtype">void</span> operator()( <a class="code" href="a00148.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="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00148.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 };
@@ -188,44 +188,45 @@
<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="a00240.html#15c764c70c8a32e7a4b8c291d0cc8dde">00197</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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="a00175.html">tbb::task_group_context</a> context;
-<a name="l00199"></a>00199 <a class="code" href="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, step, f, context);
+<a name="l00197"></a><a class="code" href="a00273.html#15c764c70c8a32e7a4b8c291d0cc8dde">00197</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00201.html">tbb::task_group_context</a> context;
+<a name="l00199"></a>00199 <a class="code" href="a00274.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="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00175.html">tbb::task_group_context</a> &context) {
+<a name="l00202"></a>00202 <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.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 Index end = (last - first) / step;
-<a name="l00207"></a>00207 <span class="keywordflow">if</span> (first + end * step < last) end++;
-<a name="l00208"></a>00208 <a class="code" href="a00127.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="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00125.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="a00240.html#490399525b1e690ec31d6db964c6b272">00215</a> <span class="keywordtype">void</span> <a class="code" href="a00241.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="a00175.html">tbb::task_group_context</a> context;
-<a name="l00217"></a>00217 <a class="code" href="a00241.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="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00175.html">tbb::task_group_context</a> &context) {
-<a name="l00221"></a>00221 <a class="code" href="a00241.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="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
-<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="l00206"></a>00206 <span class="comment">// Above "else" is necessary to prevent "potential divide by zero" warning</span>
+<a name="l00207"></a>00207 Index end = (last - first) / step;
+<a name="l00208"></a>00208 <span class="keywordflow">if</span> (first + end * step < last) end++;
+<a name="l00209"></a>00209 <a class="code" href="a00148.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
+<a name="l00210"></a>00210 internal::parallel_for_body<Function, Index> body(f, first, step);
+<a name="l00211"></a>00211 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00146.html">tbb::auto_partitioner</a>(), context);
+<a name="l00212"></a>00212 }
+<a name="l00213"></a>00213 }
+<a name="l00215"></a>00215 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
+<a name="l00216"></a><a class="code" href="a00273.html#490399525b1e690ec31d6db964c6b272">00216</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
+<a name="l00217"></a>00217 <a class="code" href="a00201.html">tbb::task_group_context</a> context;
+<a name="l00218"></a>00218 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
+<a name="l00219"></a>00219 }
+<a name="l00220"></a>00220 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
+<a name="l00221"></a>00221 <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">tbb::task_group_context</a> &context) {
+<a name="l00222"></a>00222 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
+<a name="l00223"></a>00223 }
+<a name="l00224"></a>00224
+<a name="l00226"></a>00226
+<a name="l00227"></a>00227 } <span class="comment">// namespace strict_ppl</span>
+<a name="l00228"></a>00228
+<a name="l00229"></a>00229 <span class="keyword">using</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
+<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 </span><span class="comment">/* __TBB_parallel_for_H */</span>
+<a name="l00234"></a>00234
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00376.html b/doc/html/a00376.html
deleted file mode 100644
index bd12f04..0000000
--- a/doc/html/a00376.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task_group.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>task_group.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_group_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_group_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="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 {
-<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="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
-<a name="l00049"></a>00049 <span class="comment">// No assignment operator</span>
-<a name="l00050"></a>00050 <span class="keyword">const</span> task_handle& operator = ( <span class="keyword">const</span> task_handle& );
-<a name="l00051"></a>00051 <span class="keyword">public</span>:
-<a name="l00052"></a>00052 task_handle( <span class="keyword">const</span> F& f ) : my_func(f), my_state(0) {}
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{ my_func(); }
-<a name="l00055"></a>00055 };
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="keyword">enum</span> task_group_status {
-<a name="l00058"></a>00058 not_complete,
-<a name="l00059"></a>00059 complete,
-<a name="l00060"></a>00060 canceled
-<a name="l00061"></a>00061 };
-<a name="l00062"></a>00062
-<a name="l00063"></a>00063 <span class="keyword">namespace </span>internal {
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="comment">// Suppress gratuitous warnings from icc 11.0 when lambda expressions are used in instances of function_task.</span>
-<a name="l00066"></a>00066 <span class="comment">//#pragma warning(disable: 588)</span>
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00069"></a>00069 <span class="keyword">class </span>function_task : <span class="keyword">public</span> task {
-<a name="l00070"></a>00070 F my_func;
-<a name="l00071"></a>00071 <span class="comment">/*override*/</span> <a class="code" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00072"></a>00072 my_func();
-<a name="l00073"></a>00073 <span class="keywordflow">return</span> NULL;
-<a name="l00074"></a>00074 }
-<a name="l00075"></a>00075 <span class="keyword">public</span>:
-<a name="l00076"></a>00076 function_task( <span class="keyword">const</span> F& f ) : my_func(f) {}
-<a name="l00077"></a>00077 };
-<a name="l00078"></a>00078
-<a name="l00079"></a>00079 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00080"></a>00080 <span class="keyword">class </span>task_handle_task : <span class="keyword">public</span> task {
-<a name="l00081"></a>00081 task_handle<F>& my_handle;
-<a name="l00082"></a>00082 <span class="comment">/*override*/</span> <a class="code" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00083"></a>00083 my_handle();
-<a name="l00084"></a>00084 <span class="keywordflow">return</span> NULL;
-<a name="l00085"></a>00085 }
-<a name="l00086"></a>00086 <span class="keyword">public</span>:
-<a name="l00087"></a>00087 task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }
-<a name="l00088"></a>00088 };
-<a name="l00089"></a>00089
-<a name="l00090"></a>00090 <span class="keyword">class </span>task_group_base : internal::no_copy {
-<a name="l00091"></a>00091 <span class="keyword">protected</span>:
-<a name="l00092"></a>00092 empty_task* my_root;
-<a name="l00093"></a>00093 task_group_context my_context;
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 task& owner () { <span class="keywordflow">return</span> *my_root; }
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00098"></a>00098 task_group_status internal_run_and_wait( F& f ) {
-<a name="l00099"></a>00099 <span class="keywordflow">try</span> {
-<a name="l00100"></a>00100 <span class="keywordflow">if</span> ( !my_context.is_group_execution_cancelled() )
-<a name="l00101"></a>00101 f();
-<a name="l00102"></a>00102 } <span class="keywordflow">catch</span> ( ... ) {
-<a name="l00103"></a>00103 my_context.register_pending_exception();
-<a name="l00104"></a>00104 }
-<a name="l00105"></a>00105 <span class="keywordflow">return</span> wait();
-<a name="l00106"></a>00106 }
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> Task>
-<a name="l00109"></a>00109 <span class="keywordtype">void</span> internal_run( F& f ) {
-<a name="l00110"></a>00110 owner().spawn( *<span class="keyword">new</span>( owner().allocate_additional_child_of(*my_root) ) Task(f) );
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="keyword">public</span>:
-<a name="l00114"></a>00114 task_group_base( uintptr_t traits = 0 )
-<a name="l00115"></a>00115 : my_context(task_group_context::bound, task_group_context::default_traits | traits)
-<a name="l00116"></a>00116 {
-<a name="l00117"></a>00117 my_root = <span class="keyword">new</span>( <a class="code" href="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(my_context) ) empty_task;
-<a name="l00118"></a>00118 my_root->set_ref_count(1);
-<a name="l00119"></a>00119 }
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00122"></a>00122 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00123"></a>00123 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00124"></a>00124 }
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 task_group_status wait() {
-<a name="l00127"></a>00127 <span class="keywordflow">try</span> {
-<a name="l00128"></a>00128 owner().prefix().owner->wait_for_all( *my_root, NULL );
-<a name="l00129"></a>00129 } <span class="keywordflow">catch</span> ( ... ) {
-<a name="l00130"></a>00130 my_context.reset();
-<a name="l00131"></a>00131 <span class="keywordflow">throw</span>;
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 <span class="keywordflow">if</span> ( my_context.is_group_execution_cancelled() ) {
-<a name="l00134"></a>00134 my_context.reset();
-<a name="l00135"></a>00135 <span class="keywordflow">return</span> canceled;
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137 <span class="keywordflow">return</span> complete;
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="keywordtype">bool</span> is_canceling() {
-<a name="l00141"></a>00141 <span class="keywordflow">return</span> my_context.is_group_execution_cancelled();
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="keywordtype">void</span> cancel() {
-<a name="l00145"></a>00145 my_context.cancel_group_execution();
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147 }; <span class="comment">// class task_group_base</span>
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 } <span class="comment">// namespace internal</span>
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="keyword">class </span>task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00152"></a>00152 <span class="keyword">public</span>:
-<a name="l00153"></a>00153 task_group () : task_group_base( task_group_context::concurrent_wait ) {}
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 ~task_group() <span class="keyword">try</span> {
-<a name="l00156"></a>00156 __TBB_ASSERT( my_root->ref_count() != 0, NULL );
-<a name="l00157"></a>00157 <span class="keywordflow">if</span>( my_root->ref_count() > 1 )
-<a name="l00158"></a>00158 my_root->wait_for_all();
-<a name="l00159"></a>00159 owner().destroy(*my_root);
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161 <span class="keywordflow">catch</span> (...) {
-<a name="l00162"></a>00162 owner().destroy(*my_root);
-<a name="l00163"></a>00163 <span class="keywordflow">throw</span>;
-<a name="l00164"></a>00164 }
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00168"></a>00168 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00169"></a>00169 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00170"></a>00170 }
-<a name="l00171"></a>00171 <span class="preprocessor">#else</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span> <span class="keyword">using</span> task_group_base::run;
-<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="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00176"></a>00176 <span class="keywordtype">void</span> run( <span class="keyword">const</span> F& f ) {
-<a name="l00177"></a>00177 internal_run< const F, internal::function_task<F> >( f );
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00181"></a>00181 task_group_status run_and_wait( <span class="keyword">const</span> F& f ) {
-<a name="l00182"></a>00182 <span class="keywordflow">return</span> internal_run_and_wait<const F>( f );
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00186"></a>00186 task_group_status run_and_wait( task_handle<F>& h ) {
-<a name="l00187"></a>00187 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189 }; <span class="comment">// class task_group</span>
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <span class="keyword">class </span>structured_task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00192"></a>00192 <span class="keyword">public</span>:
-<a name="l00193"></a>00193 ~structured_task_group() {
-<a name="l00194"></a>00194 <span class="keywordflow">if</span>( my_root->ref_count() > 1 ) {
-<a name="l00195"></a>00195 <span class="keywordtype">bool</span> stack_unwinding_in_progress = std::uncaught_exception();
-<a name="l00196"></a>00196 <span class="comment">// Always attempt to do proper cleanup to avoid inevitable memory corruption </span>
-<a name="l00197"></a>00197 <span class="comment">// in case of missing wait (for the sake of better testability & debuggability)</span>
-<a name="l00198"></a>00198 <span class="keywordflow">if</span> ( !is_canceling() )
-<a name="l00199"></a>00199 cancel();
-<a name="l00200"></a>00200 my_root->wait_for_all();
-<a name="l00201"></a>00201 owner().destroy(*my_root);
-<a name="l00202"></a>00202 <span class="keywordflow">if</span> ( !stack_unwinding_in_progress )
-<a name="l00203"></a>00203 internal::throw_exception( internal::eid_missing_wait );
-<a name="l00204"></a>00204 }
-<a name="l00205"></a>00205 <span class="keywordflow">else</span> {
-<a name="l00206"></a>00206 <span class="keywordflow">if</span>( my_root->ref_count() == 1 )
-<a name="l00207"></a>00207 my_root->set_ref_count(0);
-<a name="l00208"></a>00208 owner().destroy(*my_root);
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210 }
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00213"></a>00213 task_group_status run_and_wait ( task_handle<F>& h ) {
-<a name="l00214"></a>00214 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00215"></a>00215 }
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 task_group_status wait() {
-<a name="l00218"></a>00218 task_group_status res = task_group_base::wait();
-<a name="l00219"></a>00219 my_root->set_ref_count(1);
-<a name="l00220"></a>00220 <span class="keywordflow">return</span> res;
-<a name="l00221"></a>00221 }
-<a name="l00222"></a>00222 }; <span class="comment">// class structured_task_group</span>
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="keyword">inline</span>
-<a name="l00225"></a>00225 <span class="keywordtype">bool</span> is_current_task_group_canceling() {
-<a name="l00226"></a>00226 <span class="keywordflow">return</span> <a class="code" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00174.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>();
-<a name="l00227"></a>00227 }
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">template</span><<span class="keyword">class</span> F>
-<a name="l00230"></a>00230 task_handle<F> make_task( <span class="keyword">const</span> F& f ) {
-<a name="l00231"></a>00231 <span class="keywordflow">return</span> task_handle<F>( f );
-<a name="l00232"></a>00232 }
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 } <span class="comment">// namespace tbb</span>
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_group_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00330.html b/doc/html/a00379.html
similarity index 91%
rename from doc/html/a00330.html
rename to doc/html/a00379.html
index ae20a8b..9d7e93e 100644
--- a/doc/html/a00330.html
+++ b/doc/html/a00379.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>::value_type& value )<span class="keyword"> const </span>{
<a name="l00039"></a>00039 my_func(value);
<a name="l00040"></a>00040 }
<a name="l00041"></a>00041 };
@@ -64,17 +64,17 @@
<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="a00241.html#gcd40c32f319747e61a8f73fcfc452001">00051</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00175.html">task_group_context</a> &context) {
+<a name="l00051"></a><a class="code" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">00051</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.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="a00241.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
+<a name="l00054"></a>00054 <a class="code" href="a00274.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="a00241.html#gc2d710ca573f0a9bd94379cba3772def">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
+<a name="l00059"></a><a class="code" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
+<a name="l00062"></a>00062 <a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
<a name="l00063"></a>00063 }
<a name="l00064"></a>00064
<a name="l00066"></a>00066
@@ -83,7 +83,7 @@
<a name="l00069"></a>00069 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_for_each_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00332.html b/doc/html/a00381.html
similarity index 95%
rename from doc/html/a00332.html
rename to doc/html/a00381.html
index af56fd0..04f0a6b 100644
--- a/doc/html/a00332.html
+++ b/doc/html/a00381.html
@@ -149,7 +149,7 @@
<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="a00175.html">tbb::task_group_context</a>& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+<a name="l00132"></a>00132 parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00201.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);
@@ -163,7 +163,7 @@
<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="a00241.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00175.html">tbb::task_group_context</a>& context) {
+<a name="l00151"></a><a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00201.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
@@ -174,7 +174,7 @@
<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="a00241.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="a00175.html">tbb::task_group_context</a>& context) {
+<a name="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00201.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
@@ -186,8 +186,8 @@
<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="a00241.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00201.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;
@@ -201,8 +201,8 @@
<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="a00241.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00201.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;
@@ -215,8 +215,8 @@
<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="a00241.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00201.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;
@@ -229,9 +229,9 @@
<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="a00241.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="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00219"></a>00219 <a class="code" href="a00201.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;
@@ -245,9 +245,9 @@
<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="a00241.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="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00235"></a>00235 <a class="code" href="a00201.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;
@@ -262,9 +262,9 @@
<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="a00241.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="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00252"></a>00252 <a class="code" href="a00201.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;
@@ -279,9 +279,9 @@
<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="a00241.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="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00175.html">tbb::task_group_context</a>& context)
+<a name="l00269"></a>00269 <a class="code" href="a00201.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;
@@ -295,37 +295,37 @@
<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="a00241.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
+<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.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="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.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="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.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="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.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="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00241.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="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00274.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;
@@ -334,7 +334,7 @@
<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="a00241.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="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00274.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;
@@ -343,7 +343,7 @@
<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="a00241.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="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00274.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;
@@ -352,7 +352,7 @@
<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="a00241.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="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00274.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;
@@ -365,7 +365,7 @@
<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00387.html b/doc/html/a00387.html
index 2217bed..224031e 100644
--- a/doc/html/a00387.html
+++ b/doc/html/a00387.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_allocator.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>tbb_allocator.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-2010 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,160 +39,319 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_allocator_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_reduce_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_reduce_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <cstring></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC deallocate_via_handler_v3( <span class="keywordtype">void</span> *p );
+<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 <new></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 <span class="keyword">namespace </span>internal {
+<a name="l00033"></a>00033
+<a name="l00035"></a>00035 <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="l00036"></a>00036
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042 <span class="keywordtype">bool</span> __TBB_EXPORTED_FUNC is_malloc_used_v3();
-<a name="l00043"></a>00043 }
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</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: 4100)</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="l00053"></a>00053
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00059"></a><a class="code" href="a00178.html">00059</a> <span class="keyword">class </span><a class="code" href="a00178.html">tbb_allocator</a> {
-<a name="l00060"></a>00060 <span class="keyword">public</span>:
-<a name="l00061"></a>00061 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00064"></a>00064 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00065"></a>00065 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00066"></a>00066 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00068"></a>00068 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> <a class="code" href="a00178.html">tbb_allocator<U></a> other;
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071
-<a name="l00073"></a><a class="code" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">00073</a> <span class="keyword">enum</span> <a class="code" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
-<a name="l00074"></a>00074 scalable,
-<a name="l00075"></a>00075 standard
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <a class="code" href="a00178.html">tbb_allocator</a>() throw() {}
-<a name="l00079"></a>00079 tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00083"></a>00083 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00084"></a>00084
-<a name="l00086"></a><a class="code" href="a00178.html#f6cb487b1bdce0b581f265a77dca6d53">00086</a> pointer <a class="code" href="a00178.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="l00087"></a>00087 <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
-<a name="l00088"></a>00088 }
+<a name="l00038"></a>00038 <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="l00039"></a>00039
+<a name="l00040"></a>00040 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_reduce_store_body( T*& dst, T* src ) {
+<a name="l00041"></a>00041 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span> itt_store_pointer_with_release_v3(&dst,src);
+<a name="l00043"></a>00043 <span class="preprocessor">#else</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span> __TBB_store_with_release(dst,src);
+<a name="l00045"></a>00045 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
+<a name="l00046"></a>00046 }
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">inline</span> T* parallel_reduce_load_body( T*& src ) {
+<a name="l00049"></a>00049 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="keywordflow">return</span> static_cast<T*>(itt_load_pointer_with_acquire_v3(&src));
+<a name="l00051"></a>00051 <span class="preprocessor">#else</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_load_with_acquire(src);
+<a name="l00053"></a>00053 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
+<a name="l00054"></a>00054 }
+<a name="l00055"></a>00055
+<a name="l00057"></a>00057
+<a name="l00058"></a>00058 <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
+<a name="l00059"></a>00059
+<a name="l00061"></a>00061
+<a name="l00062"></a>00062 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00063"></a>00063 <span class="keyword">class </span>finish_reduce: <span class="keyword">public</span> task {
+<a name="l00065"></a>00065 Body* my_body;
+<a name="l00066"></a>00066 <span class="keywordtype">bool</span> has_right_zombie;
+<a name="l00067"></a>00067 <span class="keyword">const</span> reduction_context my_context;
+<a name="l00068"></a>00068 aligned_space<Body,1> zombie_space;
+<a name="l00069"></a>00069 finish_reduce( <span class="keywordtype">char</span> context_ ) :
+<a name="l00070"></a>00070 my_body(NULL),
+<a name="l00071"></a>00071 has_right_zombie(false),
+<a name="l00072"></a>00072 my_context(context_)
+<a name="l00073"></a>00073 {
+<a name="l00074"></a>00074 }
+<a name="l00075"></a>00075 task* execute() {
+<a name="l00076"></a>00076 <span class="keywordflow">if</span>( has_right_zombie ) {
+<a name="l00077"></a>00077 <span class="comment">// Right child was stolen.</span>
+<a name="l00078"></a>00078 Body* s = zombie_space.begin();
+<a name="l00079"></a>00079 my_body->join( *s );
+<a name="l00080"></a>00080 s->~Body();
+<a name="l00081"></a>00081 }
+<a name="l00082"></a>00082 <span class="keywordflow">if</span>( my_context==1 )
+<a name="l00083"></a>00083 parallel_reduce_store_body( static_cast<finish_reduce*>(parent())->my_body, my_body );
+<a name="l00084"></a>00084 <span class="keywordflow">return</span> NULL;
+<a name="l00085"></a>00085 }
+<a name="l00086"></a>00086 <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="l00087"></a>00087 <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
+<a name="l00088"></a>00088 };
<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00091</a> <span class="keywordtype">void</span> <a class="code" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
-<a name="l00092"></a>00092 internal::deallocate_via_handler_v3(p);
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">00096</a> size_type <a class="code" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
-<a name="l00097"></a>00097 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00098"></a>00098 <span class="keywordflow">return</span> (max > 0 ? max : 1);
-<a name="l00099"></a>00099 }
-<a name="l00100"></a>00100
-<a name="l00102"></a><a class="code" href="a00178.html#ab228ab9e324ed041c2226e1d717df5f">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00178.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="l00103"></a>00103
-<a name="l00105"></a><a class="code" href="a00178.html#ef133522bf55f05a605bee0763208281">00105</a> <span class="keywordtype">void</span> <a class="code" href="a00178.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
-<a name="l00106"></a>00106
-<a name="l00108"></a><a class="code" href="a00178.html#78701e7454ef8e1a25b5acd364367080">00108</a> <span class="keyword">static</span> <a class="code" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00178.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111 };
+<a name="l00091"></a>00091
+<a name="l00092"></a>00092 <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="l00093"></a>00093 <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
+<a name="l00094"></a>00094 <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
+<a name="l00095"></a>00095 Body* my_body;
+<a name="l00096"></a>00096 Range my_range;
+<a name="l00097"></a>00097 <span class="keyword">typename</span> Partitioner::partition_type my_partition;
+<a name="l00098"></a>00098 reduction_context my_context;
+<a name="l00099"></a>00099 <span class="comment">/*override*/</span> task* execute();
+<a name="l00100"></a>00100 <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
+<a name="l00101"></a>00101 <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
+<a name="l00102"></a>00102
+<a name="l00104"></a>00104 start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
+<a name="l00105"></a>00105 my_body(body),
+<a name="l00106"></a>00106 my_range(range),
+<a name="l00107"></a>00107 my_partition(partitioner),
+<a name="l00108"></a>00108 my_context(0)
+<a name="l00109"></a>00109 {
+<a name="l00110"></a>00110 }
<a name="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span>
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">template</span><>
-<a name="l00120"></a><a class="code" href="a00179.html">00120</a> <span class="keyword">class </span><a class="code" href="a00178.html">tbb_allocator</a><void> {
-<a name="l00121"></a>00121 <span class="keyword">public</span>:
-<a name="l00122"></a>00122 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00125"></a>00125 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00126"></a>00126 <span class="keyword">typedef</span> <a class="code" href="a00178.html">tbb_allocator<U></a> other;
-<a name="l00127"></a>00127 };
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00131"></a>00131 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00178.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00178.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00134"></a>00134 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> tbb_allocator<T>&, <span class="keyword">const</span> tbb_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00135"></a>00135
-<a name="l00137"></a>00137
-<a name="l00142"></a>00142 <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="l00143"></a><a class="code" href="a00186.html">00143</a> <span class="keyword">class </span><a class="code" href="a00186.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
-<a name="l00144"></a>00144 {
-<a name="l00145"></a>00145 <span class="keyword">public</span>:
-<a name="l00146"></a>00146 <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
-<a name="l00147"></a>00147 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00148"></a>00148 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00149"></a>00149 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00150"></a>00150 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::reference reference;
-<a name="l00151"></a>00151 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_reference const_reference;
-<a name="l00152"></a>00152 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
-<a name="l00153"></a>00153 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
-<a name="l00154"></a>00154 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00155"></a>00155 <span class="keyword">typedef</span> <a class="code" href="a00186.html">zero_allocator<U, Allocator></a> other;
-<a name="l00156"></a>00156 };
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <a class="code" href="a00186.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
-<a name="l00159"></a>00159 <a class="code" href="a00186.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
-<a name="l00160"></a>00160 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00161"></a>00161 <a class="code" href="a00186.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 pointer allocate(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
-<a name="l00164"></a>00164 pointer ptr = base_allocator_type::allocate( n, hint );
-<a name="l00165"></a>00165 std::memset( ptr, 0, n * <span class="keyword">sizeof</span>(value_type) );
-<a name="l00166"></a>00166 <span class="keywordflow">return</span> ptr;
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168 };
-<a name="l00169"></a>00169
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator>
-<a name="l00173"></a><a class="code" href="a00187.html">00173</a> <span class="keyword">class </span><a class="code" href="a00186.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
-<a name="l00174"></a>00174 <span class="keyword">public</span>:
-<a name="l00175"></a>00175 <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
-<a name="l00176"></a>00176 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00177"></a>00177 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00178"></a>00178 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00179"></a>00179 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00180"></a>00180 <span class="keyword">typedef</span> <a class="code" href="a00186.html">zero_allocator<U, Allocator></a> other;
-<a name="l00181"></a>00181 };
-<a name="l00182"></a>00182 };
+<a name="l00113"></a>00113 start_reduce( start_reduce& parent_, split ) :
+<a name="l00114"></a>00114 my_body(parent_.my_body),
+<a name="l00115"></a>00115 my_range(parent_.my_range,split()),
+<a name="l00116"></a>00116 my_partition(parent_.my_partition,split()),
+<a name="l00117"></a>00117 my_context(2)
+<a name="l00118"></a>00118 {
+<a name="l00119"></a>00119 my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00120"></a>00120 parent_.my_context = 1;
+<a name="l00121"></a>00121 }
+<a name="l00123"></a>00123 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
+<a name="l00124"></a>00124 my_partition.note_affinity( <span class="keywordtype">id</span> );
+<a name="l00125"></a>00125 }
+<a name="l00126"></a>00126
+<a name="l00127"></a>00127 <span class="keyword">public</span>:
+<a name="l00128"></a>00128 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
+<a name="l00129"></a>00129 <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00130"></a>00130 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+<a name="l00131"></a>00131 <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
+<a name="l00132"></a>00132 <span class="preprocessor">#else</span>
+<a name="l00133"></a>00133 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
+<a name="l00134"></a>00134 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
+<a name="l00135"></a>00135 task_group_context context;
+<a name="l00136"></a>00136 <a class="code" href="a00199.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 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
+<a name="l00138"></a>00138 }
+<a name="l00139"></a>00139 }
+<a name="l00140"></a>00140 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00141"></a>00141 <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="l00142"></a>00142 <span class="keywordflow">if</span>( !range.empty() )
+<a name="l00143"></a>00143 <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+<a name="l00144"></a>00144 }
+<a name="l00145"></a>00145 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00146"></a>00146 };
+<a name="l00147"></a>00147
+<a name="l00148"></a>00148 <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="l00149"></a>00149 task* start_reduce<Range,Body,Partitioner>::execute() {
+<a name="l00150"></a>00150 <span class="keywordflow">if</span>( my_context==2 ) {
+<a name="l00151"></a>00151 finish_type* p = static_cast<finish_type*>(parent() );
+<a name="l00152"></a>00152 <span class="keywordflow">if</span>( !parallel_reduce_load_body(p->my_body) ) {
+<a name="l00153"></a>00153 my_body = <span class="keyword">new</span>( p->zombie_space.begin() ) Body(*my_body,split());
+<a name="l00154"></a>00154 p->has_right_zombie = <span class="keyword">true</span>;
+<a name="l00155"></a>00155 }
+<a name="l00156"></a>00156 }
+<a name="l00157"></a>00157 <span class="keywordflow">if</span>( !my_range.is_divisible() || my_partition.should_execute_range(*<span class="keyword">this</span>) ) {
+<a name="l00158"></a>00158 (*my_body)( my_range );
+<a name="l00159"></a>00159 <span class="keywordflow">if</span>( my_context==1 )
+<a name="l00160"></a>00160 parallel_reduce_store_body(static_cast<finish_type*>(parent())->my_body, my_body );
+<a name="l00161"></a>00161 <span class="keywordflow">return</span> my_partition.continue_after_execute_range();
+<a name="l00162"></a>00162 } <span class="keywordflow">else</span> {
+<a name="l00163"></a>00163 finish_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_type(my_context);
+<a name="l00164"></a>00164 recycle_as_child_of(c);
+<a name="l00165"></a>00165 c.set_ref_count(2);
+<a name="l00166"></a>00166 <span class="keywordtype">bool</span> delay = my_partition.decide_whether_to_delay();
+<a name="l00167"></a>00167 start_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_reduce(*<span class="keyword">this</span>,split());
+<a name="l00168"></a>00168 my_partition.spawn_or_delay(delay,b);
+<a name="l00169"></a>00169 <span class="keywordflow">return</span> <span class="keyword">this</span>;
+<a name="l00170"></a>00170 }
+<a name="l00171"></a>00171 }
+<a name="l00172"></a>00172
+<a name="l00174"></a>00174
+<a name="l00178"></a>00178 <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="l00179"></a>00179 <span class="keyword">class </span>lambda_reduce_body {
+<a name="l00180"></a>00180
+<a name="l00181"></a>00181 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
+<a name="l00182"></a>00182 <span class="comment">// (might require some performance measurements)</span>
<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <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="l00185"></a>00185 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator<T2,B2></a> &b) {
-<a name="l00186"></a>00186 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188 <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="l00189"></a>00189 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> zero_allocator<T1,B1> &a, <span class="keyword">const</span> zero_allocator<T2,B2> &b) {
-<a name="l00190"></a>00190 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) != <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 } <span class="comment">// namespace tbb </span>
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_allocator_H */</span>
+<a name="l00184"></a>00184 <span class="keyword">const</span> Value& identity_element;
+<a name="l00185"></a>00185 <span class="keyword">const</span> RealBody& my_real_body;
+<a name="l00186"></a>00186 <span class="keyword">const</span> Reduction& my_reduction;
+<a name="l00187"></a>00187 Value my_value;
+<a name="l00188"></a>00188 lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
+<a name="l00189"></a>00189 <span class="keyword">public</span>:
+<a name="l00190"></a>00190 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="l00191"></a>00191 : identity_element(identity)
+<a name="l00192"></a>00192 , my_real_body(body)
+<a name="l00193"></a>00193 , my_reduction(reduction)
+<a name="l00194"></a>00194 , my_value(identity)
+<a name="l00195"></a>00195 { }
+<a name="l00196"></a>00196 lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
+<a name="l00197"></a>00197 : identity_element(other.identity_element)
+<a name="l00198"></a>00198 , my_real_body(other.my_real_body)
+<a name="l00199"></a>00199 , my_reduction(other.my_reduction)
+<a name="l00200"></a>00200 , my_value(other.my_value)
+<a name="l00201"></a>00201 { }
+<a name="l00202"></a>00202 lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00198.html">tbb::split</a> )
+<a name="l00203"></a>00203 : identity_element(other.identity_element)
+<a name="l00204"></a>00204 , my_real_body(other.my_real_body)
+<a name="l00205"></a>00205 , my_reduction(other.my_reduction)
+<a name="l00206"></a>00206 , my_value(other.identity_element)
+<a name="l00207"></a>00207 { }
+<a name="l00208"></a>00208 <span class="keywordtype">void</span> operator()(Range& range) {
+<a name="l00209"></a>00209 my_value = my_real_body(range, const_cast<const Value&>(my_value));
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211 <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
+<a name="l00212"></a>00212 my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
+<a name="l00213"></a>00213 }
+<a name="l00214"></a>00214 Value result()<span class="keyword"> const </span>{
+<a name="l00215"></a>00215 <span class="keywordflow">return</span> my_value;
+<a name="l00216"></a>00216 }
+<a name="l00217"></a>00217 };
+<a name="l00218"></a>00218
+<a name="l00219"></a>00219 } <span class="comment">// namespace internal</span>
+<a name="l00221"></a>00221 <span class="comment"></span>
+<a name="l00222"></a>00222 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
+<a name="l00223"></a>00223
+<a name="l00242"></a>00242
+<a name="l00244"></a>00244
+<a name="l00245"></a>00245 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00246"></a><a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">00246</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00247"></a>00247 internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249
+<a name="l00251"></a>00251
+<a name="l00252"></a>00252 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00253"></a><a class="code" href="a00274.html#gec1b7c03f9da909bef5db12e3d41bed3">00253</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
+<a name="l00254"></a>00254 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
+<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="a00274.html#g18a19157e6245992fc00ca0adeb7dd37">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner ) {
+<a name="l00261"></a>00261 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
+<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="a00274.html#gc61e73fcc36c92d79a217fc355ff4a6b">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00268"></a>00268 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
+<a name="l00269"></a>00269 }
+<a name="l00270"></a>00270
+<a name="l00271"></a>00271 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00273"></a>00273 <span class="preprocessor"></span>
+<a name="l00274"></a>00274 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00275"></a><a class="code" href="a00274.html#g45cb00c42a18e334bbde8b7535afe460">00275</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_cont [...]
+<a name="l00276"></a>00276 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
+<a name="l00277"></a>00277 }
+<a name="l00278"></a>00278
+<a name="l00280"></a>00280
+<a name="l00281"></a>00281 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00282"></a><a class="code" href="a00274.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00282</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00283"></a>00283 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
+<a name="l00284"></a>00284 }
+<a name="l00285"></a>00285
+<a name="l00287"></a>00287
+<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00289"></a><a class="code" href="a00274.html#gd9ac3a3811060314695f33b703c6e11b">00289</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00290"></a>00290 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
+<a name="l00291"></a>00291 }
+<a name="l00292"></a>00292 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00293"></a>00293
+<a name="l00297"></a>00297
+<a name="l00298"></a>00298
+<a name="l00299"></a>00299 <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="l00300"></a><a class="code" href="a00274.html#gc9412e09fb01fcad8c018ea9cffb28ef">00300</a> Value <a class="code" href="a00274.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="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> __TBB_DEFAULT_PARTITIONER>
+<a name="l00303"></a>00303 ::run(range, body, __TBB_DEFAULT_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="a00274.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00310</a> Value <a class="code" href="a00274.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 <span class="keyword">const</span> <a class="code" href="a00193.html">simple_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>,<span class="keyword">const</span> <a class="code" href="a00193.html">simple_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="l00319"></a>00319
+<a name="l00320"></a>00320 <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="l00321"></a><a class="code" href="a00274.html#gb175401f0729e40dd2c5860a17c14385">00321</a> Value <a class="code" href="a00274.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="l00322"></a>00322 <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner ) {
+<a name="l00323"></a>00323 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00324"></a>00324 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>>
+<a name="l00325"></a>00325 ::run( range, body, partitioner );
+<a name="l00326"></a>00326 <span class="keywordflow">return</span> body.result();
+<a name="l00327"></a>00327 }
+<a name="l00328"></a>00328
+<a name="l00330"></a>00330
+<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00332"></a><a class="code" href="a00274.html#gb7f1f1828ae2b330ce05b8513a495154">00332</a> Value <a class="code" href="a00274.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="l00333"></a>00333 <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00334"></a>00334 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00335"></a>00335 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00141.html">affinity_partitioner</a>>
+<a name="l00336"></a>00336 ::run( range, body, partitioner );
+<a name="l00337"></a>00337 <span class="keywordflow">return</span> body.result();
+<a name="l00338"></a>00338 }
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00342"></a>00342 <span class="preprocessor"></span>
+<a name="l00343"></a>00343 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00344"></a><a class="code" href="a00274.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00344</a> <span class="preprocessor"></span>Value <a class="code" href="a00274.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 <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" href="a00201.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>,<span class="keyword">const</span> <a class="code" href="a00193.html">simple_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
+<a name="l00353"></a>00353
+<a name="l00354"></a>00354 <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="l00355"></a><a class="code" href="a00274.html#g630c90a399937d9d4ae70ff883186dfd">00355</a> Value <a class="code" href="a00274.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="l00356"></a>00356 <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00357"></a>00357 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00358"></a>00358 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>>
+<a name="l00359"></a>00359 ::run( range, body, partitioner, context );
+<a name="l00360"></a>00360 <span class="keywordflow">return</span> body.result();
+<a name="l00361"></a>00361 }
+<a name="l00362"></a>00362
+<a name="l00364"></a>00364
+<a name="l00365"></a>00365 <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="l00366"></a><a class="code" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">00366</a> Value <a class="code" href="a00274.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="l00367"></a>00367 <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00368"></a>00368 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00369"></a>00369 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00141.html">affinity_partitioner</a>>
+<a name="l00370"></a>00370 ::run( range, body, partitioner, context );
+<a name="l00371"></a>00371 <span class="keywordflow">return</span> body.result();
+<a name="l00372"></a>00372 }
+<a name="l00373"></a>00373 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00374"></a>00374
+<a name="l00375"></a>00375
+<a name="l00376"></a>00376 } <span class="comment">// namespace tbb</span>
+<a name="l00377"></a>00377
+<a name="l00378"></a>00378 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
+<a name="l00379"></a>00379
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00391.html b/doc/html/a00391.html
index 3f7e059..c3e097b 100644
--- a/doc/html/a00391.html
+++ b/doc/html/a00391.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_config.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>tbb_config.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-2010 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,119 +39,300 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_config_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_config_H</span>
+<a name="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="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="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="a00181.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00181.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="a00167.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00167.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="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
-<a name="l00070"></a>00070 <span class="preprocessor">#ifndef __TBB_EXCEPTIONS</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXCEPTIONS 1</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_SCHEDULER_OBSERVER 1</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
+<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="a00199.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="a00142.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="a00198.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="l00078"></a>00078 <span class="preprocessor">#ifndef __TBB_NEW_ITT_NOTIFY</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NEW_ITT_NOTIFY 1</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_NEW_ITT_NOTIFY */</span>
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="comment">/* TODO: The following condition should be extended as soon as new compilers/runtimes </span>
-<a name="l00084"></a>00084 <span class="comment"> with std::exception_ptr support appear. */</span>
-<a name="l00085"></a>00085 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span>
-<a name="l00087"></a>00087
-<a name="l00088"></a>00088 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 0</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 1</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00095"></a>00095 <span class="preprocessor"> #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00096"></a>00096 <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="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span>
-<a name="l00104"></a>00104 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span>
-<a name="l00107"></a>00107 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00110"></a>00110
-<a name="l00113"></a>00113 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==4 && !defined(__INTEL_COMPILER)</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 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>
-<a name="l00123"></a>00123 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 0x1500 && !defined(__INTEL_COMPILER)</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span>
-<a name="l00126"></a>00126 <span class="preprocessor"> #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span>
-<a name="l00131"></a>00131 <span class="preprocessor"> #define __TBB_EXCEPTION_HANDLING_BROKEN 1</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00133"></a>00133 <span class="preprocessor"></span>
-<a name="l00134"></a>00134 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span>
-<a name="l00136"></a>00136 <span class="preprocessor"> #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</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="l00139"></a>00139 <span class="preprocessor">#if __FreeBSD__</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span>
-<a name="l00142"></a>00142 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span>
-<a name="l00146"></a>00146 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="preprocessor">#if __LRB__</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_config_lrb.h"</span>
-<a name="l00151"></a>00151 <span class="preprocessor">#endif</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span>
-<a name="l00153"></a>00153 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
+<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="a00199.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="a00199.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="a00199.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="a00199.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="a00199.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="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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="a00274.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.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="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00146.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-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00393.html b/doc/html/a00393.html
deleted file mode 100644
index 432935e..0000000
--- a/doc/html/a00393.html
+++ /dev/null
@@ -1,300 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_exception.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_exception.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_exception_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_exception_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_EXCEPTIONS && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC)</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#error The current compilation environment does not support exception handling. Please set __TBB_EXCEPTIONS to 0 in tbb_config.h</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include <stdexcept></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#include <string></span> <span class="comment">// required to construct std exception classes</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#endif</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span>
-<a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb {
-<a name="l00036"></a>00036
-<a name="l00038"></a><a class="code" href="a00126.html">00038</a> <span class="keyword">class </span><a class="code" href="a00126.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
-<a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00040"></a>00040 <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="l00043"></a><a class="code" href="a00126.html#af817b8268cabc44ecd9c9ef986f6192">00043</a> <span class="comment">/*override*/</span> <a class="code" href="a00126.html#af817b8268cabc44ecd9c9ef986f6192">~bad_last_alloc</a>() throw() {}
-<a name="l00044"></a>00044 };
-<a name="l00045"></a>00045
-<a name="l00047"></a><a class="code" href="a00146.html">00047</a> <span class="keyword">class </span><a class="code" href="a00146.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00049"></a>00049 <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="l00050"></a>00050 };
-<a name="l00051"></a>00051
-<a name="l00053"></a><a class="code" href="a00148.html">00053</a> <span class="keyword">class </span><a class="code" href="a00148.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
-<a name="l00054"></a>00054 <span class="keyword">public</span>:
-<a name="l00055"></a>00055 <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="l00056"></a>00056 };
-<a name="l00057"></a>00057
-<a name="l00059"></a><a class="code" href="a00147.html">00059</a> <span class="keyword">class </span><a class="code" href="a00147.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
-<a name="l00060"></a>00060 <span class="keyword">public</span>:
-<a name="l00061"></a>00061 <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="l00062"></a>00062 };
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">namespace </span>internal {
-<a name="l00066"></a>00066 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 <span class="keyword">enum</span> exception_id {
-<a name="l00069"></a>00069 eid_bad_alloc = 1,
-<a name="l00070"></a>00070 eid_bad_last_alloc,
-<a name="l00071"></a>00071 eid_nonpositive_step,
-<a name="l00072"></a>00072 eid_out_of_range,
-<a name="l00073"></a>00073 eid_segment_range_error,
-<a name="l00074"></a>00074 eid_index_range_error,
-<a name="l00075"></a>00075 eid_missing_wait,
-<a name="l00076"></a>00076 eid_invalid_multiple_scheduling,
-<a name="l00077"></a>00077 eid_improper_lock,
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081 eid_max
-<a name="l00082"></a>00082 };
-<a name="l00083"></a>00083
-<a name="l00085"></a>00085
-<a name="l00087"></a>00087 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
-<a name="l00088"></a>00088
-<a name="l00090"></a>00090 <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
-<a name="l00091"></a>00091 } <span class="comment">// namespace internal</span>
-<a name="l00092"></a>00092
-<a name="l00093"></a>00093 } <span class="comment">// namespace tbb</span>
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="preprocessor">#if __TBB_EXCEPTIONS</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00097"></a>00097 <span class="preprocessor">#include <exception></span>
-<a name="l00098"></a>00098 <span class="preprocessor">#include <typeinfo></span>
-<a name="l00099"></a>00099 <span class="preprocessor">#include <new></span>
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="keyword">namespace </span>tbb {
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104
-<a name="l00124"></a><a class="code" href="a00180.html">00124</a> <span class="keyword">class </span><a class="code" href="a00180.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
-<a name="l00125"></a>00125 {
-<a name="l00129"></a>00129 <span class="keywordtype">void</span>* operator new ( size_t );
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 <span class="keyword">public</span>:
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keyword">virtual</span> <a class="code" href="a00180.html">tbb_exception</a>* <a class="code" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
-<a name="l00135"></a>00135
-<a name="l00137"></a>00137
-<a name="l00139"></a>00139 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00180.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142
-<a name="l00146"></a>00146 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00180.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00180.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00180.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
-<a name="l00153"></a>00153
-<a name="l00160"></a><a class="code" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">00160</a> <span class="keywordtype">void</span> <a class="code" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
-<a name="l00161"></a>00161 internal::deallocate_via_handler_v3(p);
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163 };
-<a name="l00164"></a>00164
-<a name="l00166"></a>00166
-<a name="l00170"></a><a class="code" href="a00132.html">00170</a> <span class="keyword">class </span><a class="code" href="a00132.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00180.html">tbb_exception</a>
-<a name="l00171"></a>00171 {
-<a name="l00172"></a>00172 <span class="keyword">public</span>:
-<a name="l00173"></a>00173 <a class="code" href="a00132.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00132.html">captured_exception</a>& src )
-<a name="l00174"></a>00174 : <a class="code" href="a00180.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
-<a name="l00175"></a>00175 {
-<a name="l00176"></a>00176 set(src.<a class="code" href="a00132.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00132.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <a class="code" href="a00132.html">captured_exception</a> ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00132.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info )
-<a name="l00180"></a>00180 : my_dynamic(<span class="keyword">false</span>)
-<a name="l00181"></a>00181 {
-<a name="l00182"></a>00182 set(name, info);
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 __TBB_EXPORTED_METHOD ~<a class="code" href="a00132.html">captured_exception</a> () <span class="keywordflow">throw</span>() {
-<a name="l00186"></a>00186 clear();
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 <a class="code" href="a00132.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00132.html">captured_exception</a>& src ) {
-<a name="l00190"></a>00190 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00191"></a>00191 clear();
-<a name="l00192"></a>00192 set(src.<a class="code" href="a00132.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00132.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
-<a name="l00193"></a>00193 }
-<a name="l00194"></a>00194 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 <span class="comment">/*override*/</span>
-<a name="l00198"></a>00198 <a class="code" href="a00132.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00132.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 <span class="comment">/*override*/</span>
-<a name="l00201"></a>00201 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00132.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="comment">/*override*/</span>
-<a name="l00204"></a><a class="code" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">00204</a> <span class="keywordtype">void</span> <a class="code" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { <span class="keywordflow">throw</span> *<span class="keyword">this</span>; }
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="comment">/*override*/</span>
-<a name="l00207"></a>00207 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00132.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 <span class="comment">/*override*/</span>
-<a name="l00210"></a>00210 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00132.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* name, const <span class="keywordtype">char</span>* info ) throw();
-<a name="l00213"></a>00213 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 private:
-<a name="l00217"></a>00217 <a class="code" href="a00132.html">captured_exception</a>() {}
-<a name="l00218"></a>00218
-<a name="l00220"></a>00220 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
-<a name="l00221"></a>00221
-<a name="l00222"></a>00222 <span class="keywordtype">bool</span> my_dynamic;
-<a name="l00223"></a>00223 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
-<a name="l00224"></a>00224 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_info;
-<a name="l00225"></a>00225 };
-<a name="l00226"></a>00226
-<a name="l00228"></a>00228
-<a name="l00232"></a>00232 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
-<a name="l00233"></a><a class="code" href="a00149.html">00233</a> <span class="keyword">class </span><a class="code" href="a00149.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00180.html">tbb_exception</a>
-<a name="l00234"></a>00234 {
-<a name="l00235"></a>00235 <span class="keyword">typedef</span> <a class="code" href="a00149.html">movable_exception<ExceptionData></a> <a class="code" href="a00149.html">self_type</a>;
-<a name="l00236"></a>00236
-<a name="l00237"></a>00237 <span class="keyword">public</span>:
-<a name="l00238"></a>00238 <a class="code" href="a00149.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data )
-<a name="l00239"></a>00239 : <a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data)
-<a name="l00240"></a>00240 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00241"></a>00241 , my_exception_name(<span class="keyword">typeid</span>(<a class="code" href="a00149.html">self_type</a>).<a class="code" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>())
-<a name="l00242"></a>00242 {}
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 <a class="code" href="a00149.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00149.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
-<a name="l00245"></a>00245 : <a class="code" href="a00180.html">tbb_exception</a>(src)
-<a name="l00246"></a>00246 , <a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
-<a name="l00247"></a>00247 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00248"></a>00248 , my_exception_name(src.<a class="code" href="a00149.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
-<a name="l00249"></a>00249 {}
-<a name="l00250"></a>00250
-<a name="l00251"></a>00251 ~<a class="code" href="a00149.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 <span class="keyword">const</span> <a class="code" href="a00149.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00149.html">movable_exception</a>& src ) {
-<a name="l00254"></a>00254 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00255"></a>00255 <a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00256"></a>00256 my_exception_name = src.<a class="code" href="a00149.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00259"></a>00259 }
-<a name="l00260"></a>00260
-<a name="l00261"></a>00261 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
-<a name="l00262"></a>00262
-<a name="l00263"></a>00263 <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="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
-<a name="l00264"></a>00264
-<a name="l00265"></a><a class="code" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">00265</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
-<a name="l00266"></a>00266
-<a name="l00267"></a><a class="code" href="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">00267</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
-<a name="l00268"></a>00268
-<a name="l00269"></a>00269 <span class="comment">/*override*/</span>
-<a name="l00270"></a><a class="code" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">00270</a> <a class="code" href="a00149.html">movable_exception</a>* <a class="code" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
-<a name="l00271"></a>00271 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00149.html">movable_exception</a>));
-<a name="l00272"></a>00272 <span class="keywordflow">if</span> ( e ) {
-<a name="l00273"></a>00273 ::new (e) movable_exception(*<span class="keyword">this</span>);
-<a name="l00274"></a>00274 ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
-<a name="l00275"></a>00275 }
-<a name="l00276"></a>00276 <span class="keywordflow">return</span> (movable_exception*)e;
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278 <span class="comment">/*override*/</span>
-<a name="l00279"></a><a class="code" href="a00149.html#7a46873119d9f85a7b0009c13e41a258">00279</a> <span class="keywordtype">void</span> <a class="code" href="a00149.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
-<a name="l00280"></a>00280 __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
-<a name="l00281"></a>00281 <span class="keywordflow">if</span> ( my_dynamic ) {
-<a name="l00282"></a>00282 this->~<a class="code" href="a00149.html">movable_exception</a>();
-<a name="l00283"></a>00283 internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
-<a name="l00284"></a>00284 }
-<a name="l00285"></a>00285 }
-<a name="l00286"></a>00286 <span class="comment">/*override*/</span>
-<a name="l00287"></a><a class="code" href="a00149.html#17cffba35811c92b7e65d63506b69602">00287</a> <span class="keywordtype">void</span> <a class="code" href="a00149.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () {
-<a name="l00288"></a>00288 <span class="keywordflow">throw</span> *<span class="keyword">this</span>;
-<a name="l00289"></a>00289 }
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="keyword">protected</span>:
-<a name="l00293"></a><a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">00293</a> ExceptionData <a class="code" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00294"></a>00294
-<a name="l00295"></a>00295 <span class="keyword">private</span>:
-<a name="l00297"></a>00297 <span class="keywordtype">bool</span> my_dynamic;
-<a name="l00298"></a>00298
-<a name="l00300"></a>00300
-<a name="l00301"></a>00301 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
-<a name="l00302"></a>00302 };
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 <span class="preprocessor">#if !TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00305"></a>00305 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
-<a name="l00306"></a>00306
-<a name="l00308"></a>00308
-<a name="l00310"></a><a class="code" href="a00181.html">00310</a> <span class="keyword">class </span><a class="code" href="a00181.html">tbb_exception_ptr</a> {
-<a name="l00311"></a>00311 std::exception_ptr my_ptr;
-<a name="l00312"></a>00312
-<a name="l00313"></a>00313 <span class="keyword">public</span>:
-<a name="l00314"></a>00314 <span class="keyword">static</span> <a class="code" href="a00181.html">tbb_exception_ptr</a>* allocate ();
-<a name="l00315"></a>00315 <span class="keyword">static</span> <a class="code" href="a00181.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00180.html">tbb_exception</a>& tag );
-<a name="l00317"></a>00317 <span class="keyword">static</span> <a class="code" href="a00181.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00132.html">captured_exception</a>& src );
-<a name="l00318"></a>00318
-<a name="l00320"></a>00320
-<a name="l00321"></a>00321 <span class="keywordtype">void</span> <a class="code" href="a00181.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
-<a name="l00322"></a>00322
-<a name="l00324"></a><a class="code" href="a00181.html#292832fd5c523e3d8081a22247840a1d">00324</a> <span class="keywordtype">void</span> <a class="code" href="a00181.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 <span class="keyword">private</span>:
-<a name="l00327"></a>00327 <a class="code" href="a00181.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
-<a name="l00328"></a>00328 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00132.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
-<a name="l00329"></a>00329 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 } <span class="comment">// namespace internal</span>
-<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 } <span class="comment">// namespace tbb</span>
-<a name="l00335"></a>00335
-<a name="l00336"></a>00336 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00337"></a>00337
-<a name="l00338"></a>00338 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_exception_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00347.html b/doc/html/a00396.html
similarity index 95%
rename from doc/html/a00347.html
rename to doc/html/a00396.html
index 52a9ad0..44a10c9 100644
--- a/doc/html/a00347.html
+++ b/doc/html/a00396.html
@@ -129,7 +129,7 @@
<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="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>();
+<a name="l00116"></a>00116 task &my_task = <a class="code" href="a00199.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;
@@ -169,14 +169,14 @@
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <a class="code" href="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
+<a name="l00158"></a>00158 <a class="code" href="a00274.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="a00241.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
+<a name="l00165"></a>00165 <a class="code" href="a00274.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 }
@@ -186,7 +186,7 @@
<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="a00241.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) {
+<a name="l00189"></a><a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00274.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) {
@@ -199,14 +199,14 @@
<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="a00241.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
-<a name="l00204"></a>00204 <a class="code" href="a00241.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
+<a name="l00203"></a><a class="code" href="a00274.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
+<a name="l00204"></a>00204 <a class="code" href="a00274.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="a00241.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00241.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
-<a name="l00211"></a>00211 <a class="code" href="a00241.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
+<a name="l00210"></a><a class="code" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
+<a name="l00211"></a>00211 <a class="code" href="a00274.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
@@ -216,7 +216,7 @@
<a name="l00219"></a>00219 <span class="preprocessor"></span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00351.html b/doc/html/a00400.html
similarity index 87%
rename from doc/html/a00351.html
rename to doc/html/a00400.html
index 1224a39..5e622c9 100644
--- a/doc/html/a00351.html
+++ b/doc/html/a00400.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="a00157.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="a00179.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="a00157.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="a00179.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="a00157.html">00129</a> <span class="keyword">class </span><a class="code" href="a00157.html">parallel_while</a>: internal::no_copy {
+<a name="l00129"></a><a class="code" href="a00179.html">00129</a> <span class="keyword">class </span><a class="code" href="a00179.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="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a> <a class="code" href="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
+<a name="l00132"></a><a class="code" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a> <a class="code" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
<a name="l00133"></a>00133
-<a name="l00135"></a><a class="code" href="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a> <a class="code" href="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>() {
+<a name="l00135"></a><a class="code" href="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a> <a class="code" href="a00179.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="a00174.html#a57def00c8e9d932dbea0b3ee23991b9">destroy</a>(*my_barrier);
+<a name="l00137"></a>00137 my_barrier-><a class="code" href="a00199.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="a00157.html#fa297e53d3af2a101e712bc200233e9c">00143</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00157.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>;
+<a name="l00143"></a><a class="code" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">00143</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00179.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="a00157.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="a00179.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="a00157.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00157.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>& item );
+<a name="l00154"></a>00154 <span class="keywordtype">void</span> <a class="code" href="a00179.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00179.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="a00142.html">empty_task</a>* my_barrier;
+<a name="l00158"></a>00158 <a class="code" href="a00163.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="a00157.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00157.html">parallel_while<Body>::run</a>( Stream& stream, <span class="keyword">const</span> Body& body ) {
+<a name="l00163"></a><a class="code" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00179.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="a00142.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00174.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00142.html">empty_task</a>();
+<a name="l00165"></a>00165 <a class="code" href="a00163.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00163.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="a00174.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="a00174.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
-<a name="l00170"></a>00170 my_barrier-><a class="code" href="a00174.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
-<a name="l00171"></a>00171 my_barrier-><a class="code" href="a00174.html#a57def00c8e9d932dbea0b3ee23991b9">destroy</a>(*my_barrier);
+<a name="l00168"></a>00168 my_barrier-><a class="code" href="a00199.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="a00199.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
+<a name="l00170"></a>00170 my_barrier-><a class="code" href="a00199.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
+<a name="l00171"></a>00171 my_barrier-><a class="code" href="a00199.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="a00157.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00157.html">parallel_while<Body>::add</a>( <span class="keyword">const</span> value_type& item ) {
+<a name="l00177"></a><a class="code" href="a00179.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00179.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>( <a class="code" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">allocate_additional_child_of</a>(*my_barrier) ) iteration_type(item,*my_body);
-<a name="l00181"></a>00181 <a class="code" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00174.html#f7737143d458f1ed1c0d7da3971d9e6b">spawn</a>( i );
+<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="a00199.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>
@@ -187,7 +187,7 @@
<a name="l00186"></a>00186 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_while */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00403.html b/doc/html/a00403.html
deleted file mode 100644
index 6f2bbeb..0000000
--- a/doc/html/a00403.html
+++ /dev/null
@@ -1,299 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_thread.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_thread.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_thread_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_thread_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE unsigned WINAPI</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) unsigned (WINAPI* r)( void* )</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE void*</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) void* (*r)( void* )</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include <iosfwd></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include <exception></span> <span class="comment">// Need std::terminate from here.</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#include "tick_count.h"</span>
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>tbb {
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042 <span class="keyword">namespace </span>internal {
-<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <span class="keyword">class </span>tbb_thread_v3;
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 } <span class="comment">// namespace internal</span>
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 );
-<a name="l00049"></a>00049
-<a name="l00050"></a>00050 <span class="keyword">namespace </span>internal {
-<a name="l00051"></a>00051
-<a name="l00053"></a>00053 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_closure_v3( size_t size );
-<a name="l00055"></a>00055 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free_closure_v3( <span class="keywordtype">void</span>* );
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="keyword">struct </span>thread_closure_base {
-<a name="l00058"></a>00058 <span class="keywordtype">void</span>* operator new( size_t size ) {<span class="keywordflow">return</span> allocate_closure_v3(size);}
-<a name="l00059"></a>00059 <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* ptr ) {free_closure_v3(ptr);}
-<a name="l00060"></a>00060 };
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">template</span><<span class="keyword">class</span> F> <span class="keyword">struct </span>thread_closure_0: thread_closure_base {
-<a name="l00063"></a>00063 F function;
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
-<a name="l00066"></a>00066 thread_closure_0 *<span class="keyword">self</span> = static_cast<thread_closure_0*>(c);
-<a name="l00067"></a>00067 <span class="keywordflow">try</span> {
-<a name="l00068"></a>00068 <span class="keyword">self</span>->function();
-<a name="l00069"></a>00069 } <span class="keywordflow">catch</span> ( ... ) {
-<a name="l00070"></a>00070 std::terminate();
-<a name="l00071"></a>00071 }
-<a name="l00072"></a>00072 <span class="keyword">delete</span> <span class="keyword">self</span>;
-<a name="l00073"></a>00073 <span class="keywordflow">return</span> 0;
-<a name="l00074"></a>00074 }
-<a name="l00075"></a>00075 thread_closure_0( <span class="keyword">const</span> F& f ) : function(f) {}
-<a name="l00076"></a>00076 };
-<a name="l00078"></a>00078 <span class="keyword">template</span><<span class="keyword">class</span> F, <span class="keyword">class</span> X> <span class="keyword">struct </span>thread_closure_1: thread_closure_base {
-<a name="l00079"></a>00079 F function;
-<a name="l00080"></a>00080 X arg1;
-<a name="l00082"></a>00082 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
-<a name="l00083"></a>00083 thread_closure_1 *<span class="keyword">self</span> = static_cast<thread_closure_1*>(c);
-<a name="l00084"></a>00084 <span class="keywordflow">try</span> {
-<a name="l00085"></a>00085 <span class="keyword">self</span>->function(self->arg1);
-<a name="l00086"></a>00086 } <span class="keywordflow">catch</span> ( ... ) {
-<a name="l00087"></a>00087 std::terminate();
-<a name="l00088"></a>00088 }
-<a name="l00089"></a>00089 <span class="keyword">delete</span> <span class="keyword">self</span>;
-<a name="l00090"></a>00090 <span class="keywordflow">return</span> 0;
-<a name="l00091"></a>00091 }
-<a name="l00092"></a>00092 thread_closure_1( <span class="keyword">const</span> F& f, <span class="keyword">const</span> X& x ) : function(f), arg1(x) {}
-<a name="l00093"></a>00093 };
-<a name="l00094"></a>00094 <span class="keyword">template</span><<span class="keyword">class</span> F, <span class="keyword">class</span> X, <span class="keyword">class</span> Y> <span class="keyword">struct </span>thread_closure_2: thread_closure_base {
-<a name="l00095"></a>00095 F function;
-<a name="l00096"></a>00096 X arg1;
-<a name="l00097"></a>00097 Y arg2;
-<a name="l00099"></a>00099 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
-<a name="l00100"></a>00100 thread_closure_2 *<span class="keyword">self</span> = static_cast<thread_closure_2*>(c);
-<a name="l00101"></a>00101 <span class="keywordflow">try</span> {
-<a name="l00102"></a>00102 <span class="keyword">self</span>->function(self->arg1, self->arg2);
-<a name="l00103"></a>00103 } <span class="keywordflow">catch</span> ( ... ) {
-<a name="l00104"></a>00104 std::terminate();
-<a name="l00105"></a>00105 }
-<a name="l00106"></a>00106 <span class="keyword">delete</span> <span class="keyword">self</span>;
-<a name="l00107"></a>00107 <span class="keywordflow">return</span> 0;
-<a name="l00108"></a>00108 }
-<a name="l00109"></a>00109 thread_closure_2( <span class="keyword">const</span> F& f, <span class="keyword">const</span> X& x, <span class="keyword">const</span> Y& y ) : function(f), arg1(x), arg2(y) {}
-<a name="l00110"></a>00110 };
-<a name="l00111"></a>00111
-<a name="l00113"></a>00113 <span class="keyword">class </span>tbb_thread_v3 {
-<a name="l00114"></a>00114 tbb_thread_v3(<span class="keyword">const</span> tbb_thread_v3&); <span class="comment">// = delete; // Deny access</span>
-<a name="l00115"></a>00115 <span class="keyword">public</span>:
-<a name="l00116"></a>00116 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> <span class="keyword">typedef</span> HANDLE native_handle_type;
-<a name="l00118"></a>00118 <span class="preprocessor">#else</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t native_handle_type;
-<a name="l00120"></a>00120 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span>
-<a name="l00122"></a>00122 <span class="keyword">class </span>id;
-<a name="l00124"></a>00124 tbb_thread_v3() : my_handle(0)
-<a name="l00125"></a>00125 #if _WIN32||_WIN64
-<a name="l00126"></a>00126 , my_thread_id(0)
-<a name="l00127"></a>00127 #endif <span class="comment">// _WIN32||_WIN64</span>
-<a name="l00128"></a>00128 {}
-<a name="l00129"></a>00129
-<a name="l00131"></a>00131 <span class="keyword">template</span> <<span class="keyword">class</span> F> <span class="keyword">explicit</span> tbb_thread_v3(F f) {
-<a name="l00132"></a>00132 <span class="keyword">typedef</span> internal::thread_closure_0<F> closure_type;
-<a name="l00133"></a>00133 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f));
-<a name="l00134"></a>00134 }
-<a name="l00136"></a>00136 <span class="keyword">template</span> <<span class="keyword">class</span> F, <span class="keyword">class</span> X> tbb_thread_v3(F f, X x) {
-<a name="l00137"></a>00137 <span class="keyword">typedef</span> internal::thread_closure_1<F,X> closure_type;
-<a name="l00138"></a>00138 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f,x));
-<a name="l00139"></a>00139 }
-<a name="l00141"></a>00141 <span class="keyword">template</span> <<span class="keyword">class</span> F, <span class="keyword">class</span> X, <span class="keyword">class</span> Y> tbb_thread_v3(F f, X x, Y y) {
-<a name="l00142"></a>00142 <span class="keyword">typedef</span> internal::thread_closure_2<F,X,Y> closure_type;
-<a name="l00143"></a>00143 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f,x,y));
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 tbb_thread_v3& operator=(tbb_thread_v3& x) {
-<a name="l00147"></a>00147 <span class="keywordflow">if</span> (joinable()) detach();
-<a name="l00148"></a>00148 my_handle = x.my_handle;
-<a name="l00149"></a>00149 x.my_handle = 0;
-<a name="l00150"></a>00150 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span> my_thread_id = x.my_thread_id;
-<a name="l00152"></a>00152 x.my_thread_id = 0;
-<a name="l00153"></a>00153 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 <span class="keywordtype">void</span> swap( tbb_thread_v3& t ) {tbb::swap( *<span class="keyword">this</span>, t );}
-<a name="l00157"></a>00157 <span class="keywordtype">bool</span> joinable()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_handle!=0; }
-<a name="l00159"></a>00159 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD join();
-<a name="l00161"></a>00161 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD detach();
-<a name="l00162"></a>00162 ~tbb_thread_v3() {<span class="keywordflow">if</span>( joinable() ) detach();}
-<a name="l00163"></a>00163 <span class="keyword">inline</span> <span class="keywordtype">id</span> get_id() <span class="keyword">const</span>;
-<a name="l00164"></a>00164 native_handle_type native_handle() { <span class="keywordflow">return</span> my_handle; }
-<a name="l00165"></a>00165
-<a name="l00167"></a>00167 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> __TBB_EXPORTED_FUNC hardware_concurrency();
-<a name="l00168"></a>00168 <span class="keyword">private</span>:
-<a name="l00169"></a>00169 native_handle_type my_handle;
-<a name="l00170"></a>00170 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span> DWORD my_thread_id;
-<a name="l00172"></a>00172 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span>
-<a name="l00175"></a>00175 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine),
-<a name="l00176"></a>00176 <span class="keywordtype">void</span>* closure );
-<a name="l00177"></a>00177 <span class="keyword">friend</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
-<a name="l00178"></a>00178 <span class="keyword">friend</span> <span class="keywordtype">void</span> tbb::swap( tbb_thread_v3& t1, tbb_thread_v3& t2 );
-<a name="l00179"></a>00179 };
-<a name="l00180"></a>00180
-<a name="l00181"></a>00181 <span class="keyword">class </span>tbb_thread_v3::id {
-<a name="l00182"></a>00182 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span> DWORD my_id;
-<a name="l00184"></a>00184 id( DWORD my_id ) : my_id(my_id) {}
-<a name="l00185"></a>00185 <span class="preprocessor">#else</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span> pthread_t my_id;
-<a name="l00187"></a>00187 id( pthread_t my_id ) : my_id(my_id) {}
-<a name="l00188"></a>00188 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>tbb_thread_v3;
-<a name="l00190"></a>00190 <span class="keyword">public</span>:
-<a name="l00191"></a>00191 id() : my_id(0) {}
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00194"></a>00194 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00195"></a>00195 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00196"></a>00196 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<=( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00197"></a>00197 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator>( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00198"></a>00198 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator>=( tbb_thread_v3::id x, tbb_thread_v3::id y );
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 <span class="keyword">template</span><<span class="keyword">class</span> <span class="keywordtype">char</span>T, <span class="keyword">class</span> traits>
-<a name="l00201"></a>00201 <span class="keyword">friend</span> std::basic_ostream<charT, traits>&
-<a name="l00202"></a>00202 operator<< (std::basic_ostream<charT, traits> &out,
-<a name="l00203"></a>00203 tbb_thread_v3::id id)
-<a name="l00204"></a>00204 {
-<a name="l00205"></a>00205 out << <span class="keywordtype">id</span>.my_id;
-<a name="l00206"></a>00206 <span class="keywordflow">return</span> out;
-<a name="l00207"></a>00207 }
-<a name="l00208"></a>00208 <span class="keyword">friend</span> tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
-<a name="l00209"></a>00209 }; <span class="comment">// tbb_thread_v3::id</span>
-<a name="l00210"></a>00210
-<a name="l00211"></a>00211 tbb_thread_v3::id tbb_thread_v3::get_id()<span class="keyword"> const </span>{
-<a name="l00212"></a>00212 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00213"></a>00213 <span class="preprocessor"></span> <span class="keywordflow">return</span> id(my_thread_id);
-<a name="l00214"></a>00214 <span class="preprocessor">#else</span>
-<a name="l00215"></a>00215 <span class="preprocessor"></span> <span class="keywordflow">return</span> id(my_handle);
-<a name="l00216"></a>00216 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
-<a name="l00217"></a>00217 <span class="preprocessor"></span> }
-<a name="l00218"></a>00218 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
-<a name="l00219"></a>00219 tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
-<a name="l00220"></a>00220 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC thread_yield_v3();
-<a name="l00221"></a>00221 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC thread_sleep_v3(<span class="keyword">const</span> tick_count::interval_t &i);
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00224"></a>00224 {
-<a name="l00225"></a>00225 <span class="keywordflow">return</span> x.my_id == y.my_id;
-<a name="l00226"></a>00226 }
-<a name="l00227"></a>00227 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00228"></a>00228 {
-<a name="l00229"></a>00229 <span class="keywordflow">return</span> x.my_id != y.my_id;
-<a name="l00230"></a>00230 }
-<a name="l00231"></a>00231 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00232"></a>00232 {
-<a name="l00233"></a>00233 <span class="keywordflow">return</span> x.my_id < y.my_id;
-<a name="l00234"></a>00234 }
-<a name="l00235"></a>00235 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<=(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00236"></a>00236 {
-<a name="l00237"></a>00237 <span class="keywordflow">return</span> x.my_id <= y.my_id;
-<a name="l00238"></a>00238 }
-<a name="l00239"></a>00239 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00240"></a>00240 {
-<a name="l00241"></a>00241 <span class="keywordflow">return</span> x.my_id > y.my_id;
-<a name="l00242"></a>00242 }
-<a name="l00243"></a>00243 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>=(tbb_thread_v3::id x, tbb_thread_v3::id y)
-<a name="l00244"></a>00244 {
-<a name="l00245"></a>00245 <span class="keywordflow">return</span> x.my_id >= y.my_id;
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 } <span class="comment">// namespace internal;</span>
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <span class="keyword">typedef</span> internal::tbb_thread_v3 tbb_thread;
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 <span class="keyword">using</span> internal::operator==;
-<a name="l00254"></a>00254 <span class="keyword">using</span> internal::operator!=;
-<a name="l00255"></a>00255 <span class="keyword">using</span> internal::operator<;
-<a name="l00256"></a>00256 <span class="keyword">using</span> internal::operator>;
-<a name="l00257"></a>00257 <span class="keyword">using</span> internal::operator<=;
-<a name="l00258"></a>00258 <span class="keyword">using</span> internal::operator>=;
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <span class="keyword">inline</span> <span class="keywordtype">void</span> move( tbb_thread& t1, tbb_thread& t2 ) {
-<a name="l00261"></a>00261 internal::move_v3(t1, t2);
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00264"></a>00264 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ) {
-<a name="l00265"></a>00265 tbb::tbb_thread::native_handle_type h = t1.my_handle;
-<a name="l00266"></a>00266 t1.my_handle = t2.my_handle;
-<a name="l00267"></a>00267 t2.my_handle = h;
-<a name="l00268"></a>00268 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00269"></a>00269 <span class="preprocessor"></span> DWORD i = t1.my_thread_id;
-<a name="l00270"></a>00270 t1.my_thread_id = t2.my_thread_id;
-<a name="l00271"></a>00271 t2.my_thread_id = i;
-<a name="l00272"></a>00272 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00273"></a>00273 }
-<a name="l00274"></a>00274
-<a name="l00275"></a>00275 <span class="keyword">namespace </span>this_tbb_thread {
-<a name="l00276"></a>00276 <span class="keyword">inline</span> tbb_thread::id get_id() { <span class="keywordflow">return</span> internal::thread_get_id_v3(); }
-<a name="l00278"></a>00278 <span class="keyword">inline</span> <span class="keywordtype">void</span> yield() { internal::thread_yield_v3(); }
-<a name="l00280"></a>00280 <span class="keyword">inline</span> <span class="keywordtype">void</span> sleep(<span class="keyword">const</span> tick_count::interval_t &i) {
-<a name="l00281"></a>00281 internal::thread_sleep_v3(i);
-<a name="l00282"></a>00282 }
-<a name="l00283"></a>00283 } <span class="comment">// namespace this_tbb_thread</span>
-<a name="l00284"></a>00284
-<a name="l00285"></a>00285 } <span class="comment">// namespace tbb</span>
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_thread_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/a00355.html b/doc/html/a00404.html
similarity index 91%
rename from doc/html/a00355.html
rename to doc/html/a00404.html
index 3f2558c..42de38c 100644
--- a/doc/html/a00355.html
+++ b/doc/html/a00404.html
@@ -52,7 +52,7 @@
<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="a00120.html">tbb::affinity_partitioner</a>;
+<a name="l00036"></a>00036 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00141.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;
@@ -66,11 +66,11 @@
<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="a00174.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
-<a name="l00057"></a>00057 task* continue_after_execute_range( task& ) {<span class="keywordflow">return</span> NULL;}
+<a name="l00056"></a>00056 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00199.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& a, task& b ) {
-<a name="l00060"></a>00060 a.spawn(b);
+<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
@@ -84,9 +84,9 @@
<a name="l00071"></a>00071 } <span class="comment">// namespace internal</span>
<a name="l00073"></a>00073 <span class="comment"></span>
<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00168.html">00077</a> <span class="keyword">class </span><a class="code" href="a00168.html">simple_partitioner</a> {
+<a name="l00077"></a><a class="code" href="a00193.html">00077</a> <span class="keyword">class </span><a class="code" href="a00193.html">simple_partitioner</a> {
<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00079"></a>00079 <a class="code" href="a00168.html">simple_partitioner</a>() {}
+<a name="l00079"></a>00079 <a class="code" href="a00193.html">simple_partitioner</a>() {}
<a name="l00080"></a>00080 <span class="keyword">private</span>:
<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_for;
<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_reduce;
@@ -94,16 +94,16 @@
<a name="l00084"></a>00084
<a name="l00085"></a>00085 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
<a name="l00086"></a>00086 <span class="keyword">public</span>:
-<a name="l00087"></a>00087 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00174.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00088"></a>00088 partition_type( <span class="keyword">const</span> <a class="code" href="a00168.html">simple_partitioner</a>& ) {}
-<a name="l00089"></a>00089 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00173.html">split</a> ) {}
+<a name="l00087"></a>00087 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00199.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00088"></a>00088 partition_type( <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& ) {}
+<a name="l00089"></a>00089 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00198.html">split</a> ) {}
<a name="l00090"></a>00090 };
<a name="l00091"></a>00091 };
<a name="l00092"></a>00092
<a name="l00094"></a>00094
-<a name="l00097"></a><a class="code" href="a00125.html">00097</a> <span class="keyword">class </span><a class="code" href="a00125.html">auto_partitioner</a> {
+<a name="l00097"></a><a class="code" href="a00146.html">00097</a> <span class="keyword">class </span><a class="code" href="a00146.html">auto_partitioner</a> {
<a name="l00098"></a>00098 <span class="keyword">public</span>:
-<a name="l00099"></a>00099 <a class="code" href="a00125.html">auto_partitioner</a>() {}
+<a name="l00099"></a>00099 <a class="code" href="a00146.html">auto_partitioner</a>() {}
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="keyword">private</span>:
<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_for;
@@ -114,21 +114,21 @@
<a name="l00107"></a>00107 size_t num_chunks;
<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
<a name="l00109"></a>00109 <span class="keyword">public</span>:
-<a name="l00110"></a>00110 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00174.html">task</a> &t) {
-<a name="l00111"></a>00111 <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.<a class="code" href="a00174.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() )
+<a name="l00110"></a>00110 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00199.html">task</a> &t) {
+<a name="l00111"></a>00111 <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.<a class="code" href="a00199.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() )
<a name="l00112"></a>00112 num_chunks = VICTIM_CHUNKS;
<a name="l00113"></a>00113 <span class="keywordflow">return</span> num_chunks==1;
<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 partition_type( <span class="keyword">const</span> <a class="code" href="a00125.html">auto_partitioner</a>& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
-<a name="l00116"></a>00116 partition_type( partition_type& pt, <a class="code" href="a00173.html">split</a> ) {
+<a name="l00115"></a>00115 partition_type( <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
+<a name="l00116"></a>00116 partition_type( partition_type& pt, <a class="code" href="a00198.html">split</a> ) {
<a name="l00117"></a>00117 num_chunks = pt.num_chunks /= 2u;
<a name="l00118"></a>00118 }
<a name="l00119"></a>00119 };
<a name="l00120"></a>00120 };
<a name="l00121"></a>00121
-<a name="l00123"></a><a class="code" href="a00120.html">00123</a> <span class="keyword">class </span><a class="code" href="a00120.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
+<a name="l00123"></a><a class="code" href="a00141.html">00123</a> <span class="keyword">class </span><a class="code" href="a00141.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
<a name="l00124"></a>00124 <span class="keyword">public</span>:
-<a name="l00125"></a>00125 <a class="code" href="a00120.html">affinity_partitioner</a>() {}
+<a name="l00125"></a>00125 <a class="code" href="a00141.html">affinity_partitioner</a>() {}
<a name="l00126"></a>00126
<a name="l00127"></a>00127 <span class="keyword">private</span>:
<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_for;
@@ -147,11 +147,11 @@
<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
<a name="l00144"></a>00144
<a name="l00145"></a>00145 internal::affinity_id* my_array;
-<a name="l00146"></a>00146 <a class="code" href="a00176.html">task_list</a> delay_list;
+<a name="l00146"></a>00146 <a class="code" href="a00202.html">task_list</a> delay_list;
<a name="l00147"></a>00147 <span class="keywordtype">unsigned</span> map_begin, map_end;
<a name="l00148"></a>00148 size_t num_chunks;
<a name="l00149"></a>00149 <span class="keyword">public</span>:
-<a name="l00150"></a>00150 affinity_partition_type( <a class="code" href="a00120.html">affinity_partitioner</a>& ap ) {
+<a name="l00150"></a>00150 affinity_partition_type( <a class="code" href="a00141.html">affinity_partitioner</a>& ap ) {
<a name="l00151"></a>00151 __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> );
<a name="l00152"></a>00152 ap.resize(factor);
<a name="l00153"></a>00153 my_array = ap.my_array;
@@ -180,16 +180,16 @@
<a name="l00176"></a>00176 <span class="keywordflow">if</span>( map_begin<map_end )
<a name="l00177"></a>00177 t.set_affinity( my_array[map_begin] );
<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
+<a name="l00179"></a>00179 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
<a name="l00180"></a>00180 <span class="keywordflow">if</span>( map_begin<map_end )
<a name="l00181"></a>00181 my_array[map_begin] = id;
<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183 task* continue_after_execute_range( task& t ) {
+<a name="l00183"></a>00183 task* continue_after_execute_range() {
<a name="l00184"></a>00184 task* first = NULL;
<a name="l00185"></a>00185 <span class="keywordflow">if</span>( !delay_list.empty() ) {
<a name="l00186"></a>00186 first = &delay_list.pop_front();
<a name="l00187"></a>00187 <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00188"></a>00188 t.spawn(*first);
+<a name="l00188"></a>00188 task::spawn(*first);
<a name="l00189"></a>00189 first = &delay_list.pop_front();
<a name="l00190"></a>00190 }
<a name="l00191"></a>00191 }
@@ -199,11 +199,11 @@
<a name="l00195"></a>00195 <span class="comment">// The possible underflow caused by "-1u" is deliberate</span>
<a name="l00196"></a>00196 <span class="keywordflow">return</span> (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span> delay, task& a, task& b ) {
+<a name="l00198"></a>00198 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span> delay, task& b ) {
<a name="l00199"></a>00199 <span class="keywordflow">if</span>( delay )
<a name="l00200"></a>00200 delay_list.push_back(b);
<a name="l00201"></a>00201 <span class="keywordflow">else</span>
-<a name="l00202"></a>00202 a.spawn(b);
+<a name="l00202"></a>00202 task::spawn(b);
<a name="l00203"></a>00203 }
<a name="l00204"></a>00204
<a name="l00205"></a>00205 ~affinity_partition_type() {
@@ -223,7 +223,7 @@
<a name="l00220"></a>00220 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00409.html b/doc/html/a00409.html
new file mode 100644
index 0000000..7e1fb73
--- /dev/null
+++ b/doc/html/a00409.html
@@ -0,0 +1,491 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pipeline.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>pipeline.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_pipeline_H </span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_pipeline_H </span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include <cstddef></span>
+<a name="l00027"></a>00027
+<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
+<a name="l00029"></a>00029
+<a name="l00030"></a>00030 <span class="keyword">class </span>pipeline;
+<a name="l00031"></a>00031 <span class="keyword">class </span>filter;
+<a name="l00032"></a>00032
+<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
+<a name="l00035"></a>00035
+<a name="l00036"></a>00036 <span class="comment">// The argument for PIPELINE_VERSION should be an integer between 2 and 9</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span>
+<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Token;
+<a name="l00040"></a>00040 <span class="keyword">typedef</span> <span class="keywordtype">long</span> tokendiff_t;
+<a name="l00041"></a>00041 <span class="keyword">class </span>stage_task;
+<a name="l00042"></a>00042 <span class="keyword">class </span>input_buffer;
+<a name="l00043"></a>00043 <span class="keyword">class </span>pipeline_root_task;
+<a name="l00044"></a>00044 <span class="keyword">class </span>pipeline_cleaner;
+<a name="l00045"></a>00045
+<a name="l00046"></a>00046 } <span class="comment">// namespace internal</span>
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048 <span class="keyword">namespace </span>interface5 {
+<a name="l00049"></a>00049 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> <span class="keyword">class </span>filter_t;
+<a name="l00050"></a>00050
+<a name="l00051"></a>00051 <span class="keyword">namespace </span>internal {
+<a name="l00052"></a>00052 <span class="keyword">class </span>pipeline_proxy;
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054 }
+<a name="l00055"></a>00055
+<a name="l00057"></a>00057
+<a name="l00059"></a>00059
+<a name="l00060"></a><a class="code" href="a00165.html">00060</a> <span class="keyword">class </span><a class="code" href="a00165.html">filter</a>: internal::no_copy {
+<a name="l00061"></a>00061 <span class="keyword">private</span>:
+<a name="l00063"></a>00063 <span class="keyword">static</span> <a class="code" href="a00165.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
+<a name="l00064"></a>00064
+<a name="l00066"></a>00066 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_serial = 0x1;
+<a name="l00067"></a>00067
+<a name="l00069"></a>00069
+<a name="l00071"></a>00071 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_out_of_order = 0x1<<4;
+<a name="l00072"></a>00072
+<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_bound = 0x1<<5;
+<a name="l00075"></a>00075
+<a name="l00077"></a>00077 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> exact_exception_propagation =
+<a name="l00078"></a>00078 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span> 0x0;
+<a name="l00080"></a>00080 <span class="preprocessor">#else</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span> 0x1<<7;
+<a name="l00082"></a>00082 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00083"></a>00083
+<a name="l00084"></a>00084 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> current_version = __TBB_PIPELINE_VERSION(5);
+<a name="l00085"></a>00085 <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="l00086"></a>00086 <span class="keyword">public</span>:
+<a name="l00087"></a>00087 <span class="keyword">enum</span> mode {
+<a name="l00089"></a>00089 parallel = current_version | filter_is_out_of_order,
+<a name="l00091"></a>00091 serial_in_order = current_version | filter_is_serial,
+<a name="l00093"></a>00093 serial_out_of_order = current_version | filter_is_serial | filter_is_out_of_order,
+<a name="l00095"></a>00095 serial = serial_in_order
+<a name="l00096"></a>00096 };
+<a name="l00097"></a>00097 <span class="keyword">protected</span>:
+<a name="l00098"></a>00098 <a class="code" href="a00165.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
+<a name="l00099"></a>00099 next_filter_in_pipeline(not_in_pipeline()),
+<a name="l00100"></a>00100 my_input_buffer(NULL),
+<a name="l00101"></a>00101 my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | exact_exception_propagation)),
+<a name="l00102"></a>00102 prev_filter_in_pipeline(not_in_pipeline()),
+<a name="l00103"></a>00103 my_pipeline(NULL),
+<a name="l00104"></a>00104 next_segment(NULL)
+<a name="l00105"></a>00105 {}
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107 <a class="code" href="a00165.html">filter</a>( mode filter_mode ) :
+<a name="l00108"></a>00108 next_filter_in_pipeline(not_in_pipeline()),
+<a name="l00109"></a>00109 my_input_buffer(NULL),
+<a name="l00110"></a>00110 my_filter_mode(static_cast<unsigned char>(filter_mode | exact_exception_propagation)),
+<a name="l00111"></a>00111 prev_filter_in_pipeline(not_in_pipeline()),
+<a name="l00112"></a>00112 my_pipeline(NULL),
+<a name="l00113"></a>00113 next_segment(NULL)
+<a name="l00114"></a>00114 {}
+<a name="l00115"></a>00115
+<a name="l00116"></a>00116 <span class="keyword">public</span>:
+<a name="l00118"></a><a class="code" href="a00165.html#fcfec27656a69ff2072802ac001e936f">00118</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
+<a name="l00119"></a>00119 <span class="keywordflow">return</span> bool( my_filter_mode & filter_is_serial );
+<a name="l00120"></a>00120 }
+<a name="l00121"></a>00121
+<a name="l00123"></a><a class="code" href="a00165.html#cd53206c4795ef2df5df26b795caf692">00123</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
+<a name="l00124"></a>00124 <span class="keywordflow">return</span> (my_filter_mode & (filter_is_out_of_order|filter_is_serial))==filter_is_serial;
+<a name="l00125"></a>00125 }
+<a name="l00126"></a>00126
+<a name="l00128"></a><a class="code" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">00128</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
+<a name="l00129"></a>00129 <span class="keywordflow">return</span> ( my_filter_mode & filter_is_bound )==filter_is_bound;
+<a name="l00130"></a>00130 }
+<a name="l00131"></a>00131
+<a name="l00133"></a>00133
+<a name="l00134"></a>00134 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
+<a name="l00135"></a>00135
+<a name="l00137"></a>00137
+<a name="l00138"></a>00138 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
+<a name="l00139"></a>00139
+<a name="l00140"></a>00140 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00142"></a>00142 <span class="preprocessor"></span>
+<a name="l00144"></a><a class="code" href="a00165.html#56275eb889c77c4807967133e21401bd">00144</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
+<a name="l00145"></a>00145 <span class="preprocessor">#endif</span>
+<a name="l00146"></a>00146 <span class="preprocessor"></span>
+<a name="l00147"></a>00147 <span class="keyword">private</span>:
+<a name="l00149"></a>00149 <a class="code" href="a00165.html">filter</a>* next_filter_in_pipeline;
+<a name="l00150"></a>00150
+<a name="l00152"></a>00152
+<a name="l00153"></a>00153 internal::input_buffer* my_input_buffer;
+<a name="l00154"></a>00154
+<a name="l00155"></a>00155 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
+<a name="l00156"></a>00156 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
+<a name="l00157"></a>00157 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00180.html">pipeline</a>;
+<a name="l00158"></a>00158 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>;
+<a name="l00159"></a>00159
+<a name="l00161"></a>00161 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
+<a name="l00162"></a>00162
+<a name="l00164"></a>00164 <a class="code" href="a00165.html">filter</a>* prev_filter_in_pipeline;
+<a name="l00165"></a>00165
+<a name="l00167"></a>00167 <a class="code" href="a00180.html">pipeline</a>* my_pipeline;
+<a name="l00168"></a>00168
+<a name="l00170"></a>00170
+<a name="l00171"></a>00171 <a class="code" href="a00165.html">filter</a>* next_segment;
+<a name="l00172"></a>00172 };
+<a name="l00173"></a>00173
+<a name="l00175"></a>00175
+<a name="l00176"></a><a class="code" href="a00209.html">00176</a> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00165.html">filter</a> {
+<a name="l00177"></a>00177 <span class="keyword">public</span>:
+<a name="l00178"></a>00178 <span class="keyword">enum</span> result_type {
+<a name="l00179"></a>00179 <span class="comment">// item was processed</span>
+<a name="l00180"></a>00180 success,
+<a name="l00181"></a>00181 <span class="comment">// item is currently not available</span>
+<a name="l00182"></a>00182 item_not_available,
+<a name="l00183"></a>00183 <span class="comment">// there are no more items to process</span>
+<a name="l00184"></a>00184 end_of_stream
+<a name="l00185"></a>00185 };
+<a name="l00186"></a>00186 <span class="keyword">protected</span>:
+<a name="l00187"></a>00187 <a class="code" href="a00209.html">thread_bound_filter</a>(mode filter_mode):
+<a name="l00188"></a>00188 <a class="code" href="a00165.html">filter</a>(static_cast<mode>(filter_mode | filter::filter_is_bound | filter::exact_exception_propagation))
+<a name="l00189"></a>00189 {}
+<a name="l00190"></a>00190 <span class="keyword">public</span>:
+<a name="l00192"></a>00192
+<a name="l00197"></a>00197 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
+<a name="l00198"></a>00198
+<a name="l00200"></a>00200
+<a name="l00204"></a>00204 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
+<a name="l00205"></a>00205
+<a name="l00206"></a>00206 <span class="keyword">private</span>:
+<a name="l00208"></a>00208 result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
+<a name="l00209"></a>00209 };
+<a name="l00210"></a>00210
+<a name="l00212"></a>00212
+<a name="l00213"></a><a class="code" href="a00180.html">00213</a> <span class="keyword">class </span><a class="code" href="a00180.html">pipeline</a> {
+<a name="l00214"></a>00214 <span class="keyword">public</span>:
+<a name="l00216"></a>00216 __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
+<a name="l00217"></a>00217
+<a name="l00220"></a>00220 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
+<a name="l00221"></a>00221
+<a name="l00223"></a>00223 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00165.html">filter</a>& filter_ );
+<a name="l00224"></a>00224
+<a name="l00226"></a>00226 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
+<a name="l00227"></a>00227
+<a name="l00228"></a>00228 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00230"></a>00230 <span class="preprocessor"> void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</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="l00234"></a>00234 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
+<a name="l00235"></a>00235
+<a name="l00236"></a>00236 <span class="keyword">private</span>:
+<a name="l00237"></a>00237 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
+<a name="l00238"></a>00238 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
+<a name="l00239"></a>00239 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00165.html">filter</a>;
+<a name="l00240"></a>00240 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>;
+<a name="l00241"></a>00241 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
+<a name="l00242"></a>00242 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface5::internal::pipeline_proxy;
+<a name="l00243"></a>00243
+<a name="l00245"></a>00245 <a class="code" href="a00165.html">filter</a>* filter_list;
+<a name="l00246"></a>00246
+<a name="l00248"></a>00248 <a class="code" href="a00165.html">filter</a>* filter_end;
+<a name="l00249"></a>00249
+<a name="l00251"></a>00251 <a class="code" href="a00199.html">task</a>* end_counter;
+<a name="l00252"></a>00252
+<a name="l00254"></a>00254 <a class="code" href="a00143.html">atomic<internal::Token></a> input_tokens;
+<a name="l00255"></a>00255
+<a name="l00257"></a>00257 <a class="code" href="a00143.html">atomic<internal::Token></a> token_counter;
+<a name="l00258"></a>00258
+<a name="l00260"></a>00260 <span class="keywordtype">bool</span> end_of_input;
+<a name="l00261"></a>00261
+<a name="l00263"></a>00263 <span class="keywordtype">bool</span> has_thread_bound_filters;
+<a name="l00264"></a>00264
+<a name="l00266"></a>00266 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00165.html">filter</a>& filter_ );
+<a name="l00267"></a>00267
+<a name="l00269"></a>00269 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00199.html">task</a>& <span class="keyword">self</span> );
+<a name="l00270"></a>00270
+<a name="l00271"></a>00271 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00273"></a>00273 <span class="preprocessor"> void clear_filters();</span>
+<a name="l00274"></a>00274 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00275"></a>00275 <span class="preprocessor"></span>};
+<a name="l00276"></a>00276
+<a name="l00277"></a>00277 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00278"></a>00278 <span class="comment">// Support for lambda-friendly parallel_pipeline interface</span>
+<a name="l00279"></a>00279 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00280"></a>00280
+<a name="l00281"></a>00281 <span class="keyword">namespace </span>interface5 {
+<a name="l00282"></a>00282
+<a name="l00283"></a>00283 <span class="keyword">namespace </span>internal {
+<a name="l00284"></a>00284 <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="l00285"></a>00285 }
+<a name="l00286"></a>00286
+<a name="l00287"></a>00287 <span class="keyword">class </span>flow_control {
+<a name="l00288"></a>00288 <span class="keywordtype">bool</span> is_pipeline_stopped;
+<a name="l00289"></a>00289 flow_control() { is_pipeline_stopped = <span class="keyword">false</span>; }
+<a name="l00290"></a>00290 <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="l00291"></a>00291 <span class="keyword">public</span>:
+<a name="l00292"></a>00292 <span class="keywordtype">void</span> stop() { is_pipeline_stopped = <span class="keyword">true</span>; }
+<a name="l00293"></a>00293 };
+<a name="l00294"></a>00294
+<a name="l00296"></a>00296 <span class="keyword">namespace </span>internal {
+<a name="l00297"></a>00297
+<a name="l00298"></a>00298 <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="l00299"></a>00299 <span class="keyword">class </span>concrete_filter: <span class="keyword">public</span> tbb::filter {
+<a name="l00300"></a>00300 Body my_body;
+<a name="l00301"></a>00301
+<a name="l00302"></a>00302 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
+<a name="l00303"></a>00303 T* temp_input = (T*)input;
+<a name="l00304"></a>00304 <span class="comment">// Call user's operator()() here</span>
+<a name="l00305"></a>00305 <span class="keywordtype">void</span>* output = (<span class="keywordtype">void</span>*) <span class="keyword">new</span> U(my_body(*temp_input));
+<a name="l00306"></a>00306 <span class="keyword">delete</span> temp_input;
+<a name="l00307"></a>00307 <span class="keywordflow">return</span> output;
+<a name="l00308"></a>00308 }
+<a name="l00309"></a>00309
+<a name="l00310"></a>00310 <span class="keyword">public</span>:
+<a name="l00311"></a>00311 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<a name="l00312"></a>00312 };
+<a name="l00313"></a>00313
+<a name="l00314"></a>00314 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
+<a name="l00315"></a>00315 <span class="keyword">class </span>concrete_filter<void,U,Body>: <span class="keyword">public</span> filter {
+<a name="l00316"></a>00316 Body my_body;
+<a name="l00317"></a>00317
+<a name="l00318"></a>00318 <span class="comment">/*override*/</span><span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
+<a name="l00319"></a>00319 flow_control control;
+<a name="l00320"></a>00320 U temp_output = my_body(control);
+<a name="l00321"></a>00321 <span class="keywordtype">void</span>* output = control.is_pipeline_stopped ? NULL : (<span class="keywordtype">void</span>*) <span class="keyword">new</span> U(temp_output);
+<a name="l00322"></a>00322 <span class="keywordflow">return</span> output;
+<a name="l00323"></a>00323 }
+<a name="l00324"></a>00324 <span class="keyword">public</span>:
+<a name="l00325"></a>00325 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<a name="l00326"></a>00326 };
+<a name="l00327"></a>00327
+<a name="l00328"></a>00328 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Body>
+<a name="l00329"></a>00329 <span class="keyword">class </span>concrete_filter<T,void,Body>: <span class="keyword">public</span> filter {
+<a name="l00330"></a>00330 Body my_body;
+<a name="l00331"></a>00331
+<a name="l00332"></a>00332 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
+<a name="l00333"></a>00333 T* temp_input = (T*)input;
+<a name="l00334"></a>00334 my_body(*temp_input);
+<a name="l00335"></a>00335 <span class="keyword">delete</span> temp_input;
+<a name="l00336"></a>00336 <span class="keywordflow">return</span> NULL;
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338 <span class="keyword">public</span>:
+<a name="l00339"></a>00339 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<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> Body>
+<a name="l00343"></a>00343 <span class="keyword">class </span>concrete_filter<void,void,Body>: <span class="keyword">public</span> filter {
+<a name="l00344"></a>00344 Body my_body;
+<a name="l00345"></a>00345
+<a name="l00347"></a>00347 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
+<a name="l00348"></a>00348 flow_control control;
+<a name="l00349"></a>00349 my_body(control);
+<a name="l00350"></a>00350 <span class="keywordtype">void</span>* output = control.is_pipeline_stopped ? NULL : (<span class="keywordtype">void</span>*)(intptr_t)-1;
+<a name="l00351"></a>00351 <span class="keywordflow">return</span> output;
+<a name="l00352"></a>00352 }
+<a name="l00353"></a>00353 <span class="keyword">public</span>:
+<a name="l00354"></a>00354 concrete_filter(filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<a name="l00355"></a>00355 };
+<a name="l00356"></a>00356
+<a name="l00358"></a>00358
+<a name="l00359"></a>00359 <span class="keyword">class </span>pipeline_proxy {
+<a name="l00360"></a>00360 <a class="code" href="a00180.html">tbb::pipeline</a> my_pipe;
+<a name="l00361"></a>00361 <span class="keyword">public</span>:
+<a name="l00362"></a>00362 pipeline_proxy( <span class="keyword">const</span> filter_t<void,void>& filter_chain );
+<a name="l00363"></a>00363 ~pipeline_proxy() {
+<a name="l00364"></a>00364 <span class="keywordflow">while</span>( filter* f = my_pipe.filter_list )
+<a name="l00365"></a>00365 <span class="keyword">delete</span> f; <span class="comment">// filter destructor removes it from the pipeline</span>
+<a name="l00366"></a>00366 }
+<a name="l00367"></a>00367 <a class="code" href="a00180.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
+<a name="l00368"></a>00368 };
+<a name="l00369"></a>00369
+<a name="l00371"></a>00371
+<a name="l00372"></a>00372 <span class="keyword">class </span>filter_node: tbb::internal::no_copy {
+<a name="l00374"></a>00374 <a class="code" href="a00143.html">tbb::atomic<intptr_t></a> ref_count;
+<a name="l00375"></a>00375 <span class="keyword">protected</span>:
+<a name="l00376"></a>00376 filter_node() {
+<a name="l00377"></a>00377 ref_count = 0;
+<a name="l00378"></a>00378 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
+<a name="l00379"></a>00379 <span class="preprocessor"></span> ++(__TBB_TEST_FILTER_NODE_COUNT);
+<a name="l00380"></a>00380 <span class="preprocessor">#endif</span>
+<a name="l00381"></a>00381 <span class="preprocessor"></span> }
+<a name="l00382"></a>00382 <span class="keyword">public</span>:
+<a name="l00384"></a>00384 <span class="keyword">virtual</span> <span class="keywordtype">void</span> add_to( pipeline& ) = 0;
+<a name="l00386"></a>00386 <span class="keywordtype">void</span> add_ref() {++ref_count;}
+<a name="l00388"></a>00388 <span class="keywordtype">void</span> remove_ref() {
+<a name="l00389"></a>00389 __TBB_ASSERT(ref_count>0,<span class="stringliteral">"ref_count underflow"</span>);
+<a name="l00390"></a>00390 <span class="keywordflow">if</span>( --ref_count==0 )
+<a name="l00391"></a>00391 <span class="keyword">delete</span> <span class="keyword">this</span>;
+<a name="l00392"></a>00392 }
+<a name="l00393"></a>00393 <span class="keyword">virtual</span> ~filter_node() {
+<a name="l00394"></a>00394 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
+<a name="l00395"></a>00395 <span class="preprocessor"></span> --(__TBB_TEST_FILTER_NODE_COUNT);
+<a name="l00396"></a>00396 <span class="preprocessor">#endif</span>
+<a name="l00397"></a>00397 <span class="preprocessor"></span> }
+<a name="l00398"></a>00398 };
+<a name="l00399"></a>00399
+<a name="l00401"></a>00401 <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="l00402"></a>00402 <span class="keyword">class </span>filter_node_leaf: <span class="keyword">public</span> filter_node {
+<a name="l00403"></a>00403 <span class="keyword">const</span> tbb::filter::mode mode;
+<a name="l00404"></a>00404 <span class="keyword">const</span> Body& body;
+<a name="l00405"></a>00405 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
+<a name="l00406"></a>00406 concrete_filter<T,U,Body>* f = <span class="keyword">new</span> concrete_filter<T,U,Body>(mode,body);
+<a name="l00407"></a>00407 p.add_filter( *f );
+<a name="l00408"></a>00408 }
+<a name="l00409"></a>00409 <span class="keyword">public</span>:
+<a name="l00410"></a>00410 filter_node_leaf( tbb::filter::mode m, <span class="keyword">const</span> Body& b ) : mode(m), body(b) {}
+<a name="l00411"></a>00411 };
+<a name="l00412"></a>00412
+<a name="l00414"></a>00414 <span class="keyword">class </span>filter_node_join: <span class="keyword">public</span> filter_node {
+<a name="l00415"></a>00415 <span class="keyword">friend</span> <span class="keyword">class </span>filter_node; <span class="comment">// to suppress GCC 3.2 warnings</span>
+<a name="l00416"></a>00416 filter_node& left;
+<a name="l00417"></a>00417 filter_node& right;
+<a name="l00418"></a>00418 <span class="comment">/*override*/</span>~filter_node_join() {
+<a name="l00419"></a>00419 left.remove_ref();
+<a name="l00420"></a>00420 right.remove_ref();
+<a name="l00421"></a>00421 }
+<a name="l00422"></a>00422 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
+<a name="l00423"></a>00423 left.add_to(p);
+<a name="l00424"></a>00424 right.add_to(p);
+<a name="l00425"></a>00425 }
+<a name="l00426"></a>00426 <span class="keyword">public</span>:
+<a name="l00427"></a>00427 filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {
+<a name="l00428"></a>00428 left.add_ref();
+<a name="l00429"></a>00429 right.add_ref();
+<a name="l00430"></a>00430 }
+<a name="l00431"></a>00431 };
+<a name="l00432"></a>00432
+<a name="l00433"></a>00433 } <span class="comment">// namespace internal</span>
+<a name="l00435"></a>00435 <span class="comment"></span>
+<a name="l00436"></a>00436 <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="l00437"></a>00437 filter_t<T,U> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
+<a name="l00438"></a>00438 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body);
+<a name="l00439"></a>00439 }
+<a name="l00440"></a>00440
+<a name="l00441"></a>00441 <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="l00442"></a>00442 filter_t<T,U> operator& (<span class="keyword">const</span> filter_t<T,V>& left, <span class="keyword">const</span> filter_t<V,U>& right) {
+<a name="l00443"></a>00443 __TBB_ASSERT(left.root,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
+<a name="l00444"></a>00444 __TBB_ASSERT(right.root,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
+<a name="l00445"></a>00445 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.root,*right.root);
+<a name="l00446"></a>00446 }
+<a name="l00447"></a>00447
+<a name="l00449"></a>00449 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00450"></a><a class="code" href="a00166.html">00450</a> <span class="keyword">class </span><a class="code" href="a00166.html">filter_t</a> {
+<a name="l00451"></a>00451 <span class="keyword">typedef</span> internal::filter_node filter_node;
+<a name="l00452"></a>00452 filter_node* root;
+<a name="l00453"></a>00453 <a class="code" href="a00166.html">filter_t</a>( filter_node* root_ ) : root(root_) {
+<a name="l00454"></a>00454 root->add_ref();
+<a name="l00455"></a>00455 }
+<a name="l00456"></a>00456 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_proxy;
+<a name="l00457"></a>00457 <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="l00458"></a>00458 <span class="keyword">friend</span> <a class="code" href="a00166.html">filter_t<T_,U_></a> make_filter(tbb::filter::mode, <span class="keyword">const</span> Body& );
+<a name="l00459"></a>00459 <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="l00460"></a>00460 <span class="keyword">friend</span> <a class="code" href="a00166.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<V_,U_></a>& );
+<a name="l00461"></a>00461 <span class="keyword">public</span>:
+<a name="l00462"></a>00462 <a class="code" href="a00166.html">filter_t</a>() : root(NULL) {}
+<a name="l00463"></a>00463 <a class="code" href="a00166.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>) {
+<a name="l00464"></a>00464 <span class="keywordflow">if</span>( root ) root->add_ref();
+<a name="l00465"></a>00465 }
+<a name="l00466"></a>00466 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00467"></a>00467 <a class="code" href="a00166.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
+<a name="l00468"></a>00468 root( <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body) ) {
+<a name="l00469"></a>00469 root->add_ref();
+<a name="l00470"></a>00470 }
+<a name="l00471"></a>00471
+<a name="l00472"></a>00472 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<T,U></a>& rhs ) {
+<a name="l00473"></a>00473 <span class="comment">// Order of operations below carefully chosen so that reference counts remain correct</span>
+<a name="l00474"></a>00474 <span class="comment">// in unlikely event that remove_ref throws exception.</span>
+<a name="l00475"></a>00475 filter_node* old = root;
+<a name="l00476"></a>00476 root = rhs.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>;
+<a name="l00477"></a>00477 <span class="keywordflow">if</span>( root ) root->add_ref();
+<a name="l00478"></a>00478 <span class="keywordflow">if</span>( old ) old->remove_ref();
+<a name="l00479"></a>00479 }
+<a name="l00480"></a>00480 ~<a class="code" href="a00166.html">filter_t</a>() {
+<a name="l00481"></a>00481 <span class="keywordflow">if</span>( root ) root->remove_ref();
+<a name="l00482"></a>00482 }
+<a name="l00483"></a>00483 <span class="keywordtype">void</span> clear() {
+<a name="l00484"></a>00484 <span class="comment">// Like operator= with filter_t() on right side.</span>
+<a name="l00485"></a>00485 <span class="keywordflow">if</span>( root ) {
+<a name="l00486"></a>00486 filter_node* old = root;
+<a name="l00487"></a>00487 root = NULL;
+<a name="l00488"></a>00488 old->remove_ref();
+<a name="l00489"></a>00489 }
+<a name="l00490"></a>00490 }
+<a name="l00491"></a>00491 };
+<a name="l00492"></a>00492
+<a name="l00493"></a>00493 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
+<a name="l00494"></a>00494 __TBB_ASSERT( filter_chain.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span> );
+<a name="l00495"></a>00495 filter_chain.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>->add_to(my_pipe);
+<a name="l00496"></a>00496 }
+<a name="l00497"></a>00497
+<a name="l00498"></a>00498 <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="a00166.html">filter_t<void,void></a>& filter_chain
+<a name="l00499"></a>00499 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00500"></a>00500 , <a class="code" href="a00201.html">tbb::task_group_context</a>& context
+<a name="l00501"></a>00501 #endif
+<a name="l00502"></a>00502 ) {
+<a name="l00503"></a>00503 internal::pipeline_proxy pipe(filter_chain);
+<a name="l00504"></a>00504 <span class="comment">// tbb::pipeline::run() is called via the proxy</span>
+<a name="l00505"></a>00505 pipe->run(max_number_of_live_tokens
+<a name="l00506"></a>00506 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00507"></a>00507 , context
+<a name="l00508"></a>00508 #endif
+<a name="l00509"></a>00509 );
+<a name="l00510"></a>00510 }
+<a name="l00511"></a>00511
+<a name="l00512"></a>00512 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00513"></a>00513 <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="l00514"></a>00514 <a class="code" href="a00201.html">tbb::task_group_context</a> context;
+<a name="l00515"></a>00515 parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
+<a name="l00516"></a>00516 }
+<a name="l00517"></a>00517 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00518"></a>00518 <span class="preprocessor"></span>
+<a name="l00519"></a>00519 } <span class="comment">// interface5</span>
+<a name="l00520"></a>00520
+<a name="l00521"></a>00521 <span class="keyword">using</span> interface5::flow_control;
+<a name="l00522"></a>00522 <span class="keyword">using</span> interface5::filter_t;
+<a name="l00523"></a>00523 <span class="keyword">using</span> interface5::make_filter;
+<a name="l00524"></a>00524 <span class="keyword">using</span> interface5::parallel_pipeline;
+<a name="l00525"></a>00525
+<a name="l00526"></a>00526 } <span class="comment">// tbb</span>
+<a name="l00527"></a>00527
+<a name="l00528"></a>00528 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_pipeline_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00420.html b/doc/html/a00420.html
new file mode 100644
index 0000000..5fb5d30
--- /dev/null
+++ b/doc/html/a00420.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>queuing_mutex.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>queuing_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_mutex_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00040"></a>00040
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
+<a name="l00042"></a>00042
+<a name="l00044"></a>00044
+<a name="l00045"></a><a class="code" href="a00182.html">00045</a> <span class="keyword">class </span><a class="code" href="a00182.html">queuing_mutex</a> {
+<a name="l00046"></a>00046 <span class="keyword">public</span>:
+<a name="l00048"></a><a class="code" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00182.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="a00183.html">00058</a> <span class="keyword">class </span><a class="code" href="a00183.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="a00172.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="a00183.html#db0fa3967491014572e24d6607bdc971">00069</a> <a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
+<a name="l00070"></a>00070
+<a name="l00072"></a><a class="code" href="a00183.html#9b51ef972f5618ac17caadb58841ab6d">00072</a> <a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m ) {
+<a name="l00073"></a>00073 initialize();
+<a name="l00074"></a>00074 <a class="code" href="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
+<a name="l00075"></a>00075 }
+<a name="l00076"></a>00076
+<a name="l00078"></a><a class="code" href="a00183.html#ac2c576a93570957d694192a5f491443">00078</a> <a class="code" href="a00183.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
+<a name="l00079"></a>00079 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00183.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="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00182.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="a00183.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00182.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="a00183.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="a00182.html">queuing_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
+<a name="l00094"></a>00094
+<a name="l00096"></a>00096 <a class="code" href="a00183.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="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="a00143.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00116"></a>00116
+<a name="l00117"></a>00117 };
+<a name="l00118"></a>00118
+<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
+<a name="l00120"></a>00120
+<a name="l00121"></a>00121 } <span class="comment">// namespace tbb</span>
+<a name="l00122"></a>00122
+<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00421.html b/doc/html/a00421.html
new file mode 100644
index 0000000..e997a39
--- /dev/null
+++ b/doc/html/a00421.html
@@ -0,0 +1,168 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>queuing_rw_mutex.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>queuing_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_rw_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_rw_mutex_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00040"></a>00040
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
+<a name="l00042"></a>00042
+<a name="l00044"></a>00044
+<a name="l00047"></a><a class="code" href="a00184.html">00047</a> <span class="keyword">class </span><a class="code" href="a00184.html">queuing_rw_mutex</a> {
+<a name="l00048"></a>00048 <span class="keyword">public</span>:
+<a name="l00050"></a><a class="code" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00184.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="a00184.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00184.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="a00185.html">00070</a> <span class="keyword">class </span><a class="code" href="a00185.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="a00172.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="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a> <a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
+<a name="l00084"></a>00084
+<a name="l00086"></a><a class="code" href="a00185.html#fbb8798792d3aebb136c46fc63d2529e">00086</a> <a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00184.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="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
+<a name="l00089"></a>00089 }
+<a name="l00090"></a>00090
+<a name="l00092"></a><a class="code" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a> <a class="code" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
+<a name="l00093"></a>00093 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00185.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="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00184.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="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00184.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="a00185.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="a00185.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="a00185.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="a00184.html">queuing_rw_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
+<a name="l00115"></a>00115
+<a name="l00117"></a>00117 <a class="code" href="a00185.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="a00143.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="a00143.html">atomic<scoped_lock*></a> q_tail;
+<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="l00164"></a>00164
+<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00422.html b/doc/html/a00422.html
new file mode 100644
index 0000000..38ebc5f
--- /dev/null
+++ b/doc/html/a00422.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>reader_writer_lock.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>reader_writer_lock.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_reader_writer_lock_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_reader_writer_lock_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_thread.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00027"></a>00027
+<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>interface5 {
+<a name="l00031"></a>00031
+<a name="l00034"></a><a class="code" href="a00186.html">00034</a> <span class="keyword">class </span><a class="code" href="a00186.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="a00187.html">scoped_lock</a>;
+<a name="l00037"></a>00037 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00188.html">scoped_lock_read</a>;
+<a name="l00039"></a>00039
+<a name="l00074"></a><a class="code" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a> <span class="keyword">enum</span> <a class="code" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
+<a name="l00075"></a>00075
+<a name="l00077"></a><a class="code" href="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a> <a class="code" href="a00186.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="a00186.html#5135f64f7b7339017f33d956445edbee">00082</a> <a class="code" href="a00186.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="a00187.html">00089</a> <span class="keyword">class </span><a class="code" href="a00187.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="a00186.html">reader_writer_lock</a>;
+<a name="l00092"></a>00092
+<a name="l00094"></a><a class="code" href="a00187.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a> <a class="code" href="a00187.html">scoped_lock</a>(<a class="code" href="a00186.html">reader_writer_lock</a>& <a class="code" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
+<a name="l00095"></a>00095 internal_construct(<a class="code" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
+<a name="l00096"></a>00096 }
+<a name="l00097"></a>00097
+<a name="l00099"></a><a class="code" href="a00187.html#70246e0260493625ff956fa5926fc71f">00099</a> <a class="code" href="a00187.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="a00186.html">reader_writer_lock</a> *<a class="code" href="a00172.html">mutex</a>;
+<a name="l00114"></a>00114 scoped_lock* next;
+<a name="l00116"></a>00116 <a class="code" href="a00143.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="a00186.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="a00188.html">00126</a> <span class="keyword">class </span><a class="code" href="a00188.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="a00186.html">reader_writer_lock</a>;
+<a name="l00129"></a>00129
+<a name="l00131"></a><a class="code" href="a00188.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a> <a class="code" href="a00188.html">scoped_lock_read</a>(<a class="code" href="a00186.html">reader_writer_lock</a>& <a class="code" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
+<a name="l00132"></a>00132 internal_construct(<a class="code" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
+<a name="l00133"></a>00133 }
+<a name="l00134"></a>00134
+<a name="l00136"></a><a class="code" href="a00188.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a> <a class="code" href="a00188.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="a00186.html">reader_writer_lock</a> *<a class="code" href="a00172.html">mutex</a>;
+<a name="l00151"></a>00151 scoped_lock_read *next;
+<a name="l00153"></a>00153 <a class="code" href="a00143.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="a00186.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="a00186.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="a00186.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="a00186.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="a00186.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="a00186.html#5113b32689305599b2c36b5831547704">unlock</a>();
+<a name="l00191"></a>00191
+<a name="l00192"></a>00192 <span class="keyword">private</span>:
+<a name="l00193"></a>00193 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00194"></a>00194 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
+<a name="l00195"></a>00195
+<a name="l00197"></a>00197
+<a name="l00198"></a>00198 <span class="keywordtype">bool</span> start_write(scoped_lock *);
+<a name="l00200"></a>00200 <span class="keywordtype">void</span> set_next_writer(scoped_lock *w);
+<a name="l00202"></a>00202 <span class="keywordtype">void</span> end_write(scoped_lock *);
+<a name="l00204"></a>00204 <span class="keywordtype">bool</span> is_current_writer();
+<a name="l00205"></a>00205
+<a name="l00207"></a>00207
+<a name="l00208"></a>00208 <span class="keywordtype">void</span> start_read(scoped_lock_read *);
+<a name="l00210"></a>00210 <span class="keywordtype">void</span> unblock_readers();
+<a name="l00212"></a>00212 <span class="keywordtype">void</span> end_read();
+<a name="l00213"></a>00213
+<a name="l00215"></a>00215 atomic<scoped_lock_read*> reader_head;
+<a name="l00217"></a>00217 atomic<scoped_lock*> writer_head;
+<a name="l00219"></a>00219 atomic<scoped_lock*> writer_tail;
+<a name="l00221"></a>00221 tbb_thread::id my_current_writer;
+<a name="l00223"></a>00223 atomic<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>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00423.html b/doc/html/a00423.html
new file mode 100644
index 0000000..3230f45
--- /dev/null
+++ b/doc/html/a00423.html
@@ -0,0 +1,246 @@
+<!DOCTYPE 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-2010 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 <windows.h></span>
+<a name="l00026"></a>00026 <span class="preprocessor"> #if !defined(_WIN32_WINNT)</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// The following Windows API function is declared explicitly;</span>
+<a name="l00028"></a>00028 <span class="comment">// otherwise any user would have to specify /D_WIN32_WINNT=0x0400</span>
+<a name="l00029"></a>00029 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+<a name="l00030"></a>00030 <span class="preprocessor"> #endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* if not _WIN32||_WIN64 */</span>
+<a name="l00032"></a>00032 <span class="preprocessor"> #include <pthread.h></span>
+<a name="l00033"></a>00033 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00034"></a>00034
+<a name="l00035"></a>00035 <span class="preprocessor">#include <new></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00039"></a>00039
+<a name="l00040"></a>00040 <span class="keyword">namespace </span>tbb {
+<a name="l00042"></a>00042
+<a name="l00044"></a><a class="code" href="a00189.html">00044</a> <span class="keyword">class </span><a class="code" href="a00189.html">recursive_mutex</a> {
+<a name="l00045"></a>00045 <span class="keyword">public</span>:
+<a name="l00047"></a><a class="code" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00047</a> <a class="code" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>() {
+<a name="l00048"></a>00048 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span> internal_construct();
+<a name="l00050"></a>00050 <span class="preprocessor">#else</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span> InitializeCriticalSection(&impl);
+<a name="l00053"></a>00053 <span class="preprocessor"> #else</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span> pthread_mutexattr_t mtx_attr;
+<a name="l00055"></a>00055 <span class="keywordtype">int</span> error_code = pthread_mutexattr_init( &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_mutexattr_init failed"</span>);
+<a name="l00058"></a>00058
+<a name="l00059"></a>00059 pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );
+<a name="l00060"></a>00060 error_code = pthread_mutex_init( &impl, &mtx_attr );
+<a name="l00061"></a>00061 <span class="keywordflow">if</span>( error_code )
+<a name="l00062"></a>00062 tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutex_init failed"</span>);
+<a name="l00063"></a>00063
+<a name="l00064"></a>00064 pthread_mutexattr_destroy( &mtx_attr );
+<a name="l00065"></a>00065 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
+<a name="l00066"></a>00066 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00067"></a>00067 };
+<a name="l00068"></a>00068
+<a name="l00069"></a>00069 ~<a class="code" href="a00189.html">recursive_mutex</a>() {
+<a name="l00070"></a>00070 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span> internal_destroy();
+<a name="l00072"></a>00072 <span class="preprocessor">#else</span>
+<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span> DeleteCriticalSection(&impl);
+<a name="l00075"></a>00075 <span class="preprocessor"> #else</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span> pthread_mutex_destroy(&impl);
+<a name="l00077"></a>00077
+<a name="l00078"></a>00078 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00079"></a>00079 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00080"></a>00080 };
+<a name="l00081"></a>00081
+<a name="l00082"></a>00082 <span class="keyword">class </span>scoped_lock;
+<a name="l00083"></a>00083 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
+<a name="l00084"></a>00084
+<a name="l00086"></a>00086
+<a name="l00088"></a><a class="code" href="a00190.html">00088</a> <span class="keyword">class </span><a class="code" href="a00190.html">scoped_lock</a>: internal::no_copy {
+<a name="l00089"></a>00089 <span class="keyword">public</span>:
+<a name="l00091"></a><a class="code" href="a00190.html#d82d4d36fbf9727a493d26ae50855fe7">00091</a> <a class="code" href="a00190.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
+<a name="l00092"></a>00092
+<a name="l00094"></a><a class="code" href="a00190.html#dec17713c4c1321ac8fec66816d0c602">00094</a> <a class="code" href="a00190.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00189.html">recursive_mutex</a>& <a class="code" href="a00172.html">mutex</a> ) {
+<a name="l00095"></a>00095 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span> my_mutex = &mutex;
+<a name="l00097"></a>00097 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00098"></a>00098 <a class="code" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
+<a name="l00099"></a>00099 }
+<a name="l00100"></a>00100
+<a name="l00102"></a><a class="code" href="a00190.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00102</a> <a class="code" href="a00190.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>() {
+<a name="l00103"></a>00103 <span class="keywordflow">if</span>( my_mutex )
+<a name="l00104"></a>00104 <a class="code" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
+<a name="l00105"></a>00105 }
+<a name="l00106"></a>00106
+<a name="l00108"></a><a class="code" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">00108</a> <span class="keywordtype">void</span> <a class="code" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00189.html">recursive_mutex</a>& <a class="code" href="a00172.html">mutex</a> ) {
+<a name="l00109"></a>00109 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span> internal_acquire( mutex );
+<a name="l00111"></a>00111 <span class="preprocessor">#else</span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span> my_mutex = &mutex;
+<a name="l00113"></a>00113 mutex.<a class="code" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>();
+<a name="l00114"></a>00114 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00115"></a>00115 }
+<a name="l00116"></a>00116
+<a name="l00118"></a><a class="code" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">00118</a> <span class="keywordtype">bool</span> <a class="code" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00189.html">recursive_mutex</a>& <a class="code" href="a00172.html">mutex</a> ) {
+<a name="l00119"></a>00119 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal_try_acquire( mutex );
+<a name="l00121"></a>00121 <span class="preprocessor">#else</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00189.html#86e719b0afee25704af11ab97694d240">try_lock</a>();
+<a name="l00123"></a>00123 <span class="keywordflow">if</span>( result )
+<a name="l00124"></a>00124 my_mutex = &mutex;
+<a name="l00125"></a>00125 <span class="keywordflow">return</span> result;
+<a name="l00126"></a>00126 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00127"></a>00127 }
+<a name="l00128"></a>00128
+<a name="l00130"></a><a class="code" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>() {
+<a name="l00131"></a>00131 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00132"></a>00132 <span class="preprocessor"></span> internal_release();
+<a name="l00133"></a>00133 <span class="preprocessor">#else</span>
+<a name="l00134"></a>00134 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>();
+<a name="l00135"></a>00135 my_mutex = NULL;
+<a name="l00136"></a>00136 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00137"></a>00137 }
+<a name="l00138"></a>00138
+<a name="l00139"></a>00139 <span class="keyword">private</span>:
+<a name="l00141"></a>00141 <a class="code" href="a00189.html">recursive_mutex</a>* my_mutex;
+<a name="l00142"></a>00142
+<a name="l00144"></a>00144 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00189.html">recursive_mutex</a>& m );
+<a name="l00145"></a>00145
+<a name="l00147"></a>00147 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00189.html">recursive_mutex</a>& m );
+<a name="l00148"></a>00148
+<a name="l00150"></a>00150 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
+<a name="l00151"></a>00151
+<a name="l00152"></a>00152 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00189.html">recursive_mutex</a>;
+<a name="l00153"></a>00153 };
+<a name="l00154"></a>00154
+<a name="l00155"></a>00155 <span class="comment">// Mutex traits</span>
+<a name="l00156"></a>00156 <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="l00157"></a>00157 <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="l00158"></a>00158 <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="l00159"></a>00159
+<a name="l00160"></a>00160 <span class="comment">// C++0x compatibility interface</span>
+<a name="l00161"></a>00161
+<a name="l00163"></a><a class="code" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">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="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00166"></a>00166 <span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00190.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00167"></a>00167 <span class="preprocessor">#else</span>
+<a name="l00168"></a>00168 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00169"></a>00169 <span class="preprocessor"></span> EnterCriticalSection(&impl);
+<a name="l00170"></a>00170 <span class="preprocessor"> #else</span>
+<a name="l00171"></a>00171 <span class="preprocessor"></span> pthread_mutex_lock(&impl);
+<a name="l00172"></a>00172 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00173"></a>00173 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00174"></a>00174 }
+<a name="l00175"></a>00175
+<a name="l00177"></a>00177
+<a name="l00178"></a><a class="code" href="a00189.html#86e719b0afee25704af11ab97694d240">00178</a> <span class="keywordtype">bool</span> <a class="code" href="a00189.html#86e719b0afee25704af11ab97694d240">try_lock</a>() {
+<a name="l00179"></a>00179 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00181"></a>00181 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00190.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
+<a name="l00182"></a>00182 <span class="preprocessor">#else </span>
+<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
+<a name="l00185"></a>00185 <span class="preprocessor"> #else</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
+<a name="l00187"></a>00187 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</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="l00190"></a>00190
+<a name="l00192"></a><a class="code" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">00192</a> <span class="keywordtype">void</span> <a class="code" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>() {
+<a name="l00193"></a>00193 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00195"></a>00195 <a class="code" href="a00190.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00196"></a>00196 s.<a class="code" href="a00190.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00197"></a>00197 s.<a class="code" href="a00190.html#43ed37cec508072e53a52113c8040137">internal_release</a>();
+<a name="l00198"></a>00198 <span class="preprocessor">#else</span>
+<a name="l00199"></a>00199 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span> LeaveCriticalSection(&impl);
+<a name="l00201"></a>00201 <span class="preprocessor"> #else</span>
+<a name="l00202"></a>00202 <span class="preprocessor"></span> pthread_mutex_unlock(&impl);
+<a name="l00203"></a>00203 <span class="preprocessor"> #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00204"></a>00204 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00205"></a>00205 }
+<a name="l00206"></a>00206
+<a name="l00208"></a>00208 <span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00209"></a><a class="code" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">00209</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
+<a name="l00210"></a>00210 <span class="preprocessor"> #else</span>
+<a name="l00211"></a>00211 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
+<a name="l00212"></a>00212 <span class="preprocessor"> #endif</span>
+<a name="l00213"></a>00213 <span class="preprocessor"></span> <a class="code" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>) &impl; }
+<a name="l00214"></a>00214
+<a name="l00215"></a>00215 <span class="keyword">private</span>:
+<a name="l00216"></a>00216 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span> CRITICAL_SECTION impl;
+<a name="l00218"></a>00218 <span class="keyword">enum</span> state_t {
+<a name="l00219"></a>00219 INITIALIZED=0x1234,
+<a name="l00220"></a>00220 DESTROYED=0x789A,
+<a name="l00221"></a>00221 } state;
+<a name="l00222"></a>00222 <span class="preprocessor">#else</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span> pthread_mutex_t impl;
+<a name="l00224"></a>00224 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00225"></a>00225
+<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00228"></a>00228
+<a name="l00230"></a>00230 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
+<a name="l00231"></a>00231 };
+<a name="l00232"></a>00232
+<a name="l00233"></a>00233 __TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)
+<a name="l00234"></a>00234
+<a name="l00235"></a>00235 } <span class="comment">// namespace tbb </span>
+<a name="l00236"></a>00236
+<a name="l00237"></a>00237 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_recursive_mutex_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00364.html b/doc/html/a00424.html
similarity index 89%
copy from doc/html/a00364.html
copy to doc/html/a00424.html
index aa6817f..213525b 100644
--- a/doc/html/a00364.html
+++ b/doc/html/a00424.html
@@ -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>scalable_allocator.h</h1><a href="a00218.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>scalable_allocator.h</h1><a href="a00248.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-2010 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>
@@ -59,23 +59,23 @@
<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="a00243.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
+<a name="l00044"></a>00044 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
+<a name="l00052"></a>00052 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
+<a name="l00056"></a>00056 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
+<a name="l00060"></a>00060 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
+<a name="l00064"></a>00064 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
+<a name="l00068"></a>00068 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00072"></a>00072 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00276.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="a00243.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00078"></a>00078 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00276.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>
@@ -105,7 +105,7 @@
<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="a00166.html">00111</a> <span class="keyword">class </span><a class="code" href="a00166.html">scalable_allocator</a> {
+<a name="l00111"></a><a class="code" href="a00191.html">00111</a> <span class="keyword">class </span><a class="code" href="a00191.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;
@@ -115,25 +115,25 @@
<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="a00166.html">scalable_allocator<U></a> other;
+<a name="l00121"></a>00121 <span class="keyword">typedef</span> <a class="code" href="a00191.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="a00166.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00125"></a>00125 <a class="code" href="a00166.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00166.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="a00166.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00166.html">scalable_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00124"></a>00124 <a class="code" href="a00191.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00125"></a>00125 <a class="code" href="a00191.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00191.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="a00191.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00191.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="a00166.html#726b1586d05d44665a36e1c7b2699bfd">00132</a> pointer <a class="code" href="a00166.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="a00243.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
+<a name="l00132"></a><a class="code" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">00132</a> pointer <a class="code" href="a00191.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="a00276.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="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
-<a name="l00138"></a>00138 <a class="code" href="a00243.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
+<a name="l00137"></a><a class="code" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
+<a name="l00138"></a>00138 <a class="code" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140
-<a name="l00142"></a><a class="code" href="a00166.html#880e766f1d913988c21973dbdd874fd5">00142</a> size_type <a class="code" href="a00166.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
+<a name="l00142"></a><a class="code" href="a00191.html#880e766f1d913988c21973dbdd874fd5">00142</a> size_type <a class="code" href="a00191.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 }
@@ -147,18 +147,18 @@
<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="a00167.html">00157</a> <span class="keyword">class </span><a class="code" href="a00166.html">scalable_allocator</a><void> {
+<a name="l00157"></a><a class="code" href="a00192.html">00157</a> <span class="keyword">class </span><a class="code" href="a00191.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="a00166.html">scalable_allocator<U></a> other;
+<a name="l00163"></a>00163 <span class="keyword">typedef</span> <a class="code" href="a00191.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="a00166.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00166.html">scalable_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<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="a00191.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00191.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>;}
@@ -190,7 +190,7 @@
<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-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00365.html b/doc/html/a00425.html
similarity index 81%
copy from doc/html/a00365.html
copy to doc/html/a00425.html
index 10c360e..49e79a1 100644
--- a/doc/html/a00365.html
+++ b/doc/html/a00425.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="a00169.html">00039</a> <span class="keyword">class </span><a class="code" href="a00169.html">spin_mutex</a> {
+<a name="l00039"></a><a class="code" href="a00194.html">00039</a> <span class="keyword">class </span><a class="code" href="a00194.html">spin_mutex</a> {
<a name="l00041"></a>00041 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> 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="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a> <a class="code" href="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>() : flag(0) {
+<a name="l00046"></a><a class="code" href="a00194.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a> <a class="code" href="a00194.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="a00170.html">00053</a> <span class="keyword">class </span><a class="code" href="a00170.html">scoped_lock</a> : internal::no_copy {
+<a name="l00053"></a><a class="code" href="a00195.html">00053</a> <span class="keyword">class </span><a class="code" href="a00195.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="a00169.html">spin_mutex</a>* my_mutex;
+<a name="l00056"></a>00056 <a class="code" href="a00194.html">spin_mutex</a>* my_mutex;
<a name="l00057"></a>00057
-<a name="l00059"></a>00059 internal::uintptr my_unlock_value;
+<a name="l00059"></a>00059 uintptr_t 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="a00169.html">spin_mutex</a>& m );
+<a name="l00062"></a>00062 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00194.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="a00169.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="a00194.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="a00169.html">spin_mutex</a>;
+<a name="l00070"></a>00070 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00194.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="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a> <a class="code" href="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>() : my_mutex(NULL), my_unlock_value(0) {}
+<a name="l00074"></a><a class="code" href="a00195.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a> <a class="code" href="a00195.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="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a> <a class="code" href="a00170.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00169.html">spin_mutex</a>& m ) {
+<a name="l00077"></a><a class="code" href="a00195.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a> <a class="code" href="a00195.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00194.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="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>);
+<a name="l00082"></a>00082 <span class="preprocessor"></span> my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00194.html#81b0b05fb71280ce0c79708e82569d86">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="a00170.html#3ee3c338732b1f64b0b32a757807a30d">00088</a> <span class="keywordtype">void</span> <a class="code" href="a00170.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00169.html">spin_mutex</a>& m ) {
+<a name="l00088"></a><a class="code" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">00088</a> <span class="keywordtype">void</span> <a class="code" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00194.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="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>);
+<a name="l00092"></a>00092 <span class="preprocessor"></span> my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00194.html#81b0b05fb71280ce0c79708e82569d86">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="a00170.html#9297ec188534b45dc0ca48f2f39a0501">00099</a> <span class="keywordtype">bool</span> <a class="code" href="a00170.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00169.html">spin_mutex</a>& m ) {
+<a name="l00099"></a><a class="code" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">00099</a> <span class="keywordtype">bool</span> <a class="code" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00194.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="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>);
+<a name="l00103"></a>00103 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = __TBB_TryLockByte(m.<a class="code" href="a00194.html#81b0b05fb71280ce0c79708e82569d86">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="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>() {
+<a name="l00113"></a><a class="code" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00195.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_store_with_release(my_mutex-><a class="code" href="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>, static_cast<unsigned char>(my_unlock_value));
+<a name="l00117"></a>00117 <span class="preprocessor"></span> __TBB_store_with_release(my_mutex-><a class="code" href="a00194.html#81b0b05fb71280ce0c79708e82569d86">flag</a>, static_cast<unsigned char>(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="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a> <a class="code" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>() {
+<a name="l00123"></a><a class="code" href="a00195.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a> <a class="code" href="a00195.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_store_with_release(my_mutex-><a class="code" href="a00169.html#81b0b05fb71280ce0c79708e82569d86">flag</a>, static_cast<unsigned char>(my_unlock_value));
+<a name="l00128"></a>00128 <span class="preprocessor"></span> __TBB_store_with_release(my_mutex-><a class="code" href="a00194.html#81b0b05fb71280ce0c79708e82569d86">flag</a>, static_cast<unsigned char>(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="a00169.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00169.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>() {
+<a name="l00144"></a><a class="code" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00194.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="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00170.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00146"></a>00146 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00195.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="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>() {
+<a name="l00155"></a><a class="code" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00194.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="a00121.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="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00170.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="a00142.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="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00195.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="a00169.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00169.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>() {
+<a name="l00165"></a><a class="code" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00194.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="a00121.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00168"></a>00168 <a class="code" href="a00170.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00169"></a>00169 s.<a class="code" href="a00170.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00170"></a>00170 s.<a class="code" href="a00170.html#0821c9dc231cd41586306fd54f701873">my_unlock_value</a> = 0;
-<a name="l00171"></a>00171 s.<a class="code" href="a00170.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
+<a name="l00167"></a>00167 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00168"></a>00168 <a class="code" href="a00195.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00169"></a>00169 s.<a class="code" href="a00195.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00170"></a>00170 s.<a class="code" href="a00195.html#43a6f8977cd1ed2752f417f3ad9fc4af">my_unlock_value</a> = 0;
+<a name="l00171"></a>00171 s.<a class="code" href="a00195.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>
@@ -183,7 +183,7 @@
<a name="l00184"></a>00184 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_mutex_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00366.html b/doc/html/a00426.html
similarity index 56%
copy from doc/html/a00366.html
copy to doc/html/a00426.html
index 2443c51..a3161d8 100644
--- a/doc/html/a00366.html
+++ b/doc/html/a00426.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="a00171.html">00035</a> <span class="keyword">class </span><a class="code" href="a00171.html">spin_rw_mutex_v3</a> {
+<a name="l00035"></a><a class="code" href="a00196.html">00035</a> <span class="keyword">class </span><a class="code" href="a00196.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,143 +73,142 @@
<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="a00171.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00171.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>() : state(0) {
+<a name="l00067"></a><a class="code" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00196.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="a00171.html#9a815fb2759e55072ed413f1b6970cf3">00075</a> <span class="preprocessor"> ~spin_rw_mutex_v3() {</span>
+<a name="l00075"></a><a class="code" href="a00196.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="a00172.html">00083</a> <span class="keyword">class </span><a class="code" href="a00172.html">scoped_lock</a> : internal::no_copy {
+<a name="l00083"></a><a class="code" href="a00197.html">00083</a> <span class="keyword">class </span><a class="code" href="a00197.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="a00172.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00172.html">scoped_lock</a>() : <a class="code" href="a00150.html">mutex</a>(NULL), is_writer(false) {}
+<a name="l00087"></a><a class="code" href="a00197.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00197.html">scoped_lock</a>() : <a class="code" href="a00172.html">mutex</a>(NULL), is_writer(false) {}
<a name="l00088"></a>00088
-<a name="l00090"></a>00090
-<a name="l00091"></a><a class="code" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">00091</a> <a class="code" href="a00172.html">scoped_lock</a>( <a class="code" href="a00171.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00150.html">mutex</a>(NULL) {
-<a name="l00092"></a>00092 <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00096</a> ~<a class="code" href="a00172.html">scoped_lock</a>() {
-<a name="l00097"></a>00097 <span class="keywordflow">if</span>( <a class="code" href="a00150.html">mutex</a> ) <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l00098"></a>00098 }
-<a name="l00099"></a>00099
-<a name="l00101"></a><a class="code" href="a00172.html#b0b646ec5be02a127d159bbb7ca65353">00101</a> <span class="keywordtype">void</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00171.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00102"></a>00102 __TBB_ASSERT( !<a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00103"></a>00103 is_writer = write;
-<a name="l00104"></a>00104 <a class="code" href="a00150.html">mutex</a> = &m;
-<a name="l00105"></a>00105 <span class="keywordflow">if</span>( write ) <a class="code" href="a00150.html">mutex</a>->internal_acquire_writer();
-<a name="l00106"></a>00106 <span class="keywordflow">else</span> <a class="code" href="a00150.html">mutex</a>->internal_acquire_reader();
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108
-<a name="l00110"></a>00110
-<a name="l00111"></a><a class="code" href="a00172.html#3f0b1e3f2efab63336400348bd070226">00111</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
-<a name="l00112"></a>00112 __TBB_ASSERT( <a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00113"></a>00113 __TBB_ASSERT( !is_writer, <span class="stringliteral">"not a reader"</span> );
-<a name="l00114"></a>00114 is_writer = <span class="keyword">true</span>;
-<a name="l00115"></a>00115 <span class="keywordflow">return</span> <a class="code" href="a00150.html">mutex</a>->internal_upgrade();
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00119"></a><a class="code" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">00119</a> <span class="keywordtype">void</span> <a class="code" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00120"></a>00120 __TBB_ASSERT( <a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00121"></a>00121 <a class="code" href="a00171.html">spin_rw_mutex</a> *m = <a class="code" href="a00150.html">mutex</a>;
-<a name="l00122"></a>00122 <a class="code" href="a00150.html">mutex</a> = NULL;
-<a name="l00123"></a>00123 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) m->internal_release_writer();
-<a name="l00125"></a>00125 <span class="keywordflow">else</span> m->internal_release_reader();
-<a name="l00126"></a>00126 <span class="preprocessor">#else</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00171.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
-<a name="l00128"></a>00128 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00171.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
-<a name="l00129"></a>00129 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131
-<a name="l00133"></a><a class="code" href="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">00133</a> <span class="keywordtype">bool</span> downgrade_to_reader() {
-<a name="l00134"></a>00134 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span> __TBB_ASSERT( <a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00136"></a>00136 __TBB_ASSERT( is_writer, <span class="stringliteral">"not a writer"</span> );
-<a name="l00137"></a>00137 <a class="code" href="a00150.html">mutex</a>->internal_downgrade();
-<a name="l00138"></a>00138 <span class="preprocessor">#else</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span> __TBB_FetchAndAddW( &<a class="code" href="a00150.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
-<a name="l00140"></a>00140 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00141"></a>00141 is_writer = <span class="keyword">false</span>;
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145
-<a name="l00147"></a><a class="code" href="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">00147</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00171.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00148"></a>00148 __TBB_ASSERT( !<a class="code" href="a00150.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00149"></a>00149 <span class="keywordtype">bool</span> result;
-<a name="l00150"></a>00150 is_writer = write;
-<a name="l00151"></a>00151 result = write? m.internal_try_acquire_writer()
-<a name="l00152"></a>00152 : m.internal_try_acquire_reader();
-<a name="l00153"></a>00153 <span class="keywordflow">if</span>( result )
-<a name="l00154"></a>00154 <a class="code" href="a00150.html">mutex</a> = &m;
-<a name="l00155"></a>00155 <span class="keywordflow">return</span> result;
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keyword">private</span>:
-<a name="l00160"></a>00160 <a class="code" href="a00171.html">spin_rw_mutex</a>* <a class="code" href="a00150.html">mutex</a>;
-<a name="l00161"></a>00161
-<a name="l00163"></a>00163
-<a name="l00164"></a>00164 <span class="keywordtype">bool</span> is_writer;
-<a name="l00165"></a>00165 };
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 <span class="comment">// Mutex traits</span>
-<a name="l00168"></a>00168 <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="l00169"></a>00169 <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="l00170"></a>00170 <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="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00173"></a>00173
-<a name="l00175"></a><a class="code" href="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">00175</a> <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
-<a name="l00176"></a>00176
-<a name="l00178"></a>00178
-<a name="l00179"></a><a class="code" href="a00171.html#088bb256be794cc47d3b83791632fdfc">00179</a> <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
-<a name="l00180"></a>00180
-<a name="l00182"></a><a class="code" href="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">00182</a> <span class="keywordtype">void</span> unlock() {
-<a name="l00183"></a>00183 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) internal_release_writer();
-<a name="l00185"></a>00185 <span class="keywordflow">else</span> internal_release_reader();
-<a name="l00186"></a>00186 <span class="preprocessor">#else</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) __TBB_AtomicAND( &state, READERS );
-<a name="l00188"></a>00188 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);
-<a name="l00189"></a>00189 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="comment">// Methods for reader locks that resemble ISO C++0x compatibility methods.</span>
-<a name="l00193"></a>00193
-<a name="l00195"></a><a class="code" href="a00171.html#13f799708ac4ca437a16be202e263e18">00195</a> <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
-<a name="l00196"></a>00196
-<a name="l00198"></a>00198
-<a name="l00199"></a><a class="code" href="a00171.html#b8667415869013f840d976aa406d385a">00199</a> <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="keyword">private</span>:
-<a name="l00202"></a>00202 <span class="keyword">typedef</span> intptr_t state_t;
-<a name="l00203"></a>00203 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER = 1;
-<a name="l00204"></a>00204 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER_PENDING = 2;
-<a name="l00205"></a>00205 <span class="keyword">static</span> <span class="keyword">const</span> state_t READERS = ~(WRITER | WRITER_PENDING);
-<a name="l00206"></a>00206 <span class="keyword">static</span> <span class="keyword">const</span> state_t ONE_READER = 4;
-<a name="l00207"></a>00207 <span class="keyword">static</span> <span class="keyword">const</span> state_t BUSY = WRITER | READERS;
-<a name="l00209"></a>00209
-<a name="l00212"></a>00212 state_t state;
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00215"></a>00215 };
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 __TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)
-<a name="l00218"></a>00218
-<a name="l00219"></a>00219 } <span class="comment">// namespace tbb</span>
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_rw_mutex_H */</span>
+<a name="l00090"></a><a class="code" href="a00197.html#42a92d4f8fdde425b111cfa8a9228071">00090</a> <a class="code" href="a00197.html">scoped_lock</a>( <a class="code" href="a00196.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00172.html">mutex</a>(NULL) {
+<a name="l00091"></a>00091 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
+<a name="l00092"></a>00092 }
+<a name="l00093"></a>00093
+<a name="l00095"></a><a class="code" href="a00197.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a> <a class="code" href="a00187.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
+<a name="l00096"></a>00096 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
+<a name="l00097"></a>00097 }
+<a name="l00098"></a>00098
+<a name="l00100"></a><a class="code" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00196.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="a00172.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="a00172.html">mutex</a> = &m;
+<a name="l00104"></a>00104 <span class="keywordflow">if</span>( write ) <a class="code" href="a00172.html">mutex</a>->internal_acquire_writer();
+<a name="l00105"></a>00105 <span class="keywordflow">else</span> <a class="code" href="a00172.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="a00197.html#3f0b1e3f2efab63336400348bd070226">00110</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
+<a name="l00111"></a>00111 __TBB_ASSERT( <a class="code" href="a00172.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="a00172.html">mutex</a>->internal_upgrade();
+<a name="l00115"></a>00115 }
+<a name="l00116"></a>00116
+<a name="l00118"></a><a class="code" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">00118</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
+<a name="l00119"></a>00119 __TBB_ASSERT( <a class="code" href="a00172.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00120"></a>00120 <a class="code" href="a00196.html">spin_rw_mutex</a> *m = <a class="code" href="a00172.html">mutex</a>;
+<a name="l00121"></a>00121 <a class="code" href="a00172.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="a00196.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
+<a name="l00127"></a>00127 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00196.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="a00197.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="a00172.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="a00172.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="a00172.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="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">00146</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00196.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="a00172.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="a00172.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">private</span>:
+<a name="l00159"></a>00159 <a class="code" href="a00196.html">spin_rw_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
+<a name="l00160"></a>00160
+<a name="l00162"></a>00162
+<a name="l00163"></a>00163 <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>
+<a name="l00167"></a>00167 <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="l00168"></a>00168 <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="l00169"></a>00169 <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="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="a00196.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="a00196.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="a00196.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();
+<a name="l00185"></a>00185 <span class="preprocessor">#else</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) __TBB_AtomicAND( &state, READERS );
+<a name="l00187"></a>00187 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);
+<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
+<a name="l00189"></a>00189 }
+<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="a00196.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="a00196.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;
+<a name="l00202"></a>00202 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER = 1;
+<a name="l00203"></a>00203 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER_PENDING = 2;
+<a name="l00204"></a>00204 <span class="keyword">static</span> <span class="keyword">const</span> state_t READERS = ~(WRITER | WRITER_PENDING);
+<a name="l00205"></a>00205 <span class="keyword">static</span> <span class="keyword">const</span> state_t ONE_READER = 4;
+<a name="l00206"></a>00206 <span class="keyword">static</span> <span class="keyword">const</span> state_t BUSY = WRITER | READERS;
+<a name="l00208"></a>00208
+<a name="l00211"></a>00211 state_t state;
+<a name="l00212"></a>00212
+<a name="l00213"></a>00213 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00214"></a>00214 };
+<a name="l00215"></a>00215
+<a name="l00216"></a>00216 __TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)
+<a name="l00217"></a>00217
+<a name="l00218"></a>00218 } <span class="comment">// namespace tbb</span>
+<a name="l00219"></a>00219
+<a name="l00220"></a>00220 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_rw_mutex_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00427.html b/doc/html/a00427.html
new file mode 100644
index 0000000..55ea6c0
--- /dev/null
+++ b/doc/html/a00427.html
@@ -0,0 +1,656 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>task.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>task.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
+<a name="l00026"></a>00026
+<a name="l00027"></a>00027 <span class="keyword">typedef</span> <span class="keyword">struct </span>___itt_caller *__itt_caller;
+<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 <span class="keyword">class </span>task;
+<a name="l00032"></a>00032 <span class="keyword">class </span>task_list;
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="keyword">class </span>task_group_context;
+<a name="l00036"></a>00036 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038 <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">// privately in task_base and made public in class task via a using declaration.</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS public</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS private</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="keyword">namespace </span>internal {
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048 <span class="keyword">class </span>allocate_additional_child_of_proxy: no_assign {
+<a name="l00050"></a>00050 task* <span class="keyword">self</span>;
+<a name="l00051"></a>00051 task& parent;
+<a name="l00052"></a>00052 <span class="keyword">public</span>:
+<a name="l00053"></a>00053 <span class="keyword">explicit</span> allocate_additional_child_of_proxy( task& parent_ ) : self(NULL), parent(parent_) {}
+<a name="l00054"></a>00054 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
+<a name="l00055"></a>00055 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
+<a name="l00056"></a>00056 };
+<a name="l00057"></a>00057
+<a name="l00058"></a>00058 }
+<a name="l00059"></a>00059
+<a name="l00060"></a>00060 <span class="keyword">namespace </span>interface5 {
+<a name="l00061"></a>00061 <span class="keyword">namespace </span>internal {
+<a name="l00063"></a>00063
+<a name="l00068"></a><a class="code" href="a00200.html">00068</a> <span class="keyword">class </span><a class="code" href="a00200.html">task_base</a>: tbb::internal::no_copy {
+<a name="l00069"></a>00069 __TBB_TASK_BASE_ACCESS:
+<a name="l00070"></a>00070 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">tbb::task</a>;
+<a name="l00071"></a>00071
+<a name="l00073"></a>00073 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00199.html">task</a>& t );
+<a name="l00074"></a>00074
+<a name="l00076"></a>00076 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00202.html">task_list</a>& list );
+<a name="l00077"></a>00077
+<a name="l00079"></a>00079
+<a name="l00081"></a>00081 <span class="keyword">static</span> tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( <a class="code" href="a00199.html">task</a>& t ) {
+<a name="l00082"></a>00082 <span class="keywordflow">return</span> tbb::internal::allocate_additional_child_of_proxy(t);
+<a name="l00083"></a>00083 }
+<a name="l00084"></a>00084
+<a name="l00086"></a>00086
+<a name="l00090"></a>00090 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00199.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00199.html">task</a>& victim );
+<a name="l00091"></a>00091 };
+<a name="l00092"></a>00092 } <span class="comment">// internal</span>
+<a name="l00093"></a>00093 } <span class="comment">// interface5</span>
+<a name="l00094"></a>00094
+<a name="l00096"></a>00096 <span class="keyword">namespace </span>internal {
+<a name="l00097"></a>00097
+<a name="l00098"></a>00098 <span class="keyword">class </span>scheduler: no_copy {
+<a name="l00099"></a>00099 <span class="keyword">public</span>:
+<a name="l00101"></a>00101 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00199.html">task</a>& first, <a class="code" href="a00199.html">task</a>*& next ) = 0;
+<a name="l00102"></a>00102
+<a name="l00104"></a>00104 <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( <a class="code" href="a00199.html">task</a>& parent, <a class="code" href="a00199.html">task</a>* child ) = 0;
+<a name="l00105"></a>00105
+<a name="l00107"></a>00107 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00199.html">task</a>& first, <a class="code" href="a00199.html">task</a>*& next ) = 0;
+<a name="l00108"></a>00108
+<a name="l00110"></a>00110 <span class="comment">// Have to have it just to shut up overzealous compilation warnings</span>
+<a name="l00111"></a>00111 <span class="keyword">virtual</span> ~scheduler() = 0;
+<a name="l00112"></a>00112 <span class="preprocessor">#if __TBB_ARENA_PER_MASTER</span>
+<a name="l00113"></a>00113 <span class="preprocessor"></span>
+<a name="l00115"></a>00115 <span class="keyword">virtual</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00199.html">task</a>& t, <span class="keywordtype">void</span>* reserved ) = 0;
+<a name="l00116"></a>00116 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_ARENA_PER_MASTER */</span>
+<a name="l00117"></a>00117 };
+<a name="l00118"></a>00118
+<a name="l00120"></a>00120
+<a name="l00121"></a>00121 <span class="keyword">typedef</span> intptr_t reference_count;
+<a name="l00122"></a>00122
+<a name="l00124"></a>00124 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> affinity_id;
+<a name="l00125"></a>00125
+<a name="l00126"></a>00126 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="keyword">struct </span>context_list_node_t {
+<a name="l00128"></a>00128 context_list_node_t *my_prev,
+<a name="l00129"></a>00129 *my_next;
+<a name="l00130"></a>00130 };
+<a name="l00131"></a>00131
+<a name="l00132"></a>00132 <span class="keyword">class </span>allocate_root_with_context_proxy: no_assign {
+<a name="l00133"></a>00133 task_group_context& my_context;
+<a name="l00134"></a>00134 <span class="keyword">public</span>:
+<a name="l00135"></a>00135 allocate_root_with_context_proxy ( task_group_context& ctx ) : my_context(ctx) {}
+<a name="l00136"></a>00136 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
+<a name="l00137"></a>00137 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
+<a name="l00138"></a>00138 };
+<a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="keyword">class </span>allocate_root_proxy: no_assign {
+<a name="l00142"></a>00142 <span class="keyword">public</span>:
+<a name="l00143"></a>00143 <span class="keyword">static</span> task& __TBB_EXPORTED_FUNC allocate( size_t size );
+<a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free( task& );
+<a name="l00145"></a>00145 };
+<a name="l00146"></a>00146
+<a name="l00147"></a>00147 <span class="keyword">class </span>allocate_continuation_proxy: no_assign {
+<a name="l00148"></a>00148 <span class="keyword">public</span>:
+<a name="l00149"></a>00149 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
+<a name="l00150"></a>00150 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
+<a name="l00151"></a>00151 };
+<a name="l00152"></a>00152
+<a name="l00153"></a>00153 <span class="keyword">class </span>allocate_child_proxy: no_assign {
+<a name="l00154"></a>00154 <span class="keyword">public</span>:
+<a name="l00155"></a>00155 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
+<a name="l00156"></a>00156 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
+<a name="l00157"></a>00157 };
+<a name="l00158"></a>00158
+<a name="l00160"></a>00160
+<a name="l00165"></a>00165 <span class="keyword">class </span>task_prefix {
+<a name="l00166"></a>00166 <span class="keyword">private</span>:
+<a name="l00167"></a>00167 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">tbb::task</a>;
+<a name="l00168"></a>00168 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00200.html">tbb::interface5::internal::task_base</a>;
+<a name="l00169"></a>00169 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00202.html">tbb::task_list</a>;
+<a name="l00170"></a>00170 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
+<a name="l00171"></a>00171 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
+<a name="l00172"></a>00172 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
+<a name="l00173"></a>00173 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
+<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
+<a name="l00175"></a>00175
+<a name="l00176"></a>00176 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>
+<a name="l00181"></a>00181 <span class="preprocessor"> task_group_context *context;</span>
+<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00183"></a>00183
+<a name="l00185"></a>00185
+<a name="l00190"></a>00190 scheduler* origin;
+<a name="l00191"></a>00191
+<a name="l00193"></a>00193 scheduler* owner;
+<a name="l00194"></a>00194
+<a name="l00196"></a>00196
+<a name="l00199"></a>00199 <a class="code" href="a00199.html">tbb::task</a>* parent;
+<a name="l00200"></a>00200
+<a name="l00202"></a>00202
+<a name="l00206"></a>00206 reference_count ref_count;
+<a name="l00207"></a>00207
+<a name="l00209"></a>00209
+<a name="l00210"></a>00210 <span class="keywordtype">int</span> depth;
+<a name="l00211"></a>00211
+<a name="l00213"></a>00213
+<a name="l00214"></a>00214 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
+<a name="l00215"></a>00215
+<a name="l00217"></a>00217
+<a name="l00222"></a>00222 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
+<a name="l00223"></a>00223
+<a name="l00224"></a>00224 affinity_id affinity;
+<a name="l00225"></a>00225
+<a name="l00227"></a>00227 <a class="code" href="a00199.html">tbb::task</a>* next;
+<a name="l00228"></a>00228
+<a name="l00230"></a>00230 <a class="code" href="a00199.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
+<a name="l00231"></a>00231 };
+<a name="l00232"></a>00232
+<a name="l00233"></a>00233 } <span class="comment">// namespace internal</span>
+<a name="l00235"></a>00235 <span class="comment"></span>
+<a name="l00236"></a>00236 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00237"></a>00237 <span class="preprocessor"></span>
+<a name="l00238"></a>00238 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00239"></a>00239 <span class="preprocessor"></span> <span class="keyword">class </span>tbb_exception;
+<a name="l00240"></a>00240 <span class="preprocessor">#else</span>
+<a name="l00241"></a>00241 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
+<a name="l00242"></a>00242 <span class="keyword">class </span>tbb_exception_ptr;
+<a name="l00243"></a>00243 }
+<a name="l00244"></a>00244 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00245"></a>00245
+<a name="l00247"></a>00247
+<a name="l00267"></a><a class="code" href="a00201.html">00267</a> <span class="keyword">class </span><a class="code" href="a00201.html">task_group_context</a> : internal::no_copy {
+<a name="l00268"></a>00268 <span class="keyword">private</span>:
+<a name="l00269"></a>00269 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00270"></a>00270 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00206.html">tbb_exception</a> <a class="code" href="a00206.html">exception_container_type</a>;
+<a name="l00271"></a>00271 <span class="preprocessor">#else</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00207.html">internal::tbb_exception_ptr</a> <a class="code" href="a00206.html">exception_container_type</a>;
+<a name="l00273"></a>00273 <span class="preprocessor">#endif</span>
+<a name="l00274"></a>00274 <span class="preprocessor"></span>
+<a name="l00275"></a>00275 <span class="keyword">enum</span> version_traits_word_layout {
+<a name="l00276"></a>00276 traits_offset = 16,
+<a name="l00277"></a>00277 version_mask = 0xFFFF,
+<a name="l00278"></a>00278 traits_mask = 0xFFFFul << traits_offset
+<a name="l00279"></a>00279 };
+<a name="l00280"></a>00280
+<a name="l00281"></a>00281 <span class="keyword">public</span>:
+<a name="l00282"></a>00282 <span class="keyword">enum</span> kind_type {
+<a name="l00283"></a>00283 isolated,
+<a name="l00284"></a>00284 bound
+<a name="l00285"></a>00285 };
+<a name="l00286"></a>00286
+<a name="l00287"></a>00287 <span class="keyword">enum</span> traits_type {
+<a name="l00288"></a>00288 exact_exception = 0x0001ul << traits_offset,
+<a name="l00289"></a>00289 concurrent_wait = 0x0004ul << traits_offset,
+<a name="l00290"></a>00290 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00291"></a>00291 <span class="preprocessor"></span> default_traits = 0
+<a name="l00292"></a>00292 <span class="preprocessor">#else</span>
+<a name="l00293"></a>00293 <span class="preprocessor"></span> default_traits = exact_exception
+<a name="l00294"></a>00294 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00295"></a>00295 };
+<a name="l00296"></a>00296
+<a name="l00297"></a>00297 <span class="keyword">private</span>:
+<a name="l00298"></a>00298 <span class="keyword">union </span>{
+<a name="l00300"></a>00300 kind_type my_kind;
+<a name="l00301"></a>00301 uintptr_t _my_kind_aligner;
+<a name="l00302"></a>00302 };
+<a name="l00303"></a>00303
+<a name="l00305"></a>00305 <a class="code" href="a00201.html">task_group_context</a> *my_parent;
+<a name="l00306"></a>00306
+<a name="l00308"></a>00308
+<a name="l00310"></a>00310 internal::context_list_node_t my_node;
+<a name="l00311"></a>00311
+<a name="l00313"></a>00313 __itt_caller itt_caller;
+<a name="l00314"></a>00314
+<a name="l00316"></a>00316
+<a name="l00319"></a>00319 <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize -
+<a name="l00320"></a>00320 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="l00321"></a>00321 - <span class="keyword">sizeof</span>(__itt_caller)];
+<a name="l00322"></a>00322
+<a name="l00324"></a>00324 uintptr_t my_cancellation_requested;
+<a name="l00325"></a>00325
+<a name="l00327"></a>00327
+<a name="l00330"></a>00330 uintptr_t my_version_and_traits;
+<a name="l00331"></a>00331
+<a name="l00333"></a>00333 <a class="code" href="a00206.html">exception_container_type</a> *my_exception;
+<a name="l00334"></a>00334
+<a name="l00336"></a>00336
+<a name="l00339"></a>00339 <span class="keywordtype">void</span> *my_owner;
+<a name="l00340"></a>00340
+<a name="l00342"></a>00342
+<a name="l00343"></a>00343 <span class="keywordtype">char</span> _trailing_padding[internal::NFS_MaxLineSize - <span class="keyword">sizeof</span>(intptr_t) - 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)];
+<a name="l00344"></a>00344
+<a name="l00345"></a>00345 <span class="keyword">public</span>:
+<a name="l00347"></a>00347
+<a name="l00374"></a><a class="code" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">00374</a> <a class="code" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a> ( kind_type relation_with_parent = bound,
+<a name="l00375"></a>00375 uintptr_t traits = default_traits )
+<a name="l00376"></a>00376 : my_kind(relation_with_parent)
+<a name="l00377"></a>00377 , my_version_and_traits(1 | traits)
+<a name="l00378"></a>00378 {
+<a name="l00379"></a>00379 <a class="code" href="a00201.html#49a55352084fd44b8863d182e839e6dc">init</a>();
+<a name="l00380"></a>00380 }
+<a name="l00381"></a>00381
+<a name="l00382"></a>00382 __TBB_EXPORTED_METHOD ~<a class="code" href="a00201.html">task_group_context</a> ();
+<a name="l00383"></a>00383
+<a name="l00385"></a>00385
+<a name="l00392"></a>00392 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a> ();
+<a name="l00393"></a>00393
+<a name="l00395"></a>00395
+<a name="l00402"></a>00402 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a> ();
+<a name="l00403"></a>00403
+<a name="l00405"></a>00405 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () <span class="keyword">const</span>;
+<a name="l00406"></a>00406
+<a name="l00408"></a>00408
+<a name="l00414"></a>00414 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ();
+<a name="l00415"></a>00415
+<a name="l00416"></a>00416 <span class="keyword">protected</span>:
+<a name="l00418"></a>00418
+<a name="l00419"></a>00419 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#49a55352084fd44b8863d182e839e6dc">init</a> ();
+<a name="l00420"></a>00420
+<a name="l00421"></a>00421 <span class="keyword">private</span>:
+<a name="l00422"></a>00422 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">task</a>;
+<a name="l00423"></a>00423 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00424"></a>00424
+<a name="l00425"></a>00425 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
+<a name="l00426"></a>00426 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
+<a name="l00427"></a>00427 <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
+<a name="l00428"></a>00428 <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
+<a name="l00429"></a>00429
+<a name="l00432"></a>00432 <span class="keywordtype">void</span> propagate_cancellation_from_ancestors ();
+<a name="l00433"></a>00433
+<a name="l00435"></a>00435 <span class="keywordtype">bool</span> is_alive () {
+<a name="l00436"></a>00436 <span class="preprocessor">#if TBB_USE_DEBUG</span>
+<a name="l00437"></a>00437 <span class="preprocessor"></span> <span class="keywordflow">return</span> my_version_and_traits != 0xDeadBeef;
+<a name="l00438"></a>00438 <span class="preprocessor">#else</span>
+<a name="l00439"></a>00439 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00440"></a>00440 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
+<a name="l00441"></a>00441 }
+<a name="l00442"></a>00442 }; <span class="comment">// class task_group_context</span>
+<a name="l00443"></a>00443
+<a name="l00444"></a>00444 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00445"></a>00445
+<a name="l00447"></a>00447
+<a name="l00448"></a><a class="code" href="a00199.html">00448</a> <span class="keyword">class </span><a class="code" href="a00199.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
+<a name="l00449"></a>00449
+<a name="l00451"></a>00451 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
+<a name="l00452"></a>00452
+<a name="l00454"></a>00454 internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
+<a name="l00455"></a>00455
+<a name="l00456"></a>00456 <span class="keyword">protected</span>:
+<a name="l00458"></a><a class="code" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">00458</a> <a class="code" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>() {prefix().extra_state=1;}
+<a name="l00459"></a>00459
+<a name="l00460"></a>00460 <span class="keyword">public</span>:
+<a name="l00462"></a><a class="code" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">00462</a> <span class="keyword">virtual</span> <a class="code" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">~task</a>() {}
+<a name="l00463"></a>00463
+<a name="l00465"></a>00465 <span class="keyword">virtual</span> <a class="code" href="a00199.html">task</a>* <a class="code" href="a00199.html#22c298cd40937a431a06777423f002f6">execute</a>() = 0;
+<a name="l00466"></a>00466
+<a name="l00468"></a><a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">00468</a> <span class="keyword">enum</span> <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
+<a name="l00470"></a>00470 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
+<a name="l00472"></a>00472 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
+<a name="l00474"></a>00474 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
+<a name="l00476"></a>00476 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
+<a name="l00478"></a>00478 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
+<a name="l00480"></a>00480 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
+<a name="l00481"></a>00481 };
+<a name="l00482"></a>00482
+<a name="l00483"></a>00483 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00484"></a>00484 <span class="comment">// Allocating tasks</span>
+<a name="l00485"></a>00485 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00486"></a>00486
+<a name="l00488"></a><a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">00488</a> <span class="keyword">static</span> internal::allocate_root_proxy <a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>() {
+<a name="l00489"></a>00489 <span class="keywordflow">return</span> internal::allocate_root_proxy();
+<a name="l00490"></a>00490 }
+<a name="l00491"></a>00491
+<a name="l00492"></a>00492 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00494"></a><a class="code" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">00494</a> <span class="preprocessor"> static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
+<a name="l00495"></a>00495 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
+<a name="l00496"></a>00496 }
+<a name="l00497"></a>00497 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00498"></a>00498
+<a name="l00500"></a>00500
+<a name="l00501"></a><a class="code" href="a00199.html#1434c79a5138993269d034008bff7329">00501</a> internal::allocate_continuation_proxy& allocate_continuation() {
+<a name="l00502"></a>00502 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
+<a name="l00503"></a>00503 }
+<a name="l00504"></a>00504
+<a name="l00506"></a><a class="code" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">00506</a> internal::allocate_child_proxy& allocate_child() {
+<a name="l00507"></a>00507 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
+<a name="l00508"></a>00508 }
+<a name="l00509"></a>00509
+<a name="l00511"></a>00511 <span class="keyword">using</span> task_base::allocate_additional_child_of;
+<a name="l00512"></a>00512
+<a name="l00513"></a>00513 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
+<a name="l00515"></a>00515 <span class="preprocessor"></span>
+<a name="l00519"></a>00519 <span class="preprocessor"> void __TBB_EXPORTED_METHOD destroy( task& t );</span>
+<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
+<a name="l00522"></a>00522 using task_base::destroy;
+<a name="l00523"></a>00523 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
+<a name="l00524"></a>00524
+<a name="l00525"></a>00525 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00526"></a>00526 <span class="comment">// Recycling of tasks</span>
+<a name="l00527"></a>00527 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00528"></a>00528
+<a name="l00530"></a>00530
+<a name="l00536"></a><a class="code" href="a00199.html#a67a79e18f62b43a623a00cfbd76db4c">00536</a> <span class="keywordtype">void</span> recycle_as_continuation() {
+<a name="l00537"></a>00537 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
+<a name="l00538"></a>00538 prefix().state = allocated;
+<a name="l00539"></a>00539 }
+<a name="l00540"></a>00540
+<a name="l00542"></a>00542
+<a name="l00544"></a><a class="code" href="a00199.html#3b290d14109704e2b69dc1ac980a7a76">00544</a> <span class="keywordtype">void</span> recycle_as_safe_continuation() {
+<a name="l00545"></a>00545 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
+<a name="l00546"></a>00546 prefix().state = recycle;
+<a name="l00547"></a>00547 }
+<a name="l00548"></a>00548
+<a name="l00550"></a><a class="code" href="a00199.html#db399855177438bbc9cc61d508dae8d2">00550</a> <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00199.html">task</a>& new_parent ) {
+<a name="l00551"></a>00551 internal::task_prefix& p = prefix();
+<a name="l00552"></a>00552 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
+<a name="l00553"></a>00553 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
+<a name="l00554"></a>00554 __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
+<a name="l00555"></a>00555 __TBB_ASSERT( new_parent.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
+<a name="l00556"></a>00556 __TBB_ASSERT( new_parent.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
+<a name="l00557"></a>00557 p.state = allocated;
+<a name="l00558"></a>00558 p.parent = &new_parent;
+<a name="l00559"></a>00559 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00560"></a>00560 <span class="preprocessor"></span> p.<a class="code" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
+<a name="l00561"></a>00561 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00562"></a>00562 }
+<a name="l00563"></a>00563
+<a name="l00565"></a>00565
+<a name="l00566"></a><a class="code" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">00566</a> <span class="keywordtype">void</span> recycle_to_reexecute() {
+<a name="l00567"></a>00567 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
+<a name="l00568"></a>00568 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
+<a name="l00569"></a>00569 prefix().state = reexecute;
+<a name="l00570"></a>00570 }
+<a name="l00571"></a>00571
+<a name="l00572"></a>00572 <span class="comment">// All depth-related methods are obsolete, and are retained for the sake </span>
+<a name="l00573"></a>00573 <span class="comment">// of backward source compatibility only</span>
+<a name="l00574"></a>00574 intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
+<a name="l00575"></a>00575 <span class="keywordtype">void</span> set_depth( intptr_t ) {}
+<a name="l00576"></a>00576 <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
+<a name="l00577"></a>00577
+<a name="l00578"></a>00578
+<a name="l00579"></a>00579 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00580"></a>00580 <span class="comment">// Spawning and blocking</span>
+<a name="l00581"></a>00581 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00582"></a>00582
+<a name="l00584"></a><a class="code" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">00584</a> <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
+<a name="l00585"></a>00585 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
+<a name="l00586"></a>00586 <span class="preprocessor"></span> internal_set_ref_count(count);
+<a name="l00587"></a>00587 <span class="preprocessor">#else</span>
+<a name="l00588"></a>00588 <span class="preprocessor"></span> prefix().ref_count = count;
+<a name="l00589"></a>00589 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
+<a name="l00590"></a>00590 }
+<a name="l00591"></a>00591
+<a name="l00593"></a>00593
+<a name="l00594"></a><a class="code" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">00594</a> <span class="keywordtype">void</span> increment_ref_count() {
+<a name="l00595"></a>00595 __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
+<a name="l00596"></a>00596 }
+<a name="l00597"></a>00597
+<a name="l00599"></a>00599
+<a name="l00600"></a><a class="code" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">00600</a> <span class="keywordtype">int</span> decrement_ref_count() {
+<a name="l00601"></a>00601 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
+<a name="l00602"></a>00602 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(internal_decrement_ref_count());
+<a name="l00603"></a>00603 <span class="preprocessor">#else</span>
+<a name="l00604"></a>00604 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
+<a name="l00605"></a>00605 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
+<a name="l00606"></a>00606 }
+<a name="l00607"></a>00607
+<a name="l00609"></a>00609 <span class="keyword">using</span> task_base::spawn;
+<a name="l00610"></a>00610
+<a name="l00612"></a><a class="code" href="a00199.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00612</a> <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00199.html">task</a>& child ) {
+<a name="l00613"></a>00613 prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
+<a name="l00614"></a>00614 }
+<a name="l00615"></a>00615
+<a name="l00617"></a>00617 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00202.html">task_list</a>& list );
+<a name="l00618"></a>00618
+<a name="l00620"></a><a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">00620</a> <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00199.html">task</a>& root ) {
+<a name="l00621"></a>00621 root.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
+<a name="l00622"></a>00622 }
+<a name="l00623"></a>00623
+<a name="l00625"></a>00625
+<a name="l00627"></a>00627 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00202.html">task_list</a>& root_list );
+<a name="l00628"></a>00628
+<a name="l00630"></a>00630
+<a name="l00631"></a><a class="code" href="a00199.html#53d2615ad9c38859b4c8080936600283">00631</a> <span class="keywordtype">void</span> wait_for_all() {
+<a name="l00632"></a>00632 prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
+<a name="l00633"></a>00633 }
+<a name="l00634"></a>00634
+<a name="l00635"></a>00635 <span class="preprocessor">#if __TBB_ARENA_PER_MASTER</span>
+<a name="l00637"></a><a class="code" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">00637</a> <span class="preprocessor"> static void enqueue( task& t ) {</span>
+<a name="l00638"></a>00638 <span class="preprocessor"></span> t.prefix().owner->enqueue( t, NULL );
+<a name="l00639"></a>00639 }
+<a name="l00640"></a>00640
+<a name="l00641"></a>00641 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_ARENA_PER_MASTER */</span>
+<a name="l00643"></a>00643 static task& __TBB_EXPORTED_FUNC self();
+<a name="l00644"></a>00644
+<a name="l00646"></a><a class="code" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">00646</a> <a class="code" href="a00199.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
+<a name="l00647"></a>00647
+<a name="l00648"></a>00648 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00650"></a><a class="code" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">00650</a> <span class="preprocessor"> task_group_context* context() {return prefix().context;}</span>
+<a name="l00651"></a>00651 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00652"></a>00652
+<a name="l00654"></a><a class="code" href="a00199.html#f9169402702f56bf519448aaf34450aa">00654</a> <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
+<a name="l00655"></a>00655 <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
+<a name="l00656"></a>00656 }
+<a name="l00657"></a>00657
+<a name="l00658"></a>00658 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00659"></a>00659 <span class="comment">// Debugging</span>
+<a name="l00660"></a>00660 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00661"></a>00661
+<a name="l00663"></a><a class="code" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">00663</a> <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
+<a name="l00664"></a>00664
+<a name="l00666"></a><a class="code" href="a00199.html#ad774f55eaec008ae02b236423209ced">00666</a> <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
+<a name="l00667"></a>00667 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00668"></a>00668 <span class="preprocessor"></span> internal::reference_count ref_count_ = prefix().ref_count;
+<a name="l00669"></a>00669 __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
+<a name="l00670"></a>00670 <span class="preprocessor">#endif</span>
+<a name="l00671"></a>00671 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(prefix().ref_count);
+<a name="l00672"></a>00672 }
+<a name="l00673"></a>00673
+<a name="l00675"></a>00675 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
+<a name="l00676"></a>00676
+<a name="l00677"></a>00677 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00678"></a>00678 <span class="comment">// Affinity</span>
+<a name="l00679"></a>00679 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00680"></a>00680
+<a name="l00682"></a>00682
+<a name="l00683"></a><a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">00683</a> <span class="keyword">typedef</span> internal::affinity_id affinity_id;
+<a name="l00684"></a>00684
+<a name="l00686"></a><a class="code" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">00686</a> <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
+<a name="l00687"></a>00687
+<a name="l00689"></a><a class="code" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">00689</a> affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
+<a name="l00690"></a>00690
+<a name="l00692"></a>00692
+<a name="l00696"></a>00696 <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
+<a name="l00697"></a>00697
+<a name="l00698"></a>00698 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00700"></a>00700 <span class="preprocessor"></span>
+<a name="l00701"></a><a class="code" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">00701</a> <span class="preprocessor"> bool cancel_group_execution () { return prefix().context->cancel_group_execution(); }</span>
+<a name="l00702"></a>00702 <span class="preprocessor"></span>
+<a name="l00704"></a><a class="code" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">00704</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="l00705"></a>00705 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00706"></a>00706
+<a name="l00707"></a>00707 <span class="keyword">private</span>:
+<a name="l00708"></a>00708 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00200.html">interface5::internal::task_base</a>;
+<a name="l00709"></a>00709 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00202.html">task_list</a>;
+<a name="l00710"></a>00710 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
+<a name="l00711"></a>00711 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
+<a name="l00712"></a>00712 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00713"></a>00713 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00714"></a>00714 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00715"></a>00715 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
+<a name="l00716"></a>00716 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
+<a name="l00717"></a>00717 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
+<a name="l00718"></a>00718
+<a name="l00720"></a>00720
+<a name="l00721"></a>00721 internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
+<a name="l00722"></a>00722 <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
+<a name="l00723"></a>00723 }
+<a name="l00724"></a>00724 }; <span class="comment">// class task</span>
+<a name="l00725"></a>00725
+<a name="l00727"></a>00727
+<a name="l00728"></a><a class="code" href="a00163.html">00728</a> <span class="keyword">class </span><a class="code" href="a00163.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00199.html">task</a> {
+<a name="l00729"></a>00729 <span class="comment">/*override*/</span> <a class="code" href="a00199.html">task</a>* execute() {
+<a name="l00730"></a>00730 <span class="keywordflow">return</span> NULL;
+<a name="l00731"></a>00731 }
+<a name="l00732"></a>00732 };
+<a name="l00733"></a>00733
+<a name="l00735"></a>00735
+<a name="l00737"></a><a class="code" href="a00202.html">00737</a> <span class="keyword">class </span><a class="code" href="a00202.html">task_list</a>: internal::no_copy {
+<a name="l00738"></a>00738 <span class="keyword">private</span>:
+<a name="l00739"></a>00739 <a class="code" href="a00199.html">task</a>* first;
+<a name="l00740"></a>00740 <a class="code" href="a00199.html">task</a>** next_ptr;
+<a name="l00741"></a>00741 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">task</a>;
+<a name="l00742"></a>00742 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00200.html">interface5::internal::task_base</a>;
+<a name="l00743"></a>00743 <span class="keyword">public</span>:
+<a name="l00745"></a><a class="code" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">00745</a> <a class="code" href="a00202.html">task_list</a>() : first(NULL), next_ptr(&first) {}
+<a name="l00746"></a>00746
+<a name="l00748"></a><a class="code" href="a00202.html#6d438f1499a02db1e59c24ab6043e5ba">00748</a> ~<a class="code" href="a00202.html">task_list</a>() {}
+<a name="l00749"></a>00749
+<a name="l00751"></a><a class="code" href="a00202.html#f3ac31e092814b90929f81bb30441959">00751</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
+<a name="l00752"></a>00752
+<a name="l00754"></a><a class="code" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">00754</a> <span class="keywordtype">void</span> push_back( <a class="code" href="a00199.html">task</a>& <a class="code" href="a00199.html">task</a> ) {
+<a name="l00755"></a>00755 task.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
+<a name="l00756"></a>00756 *next_ptr = &task;
+<a name="l00757"></a>00757 next_ptr = &task.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
+<a name="l00758"></a>00758 }
+<a name="l00759"></a>00759
+<a name="l00761"></a><a class="code" href="a00202.html#5fe85df5ed524418389d34051750347d">00761</a> <a class="code" href="a00199.html">task</a>& pop_front() {
+<a name="l00762"></a>00762 __TBB_ASSERT( !empty(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
+<a name="l00763"></a>00763 <a class="code" href="a00199.html">task</a>* result = first;
+<a name="l00764"></a>00764 first = result-><a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
+<a name="l00765"></a>00765 <span class="keywordflow">if</span>( !first ) next_ptr = &first;
+<a name="l00766"></a>00766 <span class="keywordflow">return</span> *result;
+<a name="l00767"></a>00767 }
+<a name="l00768"></a>00768
+<a name="l00770"></a><a class="code" href="a00202.html#fce446ee13e025969945328f3ff59b95">00770</a> <span class="keywordtype">void</span> clear() {
+<a name="l00771"></a>00771 first=NULL;
+<a name="l00772"></a>00772 next_ptr=&first;
+<a name="l00773"></a>00773 }
+<a name="l00774"></a>00774 };
+<a name="l00775"></a>00775
+<a name="l00776"></a>00776 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
+<a name="l00777"></a>00777 t.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
+<a name="l00778"></a>00778 }
+<a name="l00779"></a>00779
+<a name="l00780"></a>00780 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
+<a name="l00781"></a>00781 <span class="keywordflow">if</span>( task* t = list.first ) {
+<a name="l00782"></a>00782 t->prefix().owner->spawn( *t, *list.next_ptr );
+<a name="l00783"></a>00783 list.clear();
+<a name="l00784"></a>00784 }
+<a name="l00785"></a>00785 }
+<a name="l00786"></a>00786
+<a name="l00787"></a><a class="code" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">00787</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00202.html">task_list</a>& root_list ) {
+<a name="l00788"></a>00788 <span class="keywordflow">if</span>( <a class="code" href="a00199.html">task</a>* t = root_list.<a class="code" href="a00202.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
+<a name="l00789"></a>00789 t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00202.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
+<a name="l00790"></a>00790 root_list.<a class="code" href="a00202.html#fce446ee13e025969945328f3ff59b95">clear</a>();
+<a name="l00791"></a>00791 }
+<a name="l00792"></a>00792 }
+<a name="l00793"></a>00793
+<a name="l00794"></a>00794 } <span class="comment">// namespace tbb</span>
+<a name="l00795"></a>00795
+<a name="l00796"></a>00796 <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="l00797"></a>00797 <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
+<a name="l00798"></a>00798 }
+<a name="l00799"></a>00799
+<a name="l00800"></a>00800 <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="l00801"></a>00801 tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
+<a name="l00802"></a>00802 }
+<a name="l00803"></a>00803
+<a name="l00804"></a>00804 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00805"></a>00805 <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="l00806"></a>00806 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00807"></a>00807 }
+<a name="l00808"></a>00808
+<a name="l00809"></a>00809 <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="l00810"></a>00810 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00811"></a>00811 }
+<a name="l00812"></a>00812 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00813"></a>00813
+<a name="l00814"></a>00814 <span class="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="l00815"></a>00815 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00816"></a>00816 }
+<a name="l00817"></a>00817
+<a name="l00818"></a>00818 <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="l00819"></a>00819 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00820"></a>00820 }
+<a name="l00821"></a>00821
+<a name="l00822"></a>00822 <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="l00823"></a>00823 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00824"></a>00824 }
+<a name="l00825"></a>00825
+<a name="l00826"></a>00826 <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="l00827"></a>00827 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00828"></a>00828 }
+<a name="l00829"></a>00829
+<a name="l00830"></a>00830 <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="l00831"></a>00831 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00832"></a>00832 }
+<a name="l00833"></a>00833
+<a name="l00834"></a>00834 <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="l00835"></a>00835 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00836"></a>00836 }
+<a name="l00837"></a>00837
+<a name="l00838"></a>00838 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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
new file mode 100644
index 0000000..3795625
--- /dev/null
+++ b/doc/html/a00436.html
@@ -0,0 +1,265 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>task_group.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>task_group.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_group_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_group_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00026"></a>00026
+<a name="l00027"></a>00027 <span class="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="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="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="a00199.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="a00199.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="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="a00199.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 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00119"></a>00119 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
+<a name="l00120"></a>00120 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
+<a name="l00121"></a>00121 }
+<a name="l00122"></a>00122
+<a name="l00123"></a>00123 task_group_status wait() {
+<a name="l00124"></a>00124 __TBB_TRY {
+<a name="l00125"></a>00125 my_root->wait_for_all();
+<a name="l00126"></a>00126 } __TBB_CATCH( ... ) {
+<a name="l00127"></a>00127 my_context.reset();
+<a name="l00128"></a>00128 __TBB_RETHROW();
+<a name="l00129"></a>00129 }
+<a name="l00130"></a>00130 <span class="keywordflow">if</span> ( my_context.is_group_execution_cancelled() ) {
+<a name="l00131"></a>00131 my_context.reset();
+<a name="l00132"></a>00132 <span class="keywordflow">return</span> canceled;
+<a name="l00133"></a>00133 }
+<a name="l00134"></a>00134 <span class="keywordflow">return</span> complete;
+<a name="l00135"></a>00135 }
+<a name="l00136"></a>00136
+<a name="l00137"></a>00137 <span class="keywordtype">bool</span> is_canceling() {
+<a name="l00138"></a>00138 <span class="keywordflow">return</span> my_context.is_group_execution_cancelled();
+<a name="l00139"></a>00139 }
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="keywordtype">void</span> cancel() {
+<a name="l00142"></a>00142 my_context.cancel_group_execution();
+<a name="l00143"></a>00143 }
+<a name="l00144"></a>00144 }; <span class="comment">// class task_group_base</span>
+<a name="l00145"></a>00145
+<a name="l00146"></a>00146 } <span class="comment">// namespace internal</span>
+<a name="l00147"></a>00147
+<a name="l00148"></a>00148 <span class="keyword">class </span>task_group : <span class="keyword">public</span> internal::task_group_base {
+<a name="l00149"></a>00149 <span class="keyword">public</span>:
+<a name="l00150"></a>00150 task_group () : task_group_base( task_group_context::concurrent_wait ) {}
+<a name="l00151"></a>00151
+<a name="l00152"></a>00152 ~task_group() __TBB_TRY {
+<a name="l00153"></a>00153 __TBB_ASSERT( my_root->ref_count() != 0, NULL );
+<a name="l00154"></a>00154 <span class="keywordflow">if</span>( my_root->ref_count() > 1 )
+<a name="l00155"></a>00155 my_root->wait_for_all();
+<a name="l00156"></a>00156 owner().destroy(*my_root);
+<a name="l00157"></a>00157 }
+<a name="l00158"></a>00158 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<a name="l00159"></a>00159 <span class="preprocessor"></span> <span class="keywordflow">catch</span> (...) {
+<a name="l00160"></a>00160 owner().destroy(*my_root);
+<a name="l00161"></a>00161 <span class="keywordflow">throw</span>;
+<a name="l00162"></a>00162 }
+<a name="l00163"></a>00163 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
+<a name="l00164"></a>00164
+<a name="l00165"></a>00165 <span class="preprocessor">#if __SUNPRO_CC</span>
+<a name="l00166"></a>00166 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00167"></a>00167 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
+<a name="l00168"></a>00168 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
+<a name="l00169"></a>00169 }
+<a name="l00170"></a>00170 <span class="preprocessor">#else</span>
+<a name="l00171"></a>00171 <span class="preprocessor"></span> <span class="keyword">using</span> task_group_base::run;
+<a name="l00172"></a>00172 <span class="preprocessor">#endif</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span>
+<a name="l00174"></a>00174 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00175"></a>00175 <span class="keywordtype">void</span> run( <span class="keyword">const</span> F& f ) {
+<a name="l00176"></a>00176 internal_run< const F, internal::function_task<F> >( f );
+<a name="l00177"></a>00177 }
+<a name="l00178"></a>00178
+<a name="l00179"></a>00179 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00180"></a>00180 task_group_status run_and_wait( <span class="keyword">const</span> F& f ) {
+<a name="l00181"></a>00181 <span class="keywordflow">return</span> internal_run_and_wait<const F>( f );
+<a name="l00182"></a>00182 }
+<a name="l00183"></a>00183
+<a name="l00184"></a>00184 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00185"></a>00185 task_group_status run_and_wait( task_handle<F>& h ) {
+<a name="l00186"></a>00186 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 }; <span class="comment">// class task_group</span>
+<a name="l00189"></a>00189
+<a name="l00190"></a>00190 <span class="keyword">class </span>structured_task_group : <span class="keyword">public</span> internal::task_group_base {
+<a name="l00191"></a>00191 <span class="keyword">public</span>:
+<a name="l00192"></a>00192 ~structured_task_group() {
+<a name="l00193"></a>00193 <span class="keywordflow">if</span>( my_root->ref_count() > 1 ) {
+<a name="l00194"></a>00194 <span class="keywordtype">bool</span> stack_unwinding_in_progress = std::uncaught_exception();
+<a name="l00195"></a>00195 <span class="comment">// Always attempt to do proper cleanup to avoid inevitable memory corruption </span>
+<a name="l00196"></a>00196 <span class="comment">// in case of missing wait (for the sake of better testability & debuggability)</span>
+<a name="l00197"></a>00197 <span class="keywordflow">if</span> ( !is_canceling() )
+<a name="l00198"></a>00198 cancel();
+<a name="l00199"></a>00199 my_root->wait_for_all();
+<a name="l00200"></a>00200 owner().destroy(*my_root);
+<a name="l00201"></a>00201 <span class="keywordflow">if</span> ( !stack_unwinding_in_progress )
+<a name="l00202"></a>00202 internal::throw_exception( internal::eid_missing_wait );
+<a name="l00203"></a>00203 }
+<a name="l00204"></a>00204 <span class="keywordflow">else</span> {
+<a name="l00205"></a>00205 <span class="keywordflow">if</span>( my_root->ref_count() == 1 )
+<a name="l00206"></a>00206 my_root->set_ref_count(0);
+<a name="l00207"></a>00207 owner().destroy(*my_root);
+<a name="l00208"></a>00208 }
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210
+<a name="l00211"></a>00211 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00212"></a>00212 task_group_status run_and_wait ( task_handle<F>& h ) {
+<a name="l00213"></a>00213 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
+<a name="l00214"></a>00214 }
+<a name="l00215"></a>00215
+<a name="l00216"></a>00216 task_group_status wait() {
+<a name="l00217"></a>00217 task_group_status res = task_group_base::wait();
+<a name="l00218"></a>00218 my_root->set_ref_count(1);
+<a name="l00219"></a>00219 <span class="keywordflow">return</span> res;
+<a name="l00220"></a>00220 }
+<a name="l00221"></a>00221 }; <span class="comment">// class structured_task_group</span>
+<a name="l00222"></a>00222
+<a name="l00223"></a>00223 <span class="keyword">inline</span>
+<a name="l00224"></a>00224 <span class="keywordtype">bool</span> is_current_task_group_canceling() {
+<a name="l00225"></a>00225 <span class="keywordflow">return</span> <a class="code" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>();
+<a name="l00226"></a>00226 }
+<a name="l00227"></a>00227
+<a name="l00228"></a>00228 <span class="keyword">template</span><<span class="keyword">class</span> F>
+<a name="l00229"></a>00229 task_handle<F> make_task( <span class="keyword">const</span> F& f ) {
+<a name="l00230"></a>00230 <span class="keywordflow">return</span> task_handle<F>( f );
+<a name="l00231"></a>00231 }
+<a name="l00232"></a>00232
+<a name="l00233"></a>00233 } <span class="comment">// namespace tbb</span>
+<a name="l00234"></a>00234
+<a name="l00235"></a>00235 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_group_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00383.html b/doc/html/a00443.html
similarity index 82%
rename from doc/html/a00383.html
rename to doc/html/a00443.html
index 2c083b4..d5b6449 100644
--- a/doc/html/a00383.html
+++ b/doc/html/a00443.html
@@ -54,35 +54,35 @@
<a name="l00035"></a>00035 } <span class="comment">// namespace internal</span>
<a name="l00037"></a>00037 <span class="comment"></span>
<a name="l00039"></a>00039
-<a name="l00042"></a><a class="code" href="a00177.html">00042</a> <span class="keyword">class </span><a class="code" href="a00177.html">task_scheduler_init</a>: internal::no_copy {
+<a name="l00042"></a><a class="code" href="a00203.html">00042</a> <span class="keyword">class </span><a class="code" href="a00203.html">task_scheduler_init</a>: internal::no_copy {
<a name="l00044"></a>00044 internal::scheduler* my_scheduler;
<a name="l00045"></a>00045 <span class="keyword">public</span>:
<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">00048</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
+<a name="l00048"></a><a class="code" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">00048</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
<a name="l00049"></a>00049
-<a name="l00051"></a><a class="code" href="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">00051</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
+<a name="l00051"></a><a class="code" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">00051</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
<a name="l00052"></a>00052
<a name="l00054"></a>00054
-<a name="l00062"></a>00062 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00177.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> );
+<a name="l00062"></a>00062 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00203.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> );
<a name="l00063"></a>00063
<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00177.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads, stack_size_type thread_stack_size );
+<a name="l00066"></a>00066 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00203.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads, stack_size_type thread_stack_size );
<a name="l00067"></a>00067
-<a name="l00069"></a>00069 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
+<a name="l00069"></a>00069 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00177.html#421600bf9bf9338bcf937063f2ff0e90">00072</a> <a class="code" href="a00177.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL) {
-<a name="l00073"></a>00073 <a class="code" href="a00177.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
+<a name="l00072"></a><a class="code" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">00072</a> <a class="code" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL) {
+<a name="l00073"></a>00073 <a class="code" href="a00203.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
<a name="l00074"></a>00074 }
<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00177.html#4da6c86292d80c703a66c1f6f5299488">00077</a> <a class="code" href="a00177.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>() {
+<a name="l00077"></a><a class="code" href="a00203.html#4da6c86292d80c703a66c1f6f5299488">00077</a> <a class="code" href="a00203.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>() {
<a name="l00078"></a>00078 <span class="keywordflow">if</span>( my_scheduler )
-<a name="l00079"></a>00079 <a class="code" href="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
+<a name="l00079"></a>00079 <a class="code" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
<a name="l00080"></a>00080 internal::poison_pointer( my_scheduler );
<a name="l00081"></a>00081 }
<a name="l00083"></a>00083
-<a name="l00090"></a>00090 <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00177.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
+<a name="l00090"></a>00090 <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00203.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
<a name="l00091"></a>00091
-<a name="l00093"></a><a class="code" href="a00177.html#12752282977029f23416642bc03e8b74">00093</a> <span class="keywordtype">bool</span> <a class="code" href="a00177.html#12752282977029f23416642bc03e8b74">is_active</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_scheduler != NULL; }
+<a name="l00093"></a><a class="code" href="a00203.html#12752282977029f23416642bc03e8b74">00093</a> <span class="keywordtype">bool</span> <a class="code" href="a00203.html#12752282977029f23416642bc03e8b74">is_active</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_scheduler != NULL; }
<a name="l00094"></a>00094 };
<a name="l00095"></a>00095
<a name="l00096"></a>00096 } <span class="comment">// namespace tbb</span>
@@ -90,7 +90,7 @@
<a name="l00098"></a>00098 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_init_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00384.html b/doc/html/a00444.html
similarity index 98%
rename from doc/html/a00384.html
rename to doc/html/a00444.html
index 7663ef7..0d5a4d3 100644
--- a/doc/html/a00384.html
+++ b/doc/html/a00444.html
@@ -55,7 +55,7 @@
<a name="l00034"></a>00034 <span class="keyword">class </span>task_scheduler_observer_v3 {
<a name="l00035"></a>00035 <span class="keyword">friend</span> <span class="keyword">class </span>observer_proxy;
<a name="l00036"></a>00036 observer_proxy* my_proxy;
-<a name="l00037"></a>00037 atomic<intptr> my_busy_count;
+<a name="l00037"></a>00037 atomic<intptr_t> my_busy_count;
<a name="l00038"></a>00038 <span class="keyword">public</span>:
<a name="l00040"></a>00040 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD observe( <span class="keywordtype">bool</span> state=<span class="keyword">true</span> );
<a name="l00041"></a>00041
@@ -81,7 +81,7 @@
<a name="l00066"></a>00066 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_observer_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00386.html b/doc/html/a00446.html
similarity index 94%
rename from doc/html/a00386.html
rename to doc/html/a00446.html
index cd613d2..0f5074f 100644
--- a/doc/html/a00386.html
+++ b/doc/html/a00446.html
@@ -48,41 +48,44 @@
<a name="l00035"></a>00035 <span class="preprocessor">#include "blocked_range2d.h"</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include "blocked_range3d.h"</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "concurrent_hash_map.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "concurrent_queue.h"</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "critical_section.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "mutex.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "null_mutex.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "null_rw_mutex.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "parallel_do.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "parallel_for.h"</span>
-<a name="l00048"></a>00048 <span class="preprocessor">#include "parallel_for_each.h"</span>
-<a name="l00049"></a>00049 <span class="preprocessor">#include "parallel_invoke.h"</span>
-<a name="l00050"></a>00050 <span class="preprocessor">#include "parallel_reduce.h"</span>
-<a name="l00051"></a>00051 <span class="preprocessor">#include "parallel_scan.h"</span>
-<a name="l00052"></a>00052 <span class="preprocessor">#include "parallel_sort.h"</span>
-<a name="l00053"></a>00053 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00054"></a>00054 <span class="preprocessor">#include "pipeline.h"</span>
-<a name="l00055"></a>00055 <span class="preprocessor">#include "queuing_mutex.h"</span>
-<a name="l00056"></a>00056 <span class="preprocessor">#include "queuing_rw_mutex.h"</span>
-<a name="l00057"></a>00057 <span class="preprocessor">#include "recursive_mutex.h"</span>
-<a name="l00058"></a>00058 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00059"></a>00059 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00060"></a>00060 <span class="preprocessor">#include "task.h"</span>
-<a name="l00061"></a>00061 <span class="preprocessor">#include "task_group.h"</span>
-<a name="l00062"></a>00062 <span class="preprocessor">#include "task_scheduler_init.h"</span>
-<a name="l00063"></a>00063 <span class="preprocessor">#include "task_scheduler_observer.h"</span>
-<a name="l00064"></a>00064 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00065"></a>00065 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00066"></a>00066 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00067"></a>00067 <span class="preprocessor">#include "tick_count.h"</span>
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_H */</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "combinable.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "concurrent_unordered_map.h"</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#include "concurrent_hash_map.h"</span>
+<a name="l00041"></a>00041 <span class="preprocessor">#include "concurrent_queue.h"</span>
+<a name="l00042"></a>00042 <span class="preprocessor">#include "concurrent_vector.h"</span>
+<a name="l00043"></a>00043 <span class="preprocessor">#include "critical_section.h"</span>
+<a name="l00044"></a>00044 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
+<a name="l00045"></a>00045 <span class="preprocessor">#include "mutex.h"</span>
+<a name="l00046"></a>00046 <span class="preprocessor">#include "null_mutex.h"</span>
+<a name="l00047"></a>00047 <span class="preprocessor">#include "null_rw_mutex.h"</span>
+<a name="l00048"></a>00048 <span class="preprocessor">#include "parallel_do.h"</span>
+<a name="l00049"></a>00049 <span class="preprocessor">#include "parallel_for.h"</span>
+<a name="l00050"></a>00050 <span class="preprocessor">#include "parallel_for_each.h"</span>
+<a name="l00051"></a>00051 <span class="preprocessor">#include "parallel_invoke.h"</span>
+<a name="l00052"></a>00052 <span class="preprocessor">#include "parallel_reduce.h"</span>
+<a name="l00053"></a>00053 <span class="preprocessor">#include "parallel_scan.h"</span>
+<a name="l00054"></a>00054 <span class="preprocessor">#include "parallel_sort.h"</span>
+<a name="l00055"></a>00055 <span class="preprocessor">#include "partitioner.h"</span>
+<a name="l00056"></a>00056 <span class="preprocessor">#include "pipeline.h"</span>
+<a name="l00057"></a>00057 <span class="preprocessor">#include "queuing_mutex.h"</span>
+<a name="l00058"></a>00058 <span class="preprocessor">#include "queuing_rw_mutex.h"</span>
+<a name="l00059"></a>00059 <span class="preprocessor">#include "reader_writer_lock.h"</span>
+<a name="l00060"></a>00060 <span class="preprocessor">#include "recursive_mutex.h"</span>
+<a name="l00061"></a>00061 <span class="preprocessor">#include "spin_mutex.h"</span>
+<a name="l00062"></a>00062 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
+<a name="l00063"></a>00063 <span class="preprocessor">#include "task.h"</span>
+<a name="l00064"></a>00064 <span class="preprocessor">#include "task_group.h"</span>
+<a name="l00065"></a>00065 <span class="preprocessor">#include "task_scheduler_init.h"</span>
+<a name="l00066"></a>00066 <span class="preprocessor">#include "task_scheduler_observer.h"</span>
+<a name="l00067"></a>00067 <span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00068"></a>00068 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00069"></a>00069 <span class="preprocessor">#include "tbb_thread.h"</span>
+<a name="l00070"></a>00070 <span class="preprocessor">#include "tick_count.h"</span>
+<a name="l00071"></a>00071
+<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00387.html b/doc/html/a00447.html
similarity index 51%
copy from doc/html/a00387.html
copy to doc/html/a00447.html
index 2217bed..0131842 100644
--- a/doc/html/a00387.html
+++ b/doc/html/a00447.html
@@ -42,157 +42,168 @@
<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_allocator_H</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_allocator_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <cstring></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
+<a name="l00026"></a>00026
+<a name="l00027"></a>00027 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00028"></a>00028 <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="l00029"></a>00029 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include <cstring></span>
<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC deallocate_via_handler_v3( <span class="keywordtype">void</span> *p );
-<a name="l00036"></a>00036
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
+<a name="l00035"></a>00035 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span>
+<a name="l00039"></a>00039 <span class="keyword">namespace </span>tbb {
<a name="l00040"></a>00040
-<a name="l00042"></a>00042 <span class="keywordtype">bool</span> __TBB_EXPORTED_FUNC is_malloc_used_v3();
-<a name="l00043"></a>00043 }
+<a name="l00042"></a>00042 <span class="keyword">namespace </span>internal {
+<a name="l00043"></a>00043
<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</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: 4100)</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="l00053"></a>00053
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00059"></a><a class="code" href="a00178.html">00059</a> <span class="keyword">class </span><a class="code" href="a00178.html">tbb_allocator</a> {
-<a name="l00060"></a>00060 <span class="keyword">public</span>:
-<a name="l00061"></a>00061 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00064"></a>00064 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00065"></a>00065 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00066"></a>00066 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00068"></a>00068 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> <a class="code" href="a00178.html">tbb_allocator<U></a> other;
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071
-<a name="l00073"></a><a class="code" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">00073</a> <span class="keyword">enum</span> <a class="code" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
-<a name="l00074"></a>00074 scalable,
-<a name="l00075"></a>00075 standard
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <a class="code" href="a00178.html">tbb_allocator</a>() throw() {}
-<a name="l00079"></a>00079 tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00083"></a>00083 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00084"></a>00084
-<a name="l00086"></a><a class="code" href="a00178.html#f6cb487b1bdce0b581f265a77dca6d53">00086</a> pointer <a class="code" href="a00178.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="l00087"></a>00087 <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
-<a name="l00088"></a>00088 }
-<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00091</a> <span class="keywordtype">void</span> <a class="code" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
-<a name="l00092"></a>00092 internal::deallocate_via_handler_v3(p);
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">00096</a> size_type <a class="code" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
-<a name="l00097"></a>00097 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00098"></a>00098 <span class="keywordflow">return</span> (max > 0 ? max : 1);
+<a name="l00046"></a>00046 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC deallocate_via_handler_v3( <span class="keywordtype">void</span> *p );
+<a name="l00047"></a>00047
+<a name="l00049"></a>00049
+<a name="l00050"></a>00050 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
+<a name="l00051"></a>00051
+<a name="l00053"></a>00053 <span class="keywordtype">bool</span> __TBB_EXPORTED_FUNC is_malloc_used_v3();
+<a name="l00054"></a>00054 }
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</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: 4100)</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="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="a00204.html">00070</a> <span class="keyword">class </span><a class="code" href="a00204.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;
+<a name="l00074"></a>00074 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
+<a name="l00075"></a>00075 <span class="keyword">typedef</span> value_type& reference;
+<a name="l00076"></a>00076 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
+<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="a00204.html">tbb_allocator<U></a> other;
+<a name="l00081"></a>00081 };
+<a name="l00082"></a>00082
+<a name="l00084"></a><a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">00084</a> <span class="keyword">enum</span> <a class="code" href="a00204.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="a00204.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="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a> pointer <a class="code" href="a00204.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="a00178.html#ab228ab9e324ed041c2226e1d717df5f">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00178.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="l00103"></a>00103
-<a name="l00105"></a><a class="code" href="a00178.html#ef133522bf55f05a605bee0763208281">00105</a> <span class="keywordtype">void</span> <a class="code" href="a00178.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
-<a name="l00106"></a>00106
-<a name="l00108"></a><a class="code" href="a00178.html#78701e7454ef8e1a25b5acd364367080">00108</a> <span class="keyword">static</span> <a class="code" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00178.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
+<a name="l00100"></a>00100
+<a name="l00102"></a><a class="code" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00204.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="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a> size_type <a class="code" href="a00204.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="l00112"></a>00112
-<a name="l00113"></a>00113 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span>
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">template</span><>
-<a name="l00120"></a><a class="code" href="a00179.html">00120</a> <span class="keyword">class </span><a class="code" href="a00178.html">tbb_allocator</a><void> {
-<a name="l00121"></a>00121 <span class="keyword">public</span>:
-<a name="l00122"></a>00122 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00125"></a>00125 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00126"></a>00126 <span class="keyword">typedef</span> <a class="code" href="a00178.html">tbb_allocator<U></a> other;
-<a name="l00127"></a>00127 };
-<a name="l00128"></a>00128 };
+<a name="l00111"></a>00111
+<a name="l00113"></a><a class="code" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00204.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="a00204.html#ef133522bf55f05a605bee0763208281">00116</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00117"></a>00117
+<a name="l00119"></a><a class="code" href="a00204.html#78701e7454ef8e1a25b5acd364367080">00119</a> <span class="keyword">static</span> <a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00204.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 };
+<a name="l00123"></a>00123
+<a name="l00124"></a>00124 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span>
<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00131"></a>00131 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00178.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00178.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00134"></a>00134 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> tbb_allocator<T>&, <span class="keyword">const</span> tbb_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00135"></a>00135
-<a name="l00137"></a>00137
-<a name="l00142"></a>00142 <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="l00143"></a><a class="code" href="a00186.html">00143</a> <span class="keyword">class </span><a class="code" href="a00186.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
-<a name="l00144"></a>00144 {
-<a name="l00145"></a>00145 <span class="keyword">public</span>:
-<a name="l00146"></a>00146 <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
-<a name="l00147"></a>00147 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00148"></a>00148 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00149"></a>00149 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00150"></a>00150 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::reference reference;
-<a name="l00151"></a>00151 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_reference const_reference;
-<a name="l00152"></a>00152 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
-<a name="l00153"></a>00153 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
-<a name="l00154"></a>00154 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00155"></a>00155 <span class="keyword">typedef</span> <a class="code" href="a00186.html">zero_allocator<U, Allocator></a> other;
-<a name="l00156"></a>00156 };
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <a class="code" href="a00186.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
-<a name="l00159"></a>00159 <a class="code" href="a00186.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
-<a name="l00160"></a>00160 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00161"></a>00161 <a class="code" href="a00186.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 pointer allocate(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
-<a name="l00164"></a>00164 pointer ptr = base_allocator_type::allocate( n, hint );
-<a name="l00165"></a>00165 std::memset( ptr, 0, n * <span class="keyword">sizeof</span>(value_type) );
-<a name="l00166"></a>00166 <span class="keywordflow">return</span> ptr;
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168 };
-<a name="l00169"></a>00169
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator>
-<a name="l00173"></a><a class="code" href="a00187.html">00173</a> <span class="keyword">class </span><a class="code" href="a00186.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
-<a name="l00174"></a>00174 <span class="keyword">public</span>:
-<a name="l00175"></a>00175 <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
-<a name="l00176"></a>00176 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00177"></a>00177 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00178"></a>00178 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00179"></a>00179 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00180"></a>00180 <span class="keyword">typedef</span> <a class="code" href="a00186.html">zero_allocator<U, Allocator></a> other;
-<a name="l00181"></a>00181 };
-<a name="l00182"></a>00182 };
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <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="l00185"></a>00185 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00186.html">zero_allocator<T2,B2></a> &b) {
-<a name="l00186"></a>00186 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188 <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="l00189"></a>00189 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> zero_allocator<T1,B1> &a, <span class="keyword">const</span> zero_allocator<T2,B2> &b) {
-<a name="l00190"></a>00190 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) != <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 } <span class="comment">// namespace tbb </span>
+<a name="l00130"></a>00130 <span class="keyword">template</span><>
+<a name="l00131"></a><a class="code" href="a00205.html">00131</a> <span class="keyword">class </span><a class="code" href="a00204.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="a00204.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="a00204.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00204.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="a00213.html">00154</a> <span class="keyword">class </span><a class="code" href="a00213.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;
+<a name="l00158"></a>00158 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
+<a name="l00159"></a>00159 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
+<a name="l00160"></a>00160 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
+<a name="l00161"></a>00161 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::reference reference;
+<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_reference const_reference;
+<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="a00213.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="a00213.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
+<a name="l00170"></a>00170 <a class="code" href="a00213.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00213.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="a00213.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00213.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 );
+<a name="l00176"></a>00176 std::memset( ptr, 0, n * <span class="keyword">sizeof</span>(value_type) );
+<a name="l00177"></a>00177 <span class="keywordflow">return</span> ptr;
+<a name="l00178"></a>00178 }
+<a name="l00179"></a>00179 };
+<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="a00214.html">00184</a> <span class="keyword">class </span><a class="code" href="a00213.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="a00213.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="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_allocator_H */</span>
+<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="a00213.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00213.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>
+<a name="l00200"></a>00200 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> zero_allocator<T1,B1> &a, <span class="keyword">const</span> zero_allocator<T2,B2> &b) {
+<a name="l00201"></a>00201 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) != <span class="keyword">static_cast</span>< B2<T2> >(b);
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 } <span class="comment">// namespace tbb </span>
+<a name="l00205"></a>00205
+<a name="l00206"></a>00206 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_allocator_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00391.html b/doc/html/a00451.html
similarity index 58%
copy from doc/html/a00391.html
copy to doc/html/a00451.html
index 3f7e059..266a9b4 100644
--- a/doc/html/a00391.html
+++ b/doc/html/a00451.html
@@ -76,82 +76,115 @@
<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
-<a name="l00070"></a>00070 <span class="preprocessor">#ifndef __TBB_EXCEPTIONS</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXCEPTIONS 1</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_EXCEPTIONS */</span>
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_SCHEDULER_OBSERVER 1</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="preprocessor">#ifndef __TBB_NEW_ITT_NOTIFY</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NEW_ITT_NOTIFY 1</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_NEW_ITT_NOTIFY */</span>
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="comment">/* TODO: The following condition should be extended as soon as new compilers/runtimes </span>
-<a name="l00084"></a>00084 <span class="comment"> with std::exception_ptr support appear. */</span>
-<a name="l00085"></a>00085 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span>
-<a name="l00087"></a>00087
-<a name="l00088"></a>00088 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 0</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 1</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00095"></a>00095 <span class="preprocessor"> #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00096"></a>00096 <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="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<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="l00088"></a>00088 <span class="preprocessor">#ifndef __TBB_COUNT_TASK_NODES</span>
+<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00091"></a>00091 <span class="preprocessor"></span>
+<a name="l00092"></a>00092 <span class="preprocessor">#ifndef __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_GROUP_CONTEXT 1</span>
+<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00095"></a>00095
+<a name="l00096"></a>00096 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
+<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_SCHEDULER_OBSERVER 1</span>
+<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
<a name="l00099"></a>00099
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span>
-<a name="l00104"></a>00104 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span>
-<a name="l00107"></a>00107 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00110"></a>00110
-<a name="l00113"></a>00113 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==4 && !defined(__INTEL_COMPILER)</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 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>
-<a name="l00123"></a>00123 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 0x1500 && !defined(__INTEL_COMPILER)</span>
+<a name="l00100"></a>00100 <span class="preprocessor">#ifndef __TBB_ARENA_PER_MASTER</span>
+<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ARENA_PER_MASTER 1</span>
+<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_ARENA_PER_MASTER */</span>
+<a name="l00103"></a>00103
+<a name="l00104"></a>00104 <span class="comment">/* TODO: The following condition should be extended as soon as new compilers/runtimes </span>
+<a name="l00105"></a>00105 <span class="comment"> with std::exception_ptr support appear. */</span>
+<a name="l00106"></a>00106 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))</span>
+<a name="l00107"></a>00107 <span class="preprocessor"></span>
+<a name="l00108"></a>00108
+<a name="l00109"></a>00109 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_EXCEPTION_PTR_PRESENT</span>
+<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 0</span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
+<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 1</span>
+<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00116"></a>00116 <span class="preprocessor"> #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
+<a name="l00117"></a>00117 <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="l00118"></a>00118 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00120"></a>00120
+<a name="l00121"></a>00121
+<a name="l00122"></a>00122 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
+<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
<a name="l00124"></a>00124 <span class="preprocessor"></span>
-<a name="l00126"></a>00126 <span class="preprocessor"> #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span>
-<a name="l00131"></a>00131 <span class="preprocessor"> #define __TBB_EXCEPTION_HANDLING_BROKEN 1</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00133"></a>00133 <span class="preprocessor"></span>
-<a name="l00134"></a>00134 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span>
-<a name="l00136"></a>00136 <span class="preprocessor"> #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</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="l00139"></a>00139 <span class="preprocessor">#if __FreeBSD__</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span>
-<a name="l00142"></a>00142 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span>
-<a name="l00146"></a>00146 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="preprocessor">#if __LRB__</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_config_lrb.h"</span>
-<a name="l00151"></a>00151 <span class="preprocessor">#endif</span>
+<a name="l00125"></a>00125 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span>
+<a name="l00128"></a>00128 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEFAULT_PARTITIONER */</span>
+<a name="l00130"></a>00130 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
+<a name="l00131"></a>00131
+<a name="l00134"></a>00134 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)</span>
+<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00137"></a>00137 <span class="preprocessor"></span>
+<a name="l00144"></a>00144 <span class="preprocessor">#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)</span>
+<a name="l00145"></a>00145 <span class="preprocessor"></span>
+<a name="l00148"></a>00148 <span class="preprocessor"> #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 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>
+<a name="l00151"></a>00151 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)</span>
<a name="l00152"></a>00152 <span class="preprocessor"></span>
-<a name="l00153"></a>00153 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
+<a name="l00154"></a>00154 <span class="preprocessor"> #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</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 __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__</span>
+<a name="l00159"></a>00159 <span class="preprocessor"></span>
+<a name="l00160"></a>00160 <span class="preprocessor"> #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1</span>
+<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00162"></a>00162 <span class="preprocessor"></span>
+<a name="l00163"></a>00163 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
+<a name="l00164"></a>00164 <span class="preprocessor"></span>
+<a name="l00165"></a>00165 <span class="preprocessor"> #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</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 __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)</span>
+<a name="l00169"></a>00169 <span class="preprocessor"></span>
+<a name="l00170"></a>00170 <span class="preprocessor"> #define __TBB_GCC_3_3_PROTECTED_BROKEN 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="l00173"></a>00173 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00174"></a>00174 <span class="preprocessor"></span>
+<a name="l00176"></a>00176 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span>
+<a name="l00180"></a>00180 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
+<a name="l00181"></a>00181 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
+<a name="l00182"></a>00182
+<a name="l00183"></a>00183 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span>
+<a name="l00186"></a>00186 <span class="preprocessor"> #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
+<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00188"></a>00188 <span class="preprocessor"></span>
+<a name="l00189"></a>00189
+<a name="l00190"></a>00190 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00392.html b/doc/html/a00452.html
similarity index 79%
rename from doc/html/a00392.html
rename to doc/html/a00452.html
index 588e541..5842d63 100644
--- a/doc/html/a00392.html
+++ b/doc/html/a00452.html
@@ -42,25 +42,24 @@
<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_config_lrb_H</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_config_lrb_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if !__LRB__</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor"> #error tbb_config_lrb.h should be included only when building for LRB platform</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00024"></a>00024 <span class="preprocessor"> #error tbb_config_lrb.h should be included only when building for LRB platform</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span>
+<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_LRB_NATIVE</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#if __TBB_LRB_NATIVE</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#define __TBB_FLOATING_POINT_BROKEN 1</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#define __TBB_rel_acq_fence __TBB_release_consistency_helper</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#if !__FreeBSD__</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor"> #error LRB compiler does not define __FreeBSD__ anymore. Check for the __TBB_XXX_BROKEN defined under __FreeBSD__</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__FreeBSD__ */</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#endif </span><span class="comment">/*__TBB_LRB_NATIVE*/</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_lrb_H */</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#define __TBB_FLOATING_POINT_BROKEN 1</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#define __TBB_rel_acq_fence __TBB_release_consistency_helper</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_Pause(x) _mm_delay_32(x)</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#if !__FreeBSD__</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #error LRB compiler does not define __FreeBSD__ anymore. Check for the __TBB_XXX_BROKEN defined under __FreeBSD__</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__FreeBSD__ */</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#endif </span><span class="comment">/*__TBB_LRB_NATIVE*/</span>
+<a name="l00039"></a>00039
+<a name="l00040"></a>00040 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_lrb_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00453.html b/doc/html/a00453.html
new file mode 100644
index 0000000..7777cd7
--- /dev/null
+++ b/doc/html/a00453.html
@@ -0,0 +1,321 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>tbb_exception.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>tbb_exception.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_exception_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_exception_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <stdexcept></span>
+<a name="l00033"></a>00033
+<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">#if __SUNPRO_CC</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#include <string></span> <span class="comment">// required to construct std exception classes</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="keyword">namespace </span>tbb {
+<a name="l00043"></a>00043
+<a name="l00045"></a><a class="code" href="a00147.html">00045</a> <span class="keyword">class </span><a class="code" href="a00147.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
+<a name="l00046"></a>00046 <span class="keyword">public</span>:
+<a name="l00047"></a>00047 <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="l00048"></a>00048 <span class="preprocessor">#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span> <span class="comment">/*override*/</span> ~<a class="code" href="a00147.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>};
+<a name="l00052"></a>00052
+<a name="l00054"></a><a class="code" href="a00168.html">00054</a> <span class="keyword">class </span><a class="code" href="a00168.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
+<a name="l00055"></a>00055 <span class="keyword">public</span>:
+<a name="l00056"></a>00056 <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="l00057"></a>00057 };
+<a name="l00058"></a>00058
+<a name="l00060"></a><a class="code" href="a00170.html">00060</a> <span class="keyword">class </span><a class="code" href="a00170.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
+<a name="l00061"></a>00061 <span class="keyword">public</span>:
+<a name="l00062"></a>00062 <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="l00063"></a>00063 };
+<a name="l00064"></a>00064
+<a name="l00066"></a><a class="code" href="a00169.html">00066</a> <span class="keyword">class </span><a class="code" href="a00169.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
+<a name="l00067"></a>00067 <span class="keyword">public</span>:
+<a name="l00068"></a>00068 <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="l00069"></a>00069 };
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071 <span class="keyword">namespace </span>internal {
+<a name="l00073"></a>00073 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075 <span class="keyword">enum</span> exception_id {
+<a name="l00076"></a>00076 eid_bad_alloc = 1,
+<a name="l00077"></a>00077 eid_bad_last_alloc,
+<a name="l00078"></a>00078 eid_nonpositive_step,
+<a name="l00079"></a>00079 eid_out_of_range,
+<a name="l00080"></a>00080 eid_segment_range_error,
+<a name="l00081"></a>00081 eid_index_range_error,
+<a name="l00082"></a>00082 eid_missing_wait,
+<a name="l00083"></a>00083 eid_invalid_multiple_scheduling,
+<a name="l00084"></a>00084 eid_improper_lock,
+<a name="l00085"></a>00085 eid_possible_deadlock,
+<a name="l00086"></a>00086 eid_operation_not_permitted,
+<a name="l00087"></a>00087 eid_condvar_wait_failed,
+<a name="l00088"></a>00088 eid_invalid_load_factor,
+<a name="l00089"></a>00089 eid_invalid_buckets_number,
+<a name="l00090"></a>00090 eid_invalid_swap,
+<a name="l00091"></a>00091 eid_reservation_length_error,
+<a name="l00092"></a>00092 eid_invalid_key,
+<a name="l00094"></a>00094
+<a name="l00096"></a>00096 eid_max
+<a name="l00097"></a>00097 };
+<a name="l00098"></a>00098
+<a name="l00100"></a>00100
+<a name="l00102"></a>00102 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
+<a name="l00103"></a>00103
+<a name="l00105"></a>00105 <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107 } <span class="comment">// namespace internal</span>
+<a name="l00108"></a>00108 } <span class="comment">// namespace tbb</span>
+<a name="l00109"></a>00109
+<a name="l00110"></a>00110 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00112"></a>00112 <span class="preprocessor">#include <exception></span>
+<a name="l00113"></a>00113 <span class="preprocessor">#include <typeinfo></span>
+<a name="l00114"></a>00114 <span class="preprocessor">#include <new></span>
+<a name="l00115"></a>00115
+<a name="l00116"></a>00116 <span class="keyword">namespace </span>tbb {
+<a name="l00117"></a>00117
+<a name="l00119"></a>00119
+<a name="l00139"></a><a class="code" href="a00206.html">00139</a> <span class="keyword">class </span><a class="code" href="a00206.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
+<a name="l00140"></a>00140 {
+<a name="l00144"></a>00144 <span class="keywordtype">void</span>* operator new ( size_t );
+<a name="l00145"></a>00145
+<a name="l00146"></a>00146 <span class="keyword">public</span>:
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 <span class="keyword">virtual</span> <a class="code" href="a00206.html">tbb_exception</a>* <a class="code" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00150"></a>00150
+<a name="l00152"></a>00152
+<a name="l00154"></a>00154 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00155"></a>00155
+<a name="l00157"></a>00157
+<a name="l00161"></a>00161 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 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="a00206.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00165"></a>00165
+<a name="l00167"></a>00167 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00168"></a>00168
+<a name="l00175"></a><a class="code" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">00175</a> <span class="keywordtype">void</span> <a class="code" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
+<a name="l00176"></a>00176 internal::deallocate_via_handler_v3(p);
+<a name="l00177"></a>00177 }
+<a name="l00178"></a>00178 };
+<a name="l00179"></a>00179
+<a name="l00181"></a>00181
+<a name="l00185"></a><a class="code" href="a00153.html">00185</a> <span class="keyword">class </span><a class="code" href="a00153.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00206.html">tbb_exception</a>
+<a name="l00186"></a>00186 {
+<a name="l00187"></a>00187 <span class="keyword">public</span>:
+<a name="l00188"></a>00188 <a class="code" href="a00153.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00153.html">captured_exception</a>& src )
+<a name="l00189"></a>00189 : <a class="code" href="a00206.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
+<a name="l00190"></a>00190 {
+<a name="l00191"></a>00191 set(src.<a class="code" href="a00153.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00153.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00192"></a>00192 }
+<a name="l00193"></a>00193
+<a name="l00194"></a>00194 <a class="code" href="a00153.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="l00195"></a>00195 : my_dynamic(<span class="keyword">false</span>)
+<a name="l00196"></a>00196 {
+<a name="l00197"></a>00197 set(name_, info);
+<a name="l00198"></a>00198 }
+<a name="l00199"></a>00199
+<a name="l00200"></a>00200 __TBB_EXPORTED_METHOD ~<a class="code" href="a00153.html">captured_exception</a> () <span class="keywordflow">throw</span>() {
+<a name="l00201"></a>00201 clear();
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <a class="code" href="a00153.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00153.html">captured_exception</a>& src ) {
+<a name="l00205"></a>00205 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
+<a name="l00206"></a>00206 clear();
+<a name="l00207"></a>00207 set(src.<a class="code" href="a00153.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00153.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00208"></a>00208 }
+<a name="l00209"></a>00209 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211
+<a name="l00212"></a>00212 <span class="comment">/*override*/</span>
+<a name="l00213"></a>00213 <a class="code" href="a00153.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
+<a name="l00214"></a>00214
+<a name="l00215"></a>00215 <span class="comment">/*override*/</span>
+<a name="l00216"></a>00216 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00217"></a>00217
+<a name="l00218"></a>00218 <span class="comment">/*override*/</span>
+<a name="l00219"></a><a class="code" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">00219</a> <span class="keywordtype">void</span> <a class="code" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
+<a name="l00220"></a>00220
+<a name="l00221"></a>00221 <span class="comment">/*override*/</span>
+<a name="l00222"></a>00222 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
+<a name="l00223"></a>00223
+<a name="l00224"></a>00224 <span class="comment">/*override*/</span>
+<a name="l00225"></a>00225 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
+<a name="l00226"></a>00226
+<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
+<a name="l00228"></a>00228 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
+<a name="l00229"></a>00229
+<a name="l00230"></a>00230 private:
+<a name="l00232"></a>00232 <a class="code" href="a00153.html">captured_exception</a>() {}
+<a name="l00233"></a>00233
+<a name="l00235"></a>00235 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
+<a name="l00236"></a>00236
+<a name="l00237"></a>00237 <span class="keywordtype">bool</span> my_dynamic;
+<a name="l00238"></a>00238 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
+<a name="l00239"></a>00239 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_info;
+<a name="l00240"></a>00240 };
+<a name="l00241"></a>00241
+<a name="l00243"></a>00243
+<a name="l00247"></a>00247 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
+<a name="l00248"></a><a class="code" href="a00171.html">00248</a> <span class="keyword">class </span><a class="code" href="a00171.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00206.html">tbb_exception</a>
+<a name="l00249"></a>00249 {
+<a name="l00250"></a>00250 <span class="keyword">typedef</span> <a class="code" href="a00171.html">movable_exception<ExceptionData></a> <a class="code" href="a00171.html">self_type</a>;
+<a name="l00251"></a>00251
+<a name="l00252"></a>00252 <span class="keyword">public</span>:
+<a name="l00253"></a>00253 <a class="code" href="a00171.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
+<a name="l00254"></a>00254 : <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
+<a name="l00255"></a>00255 , my_dynamic(<span class="keyword">false</span>)
+<a name="l00256"></a>00256 , my_exception_name(
+<a name="l00257"></a>00257 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
+<a name="l00258"></a>00258 <span class="keyword">typeid</span>(<a class="code" href="a00171.html">self_type</a>).<a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
+<a name="l00259"></a>00259 #<span class="keywordflow">else</span> <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00260"></a>00260 <span class="stringliteral">"movable_exception"</span>
+<a name="l00261"></a>00261 #endif <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00262"></a>00262 )
+<a name="l00263"></a>00263 {}
+<a name="l00264"></a>00264
+<a name="l00265"></a>00265 <a class="code" href="a00171.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
+<a name="l00266"></a>00266 : <a class="code" href="a00206.html">tbb_exception</a>(src)
+<a name="l00267"></a>00267 , <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
+<a name="l00268"></a>00268 , my_dynamic(<span class="keyword">false</span>)
+<a name="l00269"></a>00269 , my_exception_name(src.<a class="code" href="a00171.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
+<a name="l00270"></a>00270 {}
+<a name="l00271"></a>00271
+<a name="l00272"></a>00272 ~<a class="code" href="a00171.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
+<a name="l00273"></a>00273
+<a name="l00274"></a>00274 <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& src ) {
+<a name="l00275"></a>00275 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
+<a name="l00276"></a>00276 <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00277"></a>00277 my_exception_name = src.<a class="code" href="a00171.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
+<a name="l00278"></a>00278 }
+<a name="l00279"></a>00279 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00280"></a>00280 }
+<a name="l00281"></a>00281
+<a name="l00282"></a>00282 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00283"></a>00283
+<a name="l00284"></a>00284 <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="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00285"></a>00285
+<a name="l00286"></a><a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">00286</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
+<a name="l00287"></a>00287
+<a name="l00288"></a><a class="code" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">00288</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
+<a name="l00289"></a>00289
+<a name="l00290"></a>00290 <span class="comment">/*override*/</span>
+<a name="l00291"></a><a class="code" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">00291</a> <a class="code" href="a00171.html">movable_exception</a>* <a class="code" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
+<a name="l00292"></a>00292 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00171.html">movable_exception</a>));
+<a name="l00293"></a>00293 <span class="keywordflow">if</span> ( e ) {
+<a name="l00294"></a>00294 ::new (e) movable_exception(*<span class="keyword">this</span>);
+<a name="l00295"></a>00295 ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
+<a name="l00296"></a>00296 }
+<a name="l00297"></a>00297 <span class="keywordflow">return</span> (movable_exception*)e;
+<a name="l00298"></a>00298 }
+<a name="l00299"></a>00299 <span class="comment">/*override*/</span>
+<a name="l00300"></a><a class="code" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">00300</a> <span class="keywordtype">void</span> <a class="code" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
+<a name="l00301"></a>00301 __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
+<a name="l00302"></a>00302 <span class="keywordflow">if</span> ( my_dynamic ) {
+<a name="l00303"></a>00303 this->~<a class="code" href="a00171.html">movable_exception</a>();
+<a name="l00304"></a>00304 internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
+<a name="l00305"></a>00305 }
+<a name="l00306"></a>00306 }
+<a name="l00307"></a>00307 <span class="comment">/*override*/</span>
+<a name="l00308"></a><a class="code" href="a00171.html#17cffba35811c92b7e65d63506b69602">00308</a> <span class="keywordtype">void</span> <a class="code" href="a00171.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
+<a name="l00309"></a>00309
+<a name="l00310"></a>00310 <span class="keyword">protected</span>:
+<a name="l00312"></a><a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">00312</a> ExceptionData <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00313"></a>00313
+<a name="l00314"></a>00314 <span class="keyword">private</span>:
+<a name="l00316"></a>00316 <span class="keywordtype">bool</span> my_dynamic;
+<a name="l00317"></a>00317
+<a name="l00319"></a>00319
+<a name="l00320"></a>00320 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
+<a name="l00321"></a>00321 };
+<a name="l00322"></a>00322
+<a name="l00323"></a>00323 <span class="preprocessor">#if !TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00324"></a>00324 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
+<a name="l00325"></a>00325
+<a name="l00327"></a>00327
+<a name="l00329"></a><a class="code" href="a00207.html">00329</a> <span class="keyword">class </span><a class="code" href="a00207.html">tbb_exception_ptr</a> {
+<a name="l00330"></a>00330 std::exception_ptr my_ptr;
+<a name="l00331"></a>00331
+<a name="l00332"></a>00332 <span class="keyword">public</span>:
+<a name="l00333"></a>00333 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ();
+<a name="l00334"></a>00334 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00206.html">tbb_exception</a>& tag );
+<a name="l00336"></a>00336 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00153.html">captured_exception</a>& src );
+<a name="l00337"></a>00337
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00341"></a>00341
+<a name="l00343"></a><a class="code" href="a00207.html#292832fd5c523e3d8081a22247840a1d">00343</a> <span class="keywordtype">void</span> <a class="code" href="a00207.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
+<a name="l00344"></a>00344
+<a name="l00345"></a>00345 <span class="keyword">private</span>:
+<a name="l00346"></a>00346 <a class="code" href="a00207.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
+<a name="l00347"></a>00347 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00153.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
+<a name="l00348"></a>00348 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
+<a name="l00349"></a>00349
+<a name="l00350"></a>00350 } <span class="comment">// namespace internal</span>
+<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353 } <span class="comment">// namespace tbb</span>
+<a name="l00354"></a>00354
+<a name="l00355"></a>00355 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00356"></a>00356
+<a name="l00357"></a>00357 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_exception_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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/a00394.html b/doc/html/a00454.html
similarity index 53%
rename from doc/html/a00394.html
rename to doc/html/a00454.html
index bfe97d6..a8b9aaa 100644
--- a/doc/html/a00394.html
+++ b/doc/html/a00454.html
@@ -58,546 +58,594 @@
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_ia32.h"</span>
<a name="l00038"></a>00038 <span class="preprocessor">#elif defined(_M_AMD64) </span>
<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_intel64.h"</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#else</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#error Unsupported platform</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="preprocessor">#ifdef _MANAGED</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span>
-<a name="l00048"></a>00048 <span class="preprocessor">#elif __linux__ || __FreeBSD__</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#elif _XBOX </span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include "machine/xbox360_ppc.h"</span>
+<a name="l00042"></a>00042 <span class="preprocessor">#else</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#error Unsupported platform</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">#ifdef _MANAGED</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</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 __i386__</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00052"></a>00052 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00054"></a>00054 <span class="preprocessor">#elif __ia64__</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia64.h"</span>
-<a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span>
-<a name="l00058"></a>00058 <span class="preprocessor">#elif __APPLE__</span>
+<a name="l00050"></a>00050 <span class="preprocessor">#elif __linux__ || __FreeBSD__</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>
+<a name="l00052"></a>00052 <span class="preprocessor">#if __i386__</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
+<a name="l00054"></a>00054 <span class="preprocessor">#elif __x86_64__</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
+<a name="l00056"></a>00056 <span class="preprocessor">#elif __ia64__</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia64.h"</span>
+<a name="l00058"></a>00058 <span class="preprocessor">#endif</span>
<a name="l00059"></a>00059 <span class="preprocessor"></span>
-<a name="l00060"></a>00060 <span class="preprocessor">#if __i386__</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00062"></a>00062 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00064"></a>00064 <span class="preprocessor">#elif __POWERPC__</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor">#include "machine/mac_ppc.h"</span>
-<a name="l00066"></a>00066 <span class="preprocessor">#endif</span>
-<a name="l00067"></a>00067 <span class="preprocessor"></span>
-<a name="l00068"></a>00068 <span class="preprocessor">#elif _AIX</span>
+<a name="l00060"></a>00060 <span class="preprocessor">#elif __APPLE__</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span>
+<a name="l00062"></a>00062 <span class="preprocessor">#if __i386__</span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
+<a name="l00064"></a>00064 <span class="preprocessor">#elif __x86_64__</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
+<a name="l00066"></a>00066 <span class="preprocessor">#elif __POWERPC__</span>
+<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor">#include "machine/mac_ppc.h"</span>
+<a name="l00068"></a>00068 <span class="preprocessor">#endif</span>
<a name="l00069"></a>00069 <span class="preprocessor"></span>
-<a name="l00070"></a>00070 <span class="preprocessor">#include "machine/ibm_aix51.h"</span>
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
-<a name="l00073"></a>00073 <span class="preprocessor"></span>
-<a name="l00074"></a>00074 <span class="preprocessor">#define __asm__ asm </span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define __volatile__ volatile</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#if __i386 || __i386__</span>
-<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00078"></a>00078 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00080"></a>00080 <span class="preprocessor">#elif __sparc</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#include "machine/sunos_sparc.h"</span>
-<a name="l00082"></a>00082 <span class="preprocessor">#endif</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span>
+<a name="l00070"></a>00070 <span class="preprocessor">#elif _AIX</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span>
+<a name="l00072"></a>00072 <span class="preprocessor">#include "machine/ibm_aix51.h"</span>
+<a name="l00073"></a>00073
+<a name="l00074"></a>00074 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span>
+<a name="l00076"></a>00076 <span class="preprocessor">#define __asm__ asm </span>
+<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#define __volatile__ volatile</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#if __i386 || __i386__</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
+<a name="l00080"></a>00080 <span class="preprocessor">#elif __x86_64__</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
+<a name="l00082"></a>00082 <span class="preprocessor">#elif __sparc</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#include "machine/sunos_sparc.h"</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="preprocessor">#if !defined(__TBB_CompareAndSwap4) \</span>
-<a name="l00087"></a>00087 <span class="preprocessor"> || !defined(__TBB_CompareAndSwap8) \</span>
-<a name="l00088"></a>00088 <span class="preprocessor"> || !defined(__TBB_Yield) \</span>
-<a name="l00089"></a>00089 <span class="preprocessor"> || !defined(__TBB_release_consistency_helper)</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#error Minimal requirements for tbb_machine.h not satisfied </span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span>
-<a name="l00093"></a>00093 <span class="preprocessor">#ifndef __TBB_load_with_acquire</span>
-<a name="l00095"></a>00095 <span class="preprocessor"> template<typename T></span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span> <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00097"></a>00097 T temp = location;
-<a name="l00098"></a>00098 __TBB_release_consistency_helper();
-<a name="l00099"></a>00099 <span class="keywordflow">return</span> temp;
-<a name="l00100"></a>00100 }
-<a name="l00101"></a>00101 <span class="preprocessor">#endif</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span>
-<a name="l00103"></a>00103 <span class="preprocessor">#ifndef __TBB_store_with_release</span>
-<a name="l00105"></a>00105 <span class="preprocessor"> template<typename T, typename V></span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span> <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="l00107"></a>00107 __TBB_release_consistency_helper();
-<a name="l00108"></a>00108 location = T(value);
-<a name="l00109"></a>00109 }
-<a name="l00110"></a>00110 <span class="preprocessor">#endif</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span>
-<a name="l00112"></a>00112 <span class="preprocessor">#ifndef __TBB_Pause</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
-<a name="l00114"></a>00114 __TBB_Yield();
-<a name="l00115"></a>00115 }
-<a name="l00116"></a>00116 <span class="preprocessor">#endif</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>
-<a name="l00118"></a>00118 <span class="keyword">namespace </span>tbb {
-<a name="l00119"></a>00119 <span class="keyword">namespace </span>internal {
-<a name="l00120"></a>00120
+<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
+<a name="l00087"></a>00087 <span class="preprocessor"></span>
+<a name="l00088"></a>00088 <span class="preprocessor">#if !defined(__TBB_CompareAndSwap4) \</span>
+<a name="l00089"></a>00089 <span class="preprocessor"> || !defined(__TBB_CompareAndSwap8) \</span>
+<a name="l00090"></a>00090 <span class="preprocessor"> || !defined(__TBB_Yield) \</span>
+<a name="l00091"></a>00091 <span class="preprocessor"> || !defined(__TBB_release_consistency_helper)</span>
+<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#error Minimal requirements for tbb_machine.h not satisfied </span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00094"></a>00094 <span class="preprocessor"></span>
+<a name="l00095"></a>00095 <span class="preprocessor">#ifndef __TBB_load_with_acquire</span>
+<a name="l00097"></a>00097 <span class="preprocessor"> template<typename T></span>
+<a name="l00098"></a>00098 <span class="preprocessor"></span> <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
+<a name="l00099"></a>00099 T temp = location;
+<a name="l00100"></a>00100 __TBB_release_consistency_helper();
+<a name="l00101"></a>00101 <span class="keywordflow">return</span> temp;
+<a name="l00102"></a>00102 }
+<a name="l00103"></a>00103 <span class="preprocessor">#endif</span>
+<a name="l00104"></a>00104 <span class="preprocessor"></span>
+<a name="l00105"></a>00105 <span class="preprocessor">#ifndef __TBB_store_with_release</span>
+<a name="l00107"></a>00107 <span class="preprocessor"> template<typename T, typename V></span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span> <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="l00109"></a>00109 __TBB_release_consistency_helper();
+<a name="l00110"></a>00110 location = T(value);
+<a name="l00111"></a>00111 }
+<a name="l00112"></a>00112 <span class="preprocessor">#endif</span>
+<a name="l00113"></a>00113 <span class="preprocessor"></span>
+<a name="l00114"></a>00114 <span class="preprocessor">#ifndef __TBB_Pause</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
+<a name="l00116"></a>00116 __TBB_Yield();
+<a name="l00117"></a>00117 }
+<a name="l00118"></a>00118 <span class="preprocessor">#endif</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span>
+<a name="l00120"></a>00120 <span class="keyword">namespace </span>tbb {
+<a name="l00121"></a>00121 <span class="keyword">namespace </span>internal {
<a name="l00122"></a>00122
-<a name="l00123"></a><a class="code" href="a00124.html">00123</a> <span class="keyword">class </span><a class="code" href="a00124.html">atomic_backoff</a> {
-<a name="l00125"></a>00125
-<a name="l00127"></a>00127 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
-<a name="l00128"></a>00128 int32_t count;
-<a name="l00129"></a>00129 <span class="keyword">public</span>:
-<a name="l00130"></a>00130 <a class="code" href="a00124.html">atomic_backoff</a>() : count(1) {}
-<a name="l00131"></a>00131
-<a name="l00133"></a><a class="code" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">00133</a> <span class="keywordtype">void</span> <a class="code" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
-<a name="l00134"></a>00134 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00135"></a>00135 __TBB_Pause(count);
-<a name="l00136"></a>00136 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00137"></a>00137 count*=2;
-<a name="l00138"></a>00138 } <span class="keywordflow">else</span> {
-<a name="l00139"></a>00139 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
-<a name="l00140"></a>00140 __TBB_Yield();
-<a name="l00141"></a>00141 }
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="comment">// pause for a few times and then return false immediately.</span>
-<a name="l00145"></a>00145 <span class="keywordtype">bool</span> bounded_pause() {
-<a name="l00146"></a>00146 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00147"></a>00147 __TBB_Pause(count);
-<a name="l00148"></a>00148 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00149"></a>00149 count*=2;
-<a name="l00150"></a>00150 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00151"></a>00151 } <span class="keywordflow">else</span> {
-<a name="l00152"></a>00152 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00153"></a>00153 }
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="keywordtype">void</span> reset() {
-<a name="l00157"></a>00157 count = 1;
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159 };
-<a name="l00160"></a>00160
+<a name="l00124"></a>00124
+<a name="l00125"></a><a class="code" href="a00145.html">00125</a> <span class="keyword">class </span><a class="code" href="a00145.html">atomic_backoff</a> {
+<a name="l00127"></a>00127
+<a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
+<a name="l00130"></a>00130 int32_t count;
+<a name="l00131"></a>00131 <span class="keyword">public</span>:
+<a name="l00132"></a>00132 <a class="code" href="a00145.html">atomic_backoff</a>() : count(1) {}
+<a name="l00133"></a>00133
+<a name="l00135"></a><a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">00135</a> <span class="keywordtype">void</span> <a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
+<a name="l00136"></a>00136 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00137"></a>00137 __TBB_Pause(count);
+<a name="l00138"></a>00138 <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00139"></a>00139 count*=2;
+<a name="l00140"></a>00140 } <span class="keywordflow">else</span> {
+<a name="l00141"></a>00141 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
+<a name="l00142"></a>00142 __TBB_Yield();
+<a name="l00143"></a>00143 }
+<a name="l00144"></a>00144 }
+<a name="l00145"></a>00145
+<a name="l00146"></a>00146 <span class="comment">// pause for a few times and then return false immediately.</span>
+<a name="l00147"></a>00147 <span class="keywordtype">bool</span> bounded_pause() {
+<a name="l00148"></a>00148 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00149"></a>00149 __TBB_Pause(count);
+<a name="l00150"></a>00150 <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00151"></a>00151 count*=2;
+<a name="l00152"></a>00152 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00153"></a>00153 } <span class="keywordflow">else</span> {
+<a name="l00154"></a>00154 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00155"></a>00155 }
+<a name="l00156"></a>00156 }
+<a name="l00157"></a>00157
+<a name="l00158"></a>00158 <span class="keywordtype">void</span> reset() {
+<a name="l00159"></a>00159 count = 1;
+<a name="l00160"></a>00160 }
+<a name="l00161"></a>00161 };
<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00164"></a>00164 <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="l00165"></a>00165 atomic_backoff backoff;
-<a name="l00166"></a>00166 <span class="keywordflow">while</span>( location==value ) backoff.pause();
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168
+<a name="l00164"></a>00164
+<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00166"></a>00166 <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="l00167"></a>00167 atomic_backoff backoff;
+<a name="l00168"></a>00168 <span class="keywordflow">while</span>( location==value ) backoff.pause();
+<a name="l00169"></a>00169 }
<a name="l00170"></a>00170
-<a name="l00171"></a>00171 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00172"></a>00172 <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="l00173"></a>00173 atomic_backoff backoff;
-<a name="l00174"></a>00174 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
-<a name="l00178"></a>00178 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
-<a name="l00179"></a>00179 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
-<a name="l00180"></a>00180 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00181"></a>00181 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
-<a name="l00182"></a>00182 <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
-<a name="l00183"></a>00183 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
-<a name="l00185"></a>00185 <span class="preprocessor">#else</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
-<a name="l00187"></a>00187 <span class="preprocessor">#endif</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
-<a name="l00189"></a>00189 atomic_backoff b;
-<a name="l00190"></a>00190 uint32_t result;
-<a name="l00191"></a>00191 <span class="keywordflow">for</span>(;;) {
-<a name="l00192"></a>00192 result = *base; <span class="comment">// reload the base value which might change during the pause</span>
-<a name="l00193"></a>00193 uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
-<a name="l00194"></a>00194 uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
-<a name="l00195"></a>00195 <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence. </span>
-<a name="l00196"></a>00196 result = __TBB_CompareAndSwap4( base, new_value, old_value );
-<a name="l00197"></a>00197 <span class="keywordflow">if</span>( result==old_value <span class="comment">// CAS succeeded</span>
-<a name="l00198"></a>00198 || ((result^old_value)&mask)!=0 ) <span class="comment">// CAS failed and the bits of interest have changed</span>
-<a name="l00199"></a>00199 <span class="keywordflow">break</span>;
-<a name="l00200"></a>00200 <span class="keywordflow">else</span> <span class="comment">// CAS failed but the bits of interest left unchanged</span>
-<a name="l00201"></a>00201 b.pause();
-<a name="l00202"></a>00202 }
-<a name="l00203"></a>00203 <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
-<a name="l00204"></a>00204 }
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00207"></a>00207 <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="l00208"></a>00208 <span class="keywordflow">return</span> __TBB_CompareAndSwapW((T *)ptr,value,comparand);
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210
-<a name="l00211"></a>00211 <span class="keyword">template</span><>
-<a name="l00212"></a>00212 <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="l00213"></a>00213 #ifdef __TBB_CompareAndSwap1
-<a name="l00214"></a>00214 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(ptr,value,comparand);
-<a name="l00215"></a>00215 <span class="preprocessor">#else</span>
-<a name="l00216"></a>00216 <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="l00217"></a>00217 <span class="preprocessor">#endif</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span>}
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 <span class="keyword">template</span><>
-<a name="l00221"></a>00221 <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="l00222"></a>00222 #ifdef __TBB_CompareAndSwap2
-<a name="l00223"></a>00223 <span class="keywordflow">return</span> __TBB_CompareAndSwap2(ptr,value,comparand);
-<a name="l00224"></a>00224 <span class="preprocessor">#else</span>
-<a name="l00225"></a>00225 <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="l00226"></a>00226 <span class="preprocessor">#endif</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span>}
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">template</span><>
-<a name="l00230"></a>00230 <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="l00231"></a>00231 <span class="keywordflow">return</span> __TBB_CompareAndSwap4(ptr,value,comparand);
-<a name="l00232"></a>00232 }
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 <span class="keyword">template</span><>
-<a name="l00235"></a>00235 <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="l00236"></a>00236 <span class="keywordflow">return</span> __TBB_CompareAndSwap8(ptr,value,comparand);
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238
-<a name="l00239"></a>00239 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00240"></a>00240 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
-<a name="l00241"></a>00241 atomic_backoff b;
-<a name="l00242"></a>00242 T result;
-<a name="l00243"></a>00243 <span class="keywordflow">for</span>(;;) {
-<a name="l00244"></a>00244 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00245"></a>00245 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence. </span>
-<a name="l00246"></a>00246 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
-<a name="l00247"></a>00247 <span class="keywordflow">break</span>;
-<a name="l00248"></a>00248 b.pause();
-<a name="l00249"></a>00249 }
-<a name="l00250"></a>00250 <span class="keywordflow">return</span> result;
-<a name="l00251"></a>00251 }
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00254"></a>00254 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
-<a name="l00255"></a>00255 atomic_backoff b;
-<a name="l00256"></a>00256 T result;
-<a name="l00257"></a>00257 <span class="keywordflow">for</span>(;;) {
-<a name="l00258"></a>00258 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00259"></a>00259 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
-<a name="l00260"></a>00260 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
-<a name="l00261"></a>00261 <span class="keywordflow">break</span>;
-<a name="l00262"></a>00262 b.pause();
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264 <span class="keywordflow">return</span> result;
-<a name="l00265"></a>00265 }
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
-<a name="l00268"></a>00268 <span class="comment">// strict as type T. Type type should have a trivial default constructor and destructor, so that</span>
-<a name="l00269"></a>00269 <span class="comment">// arrays of that type can be declared without initializers. </span>
-<a name="l00270"></a>00270 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
-<a name="l00271"></a>00271 <span class="comment">// to a type bigger than T.</span>
-<a name="l00272"></a>00272 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
-<a name="l00273"></a>00273 <span class="comment">// strictest alignment is 16.</span>
-<a name="l00274"></a>00274 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
-<a name="l00275"></a>00275 <span class="preprocessor"></span>
-<a name="l00276"></a>00276 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC</span>
-<a name="l00277"></a>00277 <span class="preprocessor"></span><span class="keyword">struct </span>__TBB_machine_type_with_strictest_alignment {
-<a name="l00278"></a>00278 <span class="keywordtype">int</span> member[4];
-<a name="l00279"></a>00279 } __attribute__((aligned(16)));
-<a name="l00280"></a>00280 <span class="preprocessor">#elif _MSC_VER</span>
-<a name="l00281"></a>00281 <span class="preprocessor"></span>__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
-<a name="l00282"></a>00282 <span class="keywordtype">int</span> member[4];
-<a name="l00283"></a>00283 };
-<a name="l00284"></a>00284 <span class="preprocessor">#else</span>
-<a name="l00285"></a>00285 <span class="preprocessor"></span><span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00286"></a>00286 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00287"></a>00287 <span class="preprocessor"></span>
-<a name="l00288"></a>00288 <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="l00289"></a>00289 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<1> { <span class="keywordtype">char</span> member; };
-<a name="l00290"></a>00290 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
-<a name="l00291"></a>00291 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
-<a name="l00292"></a>00292 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
-<a name="l00293"></a>00293
-<a name="l00294"></a>00294 <span class="preprocessor">#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2 </span>
-<a name="l00296"></a>00296 <span class="preprocessor"></span>
-<a name="l00298"></a>00298 <span class="preprocessor">template<size_t Size, typename T> </span>
-<a name="l00299"></a><a class="code" href="a00185.html">00299</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00185.html">work_around_alignment_bug</a> {
-<a name="l00300"></a>00300 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00301"></a>00301 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof(T);
-<a name="l00302"></a>00302 <span class="preprocessor">#else</span>
-<a name="l00303"></a>00303 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof__(T);
-<a name="l00304"></a>00304 <span class="preprocessor">#endif</span>
-<a name="l00305"></a>00305 <span class="preprocessor"></span>};
-<a name="l00306"></a>00306 <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="l00307"></a>00307 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__ || __SUNPRO_CC</span>
-<a name="l00308"></a>00308 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)></span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00310"></a>00310 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00311"></a>00311 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00312"></a>00312 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* ____TBB_TypeWithAlignmentAtLeastAsStrict */</span>
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 } <span class="comment">// namespace internal</span>
-<a name="l00315"></a>00315 } <span class="comment">// namespace tbb</span>
-<a name="l00316"></a>00316
-<a name="l00317"></a>00317 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1</span>
-<a name="l00318"></a>00318 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00320"></a>00320 <span class="preprocessor"></span>
-<a name="l00321"></a>00321 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2 </span>
-<a name="l00322"></a>00322 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
-<a name="l00323"></a>00323 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00324"></a>00324 <span class="preprocessor"></span>
-<a name="l00325"></a>00325 <span class="preprocessor">#ifndef __TBB_CompareAndSwapW</span>
-<a name="l00326"></a>00326 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00327"></a>00327 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00328"></a>00328 <span class="preprocessor"></span>
-<a name="l00329"></a>00329 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1</span>
-<a name="l00330"></a>00330 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
-<a name="l00331"></a>00331 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00332"></a>00332 <span class="preprocessor"></span>
-<a name="l00333"></a>00333 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2</span>
-<a name="l00334"></a>00334 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
-<a name="l00335"></a>00335 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00336"></a>00336 <span class="preprocessor"></span>
-<a name="l00337"></a>00337 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4</span>
-<a name="l00338"></a>00338 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
-<a name="l00339"></a>00339 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00340"></a>00340 <span class="preprocessor"></span>
-<a name="l00341"></a>00341 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8</span>
-<a name="l00342"></a>00342 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
-<a name="l00343"></a>00343 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00344"></a>00344 <span class="preprocessor"></span>
-<a name="l00345"></a>00345 <span class="preprocessor">#ifndef __TBB_FetchAndAddW</span>
-<a name="l00346"></a>00346 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00347"></a>00347 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00348"></a>00348 <span class="preprocessor"></span>
-<a name="l00349"></a>00349 <span class="preprocessor">#ifndef __TBB_FetchAndStore1</span>
-<a name="l00350"></a>00350 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
-<a name="l00351"></a>00351 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00352"></a>00352 <span class="preprocessor"></span>
-<a name="l00353"></a>00353 <span class="preprocessor">#ifndef __TBB_FetchAndStore2</span>
-<a name="l00354"></a>00354 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
-<a name="l00355"></a>00355 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00356"></a>00356 <span class="preprocessor"></span>
-<a name="l00357"></a>00357 <span class="preprocessor">#ifndef __TBB_FetchAndStore4</span>
-<a name="l00358"></a>00358 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
-<a name="l00359"></a>00359 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00360"></a>00360 <span class="preprocessor"></span>
-<a name="l00361"></a>00361 <span class="preprocessor">#ifndef __TBB_FetchAndStore8</span>
-<a name="l00362"></a>00362 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_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_FetchAndStoreW</span>
-<a name="l00366"></a>00366 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_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">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00370"></a>00370 <span class="preprocessor"></span>
-<a name="l00371"></a>00371 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00372"></a>00372 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1</span>
-<a name="l00373"></a>00373 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00374"></a>00374 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1acquire</span>
-<a name="l00375"></a>00375 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00376"></a>00376 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00377"></a>00377 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1release</span>
-<a name="l00378"></a>00378 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence</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_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00382"></a>00382 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2</span>
-<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00384"></a>00384 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2acquire</span>
-<a name="l00385"></a>00385 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2release</span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00389"></a>00389 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00390"></a>00390 <span class="preprocessor"></span>
-<a name="l00391"></a>00391 <span class="preprocessor">#ifndef __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00392"></a>00392 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4</span>
-<a name="l00393"></a>00393 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00394"></a>00394 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4acquire</span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00396"></a>00396 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00397"></a>00397 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4release</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence</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_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8</span>
-<a name="l00403"></a>00403 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00404"></a>00404 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8acquire</span>
-<a name="l00405"></a>00405 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00406"></a>00406 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00407"></a>00407 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8release</span>
-<a name="l00408"></a>00408 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00409"></a>00409 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00410"></a>00410 <span class="preprocessor"></span>
-<a name="l00411"></a>00411 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00412"></a>00412 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1</span>
-<a name="l00413"></a>00413 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00414"></a>00414 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1acquire</span>
-<a name="l00415"></a>00415 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00416"></a>00416 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1release</span>
-<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00420"></a>00420 <span class="preprocessor"></span>
-<a name="l00421"></a>00421 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00422"></a>00422 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2</span>
-<a name="l00423"></a>00423 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00424"></a>00424 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2acquire</span>
-<a name="l00425"></a>00425 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2release</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00429"></a>00429 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00430"></a>00430 <span class="preprocessor"></span>
-<a name="l00431"></a>00431 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4</span>
-<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00434"></a>00434 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4acquire</span>
-<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00437"></a>00437 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4release</span>
-<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00440"></a>00440 <span class="preprocessor"></span>
-<a name="l00441"></a>00441 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8</span>
-<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00444"></a>00444 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8acquire</span>
-<a name="l00445"></a>00445 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00446"></a>00446 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8release</span>
-<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00449"></a>00449 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00450"></a>00450 <span class="preprocessor"></span>
-<a name="l00451"></a>00451 <span class="preprocessor">#ifndef __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1</span>
-<a name="l00453"></a>00453 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00454"></a>00454 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1acquire</span>
-<a name="l00455"></a>00455 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00457"></a>00457 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1release</span>
-<a name="l00458"></a>00458 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00459"></a>00459 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00460"></a>00460 <span class="preprocessor"></span>
-<a name="l00461"></a>00461 <span class="preprocessor">#ifndef __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00462"></a>00462 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2</span>
-<a name="l00463"></a>00463 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00464"></a>00464 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2acquire</span>
-<a name="l00465"></a>00465 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2release</span>
-<a name="l00468"></a>00468 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00469"></a>00469 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00470"></a>00470 <span class="preprocessor"></span>
-<a name="l00471"></a>00471 <span class="preprocessor">#ifndef __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00472"></a>00472 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4</span>
-<a name="l00473"></a>00473 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00474"></a>00474 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4acquire</span>
-<a name="l00475"></a>00475 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00476"></a>00476 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4release</span>
-<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00479"></a>00479 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00480"></a>00480 <span class="preprocessor"></span>
-<a name="l00481"></a>00481 <span class="preprocessor">#ifndef __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00482"></a>00482 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8</span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00484"></a>00484 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8acquire</span>
-<a name="l00485"></a>00485 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00486"></a>00486 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00487"></a>00487 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8release</span>
-<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00489"></a>00489 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00490"></a>00490 <span class="preprocessor"></span>
-<a name="l00491"></a>00491 <span class="preprocessor">#endif // __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00492"></a>00492 <span class="preprocessor"></span>
-<a name="l00493"></a>00493 <span class="comment">// Special atomic functions</span>
-<a name="l00494"></a>00494 <span class="preprocessor">#ifndef __TBB_FetchAndAddWrelease</span>
-<a name="l00495"></a>00495 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span>
-<a name="l00498"></a>00498 <span class="preprocessor">#ifndef __TBB_FetchAndIncrementWacquire</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
-<a name="l00500"></a>00500 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span>
-<a name="l00502"></a>00502 <span class="preprocessor">#ifndef __TBB_FetchAndDecrementWrelease</span>
-<a name="l00503"></a>00503 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
-<a name="l00504"></a>00504 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00505"></a>00505 <span class="preprocessor"></span>
-<a name="l00506"></a>00506 <span class="preprocessor">#if __TBB_WORDSIZE==4</span>
-<a name="l00507"></a>00507 <span class="preprocessor"></span><span class="comment">// On 32-bit platforms, "atomic.h" requires definition of __TBB_Store8 and __TBB_Load8</span>
-<a name="l00508"></a>00508 <span class="preprocessor">#ifndef __TBB_Store8</span>
-<a name="l00509"></a>00509 <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="l00510"></a>00510 <a class="code" href="a00124.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00511"></a>00511 <span class="keywordflow">for</span>(;;) {
-<a name="l00512"></a>00512 int64_t result = *(int64_t *)ptr;
-<a name="l00513"></a>00513 <span class="keywordflow">if</span>( __TBB_CompareAndSwap8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
-<a name="l00514"></a>00514 b.<a class="code" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00515"></a>00515 }
-<a name="l00516"></a>00516 }
-<a name="l00517"></a>00517 <span class="preprocessor">#endif</span>
-<a name="l00518"></a>00518 <span class="preprocessor"></span>
-<a name="l00519"></a>00519 <span class="preprocessor">#ifndef __TBB_Load8</span>
-<a name="l00520"></a>00520 <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="l00521"></a>00521 int64_t result = *(int64_t *)ptr;
-<a name="l00522"></a>00522 result = __TBB_CompareAndSwap8((<span class="keyword">volatile</span> <span class="keywordtype">void</span> *)ptr,result,result);
-<a name="l00523"></a>00523 <span class="keywordflow">return</span> result;
-<a name="l00524"></a>00524 }
-<a name="l00525"></a>00525 <span class="preprocessor">#endif</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
-<a name="l00527"></a>00527
-<a name="l00528"></a>00528 <span class="preprocessor">#ifndef __TBB_Log2</span>
-<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
-<a name="l00530"></a>00530 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
-<a name="l00531"></a>00531 intptr_t result = 0;
-<a name="l00532"></a>00532 uintptr_t tmp;
-<a name="l00533"></a>00533 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
-<a name="l00534"></a>00534 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
-<a name="l00535"></a>00535 <span class="preprocessor">#endif</span>
-<a name="l00536"></a>00536 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
-<a name="l00537"></a>00537 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
-<a name="l00538"></a>00538 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
-<a name="l00539"></a>00539 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
-<a name="l00540"></a>00540 <span class="keywordflow">return</span> (x&2)? result+1: result;
-<a name="l00541"></a>00541 }
-<a name="l00542"></a>00542 <span class="preprocessor">#endif</span>
-<a name="l00543"></a>00543 <span class="preprocessor"></span>
-<a name="l00544"></a>00544 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
-<a name="l00545"></a>00545 <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="l00546"></a>00546 <a class="code" href="a00124.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00547"></a>00547 <span class="keywordflow">for</span>(;;) {
-<a name="l00548"></a>00548 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00549"></a>00549 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
-<a name="l00550"></a>00550 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00551"></a>00551 b.<a class="code" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00552"></a>00552 }
+<a name="l00172"></a>00172
+<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00174"></a>00174 <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="l00175"></a>00175 atomic_backoff backoff;
+<a name="l00176"></a>00176 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
+<a name="l00177"></a>00177 }
+<a name="l00178"></a>00178
+<a name="l00179"></a>00179 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
+<a name="l00180"></a>00180 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
+<a name="l00181"></a>00181 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
+<a name="l00182"></a>00182 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00183"></a>00183 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
+<a name="l00184"></a>00184 <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
+<a name="l00185"></a>00185 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
+<a name="l00187"></a>00187 <span class="preprocessor">#else</span>
+<a name="l00188"></a>00188 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
+<a name="l00189"></a>00189 <span class="preprocessor">#endif</span>
+<a name="l00190"></a>00190 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
+<a name="l00191"></a>00191 atomic_backoff b;
+<a name="l00192"></a>00192 uint32_t result;
+<a name="l00193"></a>00193 <span class="keywordflow">for</span>(;;) {
+<a name="l00194"></a>00194 result = *base; <span class="comment">// reload the base value which might change during the pause</span>
+<a name="l00195"></a>00195 uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
+<a name="l00196"></a>00196 uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
+<a name="l00197"></a>00197 <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence. </span>
+<a name="l00198"></a>00198 result = __TBB_CompareAndSwap4( base, new_value, old_value );
+<a name="l00199"></a>00199 <span class="keywordflow">if</span>( result==old_value <span class="comment">// CAS succeeded</span>
+<a name="l00200"></a>00200 || ((result^old_value)&mask)!=0 ) <span class="comment">// CAS failed and the bits of interest have changed</span>
+<a name="l00201"></a>00201 <span class="keywordflow">break</span>;
+<a name="l00202"></a>00202 <span class="keywordflow">else</span> <span class="comment">// CAS failed but the bits of interest left unchanged</span>
+<a name="l00203"></a>00203 b.pause();
+<a name="l00204"></a>00204 }
+<a name="l00205"></a>00205 <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
+<a name="l00206"></a>00206 }
+<a name="l00207"></a>00207
+<a name="l00208"></a>00208 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00209"></a>00209 <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="l00210"></a>00210 <span class="keywordflow">return</span> __TBB_CompareAndSwapW((T *)ptr,value,comparand);
+<a name="l00211"></a>00211 }
+<a name="l00212"></a>00212
+<a name="l00213"></a>00213 <span class="keyword">template</span><>
+<a name="l00214"></a>00214 <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="l00215"></a>00215 #ifdef __TBB_CompareAndSwap1
+<a name="l00216"></a>00216 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(ptr,value,comparand);
+<a name="l00217"></a>00217 <span class="preprocessor">#else</span>
+<a name="l00218"></a>00218 <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="l00219"></a>00219 <span class="preprocessor">#endif</span>
+<a name="l00220"></a>00220 <span class="preprocessor"></span>}
+<a name="l00221"></a>00221
+<a name="l00222"></a>00222 <span class="keyword">template</span><>
+<a name="l00223"></a>00223 <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="l00224"></a>00224 #ifdef __TBB_CompareAndSwap2
+<a name="l00225"></a>00225 <span class="keywordflow">return</span> __TBB_CompareAndSwap2(ptr,value,comparand);
+<a name="l00226"></a>00226 <span class="preprocessor">#else</span>
+<a name="l00227"></a>00227 <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="l00228"></a>00228 <span class="preprocessor">#endif</span>
+<a name="l00229"></a>00229 <span class="preprocessor"></span>}
+<a name="l00230"></a>00230
+<a name="l00231"></a>00231 <span class="keyword">template</span><>
+<a name="l00232"></a>00232 <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="l00233"></a>00233 <span class="keywordflow">return</span> __TBB_CompareAndSwap4(ptr,value,comparand);
+<a name="l00234"></a>00234 }
+<a name="l00235"></a>00235
+<a name="l00236"></a>00236 <span class="keyword">template</span><>
+<a name="l00237"></a>00237 <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="l00238"></a>00238 <span class="keywordflow">return</span> __TBB_CompareAndSwap8(ptr,value,comparand);
+<a name="l00239"></a>00239 }
+<a name="l00240"></a>00240
+<a name="l00241"></a>00241 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00242"></a>00242 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
+<a name="l00243"></a>00243 atomic_backoff b;
+<a name="l00244"></a>00244 T result;
+<a name="l00245"></a>00245 <span class="keywordflow">for</span>(;;) {
+<a name="l00246"></a>00246 result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00247"></a>00247 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence. </span>
+<a name="l00248"></a>00248 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
+<a name="l00249"></a>00249 <span class="keywordflow">break</span>;
+<a name="l00250"></a>00250 b.pause();
+<a name="l00251"></a>00251 }
+<a name="l00252"></a>00252 <span class="keywordflow">return</span> result;
+<a name="l00253"></a>00253 }
+<a name="l00254"></a>00254
+<a name="l00255"></a>00255 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00256"></a>00256 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
+<a name="l00257"></a>00257 atomic_backoff b;
+<a name="l00258"></a>00258 T result;
+<a name="l00259"></a>00259 <span class="keywordflow">for</span>(;;) {
+<a name="l00260"></a>00260 result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00261"></a>00261 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
+<a name="l00262"></a>00262 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
+<a name="l00263"></a>00263 <span class="keywordflow">break</span>;
+<a name="l00264"></a>00264 b.pause();
+<a name="l00265"></a>00265 }
+<a name="l00266"></a>00266 <span class="keywordflow">return</span> result;
+<a name="l00267"></a>00267 }
+<a name="l00268"></a>00268
+<a name="l00269"></a>00269 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
+<a name="l00270"></a>00270 <span class="comment">// strict as type T. Type type should have a trivial default constructor and destructor, so that</span>
+<a name="l00271"></a>00271 <span class="comment">// arrays of that type can be declared without initializers. </span>
+<a name="l00272"></a>00272 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
+<a name="l00273"></a>00273 <span class="comment">// to a type bigger than T.</span>
+<a name="l00274"></a>00274 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
+<a name="l00275"></a>00275 <span class="comment">// strictest alignment is 16.</span>
+<a name="l00276"></a>00276 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
+<a name="l00277"></a>00277 <span class="preprocessor"></span>
+<a name="l00278"></a>00278 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="keyword">struct </span>__TBB_machine_type_with_strictest_alignment {
+<a name="l00280"></a>00280 <span class="keywordtype">int</span> member[4];
+<a name="l00281"></a>00281 } __attribute__((aligned(16)));
+<a name="l00282"></a>00282 <span class="preprocessor">#elif _MSC_VER</span>
+<a name="l00283"></a>00283 <span class="preprocessor"></span>__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
+<a name="l00284"></a>00284 <span class="keywordtype">int</span> member[4];
+<a name="l00285"></a>00285 };
+<a name="l00286"></a>00286 <span class="preprocessor">#else</span>
+<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment</span>
+<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00289"></a>00289 <span class="preprocessor"></span>
+<a name="l00290"></a>00290 <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="l00291"></a>00291 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<1> { <span class="keywordtype">char</span> member; };
+<a name="l00292"></a>00292 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
+<a name="l00293"></a>00293 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
+<a name="l00294"></a>00294 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
+<a name="l00295"></a>00295
+<a name="l00296"></a>00296 <span class="preprocessor">#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2 </span>
+<a name="l00298"></a>00298 <span class="preprocessor"></span>
+<a name="l00300"></a>00300 <span class="preprocessor">template<size_t Size, typename T> </span>
+<a name="l00301"></a><a class="code" href="a00212.html">00301</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00212.html">work_around_alignment_bug</a> {
+<a name="l00302"></a>00302 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00303"></a>00303 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof(T);
+<a name="l00304"></a>00304 <span class="preprocessor">#else</span>
+<a name="l00305"></a>00305 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof__(T);
+<a name="l00306"></a>00306 <span class="preprocessor">#endif</span>
+<a name="l00307"></a>00307 <span class="preprocessor"></span>};
+<a name="l00308"></a>00308 <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="l00309"></a>00309 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__ || __SUNPRO_CC</span>
+<a name="l00310"></a>00310 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)></span>
+<a name="l00311"></a>00311 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00312"></a>00312 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment</span>
+<a name="l00313"></a>00313 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00314"></a>00314 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* ____TBB_TypeWithAlignmentAtLeastAsStrict */</span>
+<a name="l00315"></a>00315
+<a name="l00316"></a>00316 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
+<a name="l00317"></a>00317 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00318"></a>00318 <span class="keyword">struct </span>reverse {
+<a name="l00319"></a>00319 <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
+<a name="l00320"></a>00320 };
+<a name="l00321"></a>00321 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
+<a name="l00322"></a>00322 <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="l00323"></a>00323 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00324"></a>00324 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
+<a name="l00325"></a>00325 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+<a name="l00326"></a>00326 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+<a name="l00327"></a>00327 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+<a name="l00328"></a>00328 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+<a name="l00329"></a>00329 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+<a name="l00330"></a>00330 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+<a name="l00331"></a>00331 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+<a name="l00332"></a>00332 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+<a name="l00333"></a>00333 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+<a name="l00334"></a>00334 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+<a name="l00335"></a>00335 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+<a name="l00336"></a>00336 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+<a name="l00337"></a>00337 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+<a name="l00338"></a>00338 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+<a name="l00339"></a>00339 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+<a name="l00340"></a>00340 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+<a name="l00341"></a>00341 };
+<a name="l00342"></a>00342
+<a name="l00343"></a>00343 } <span class="comment">// namespace internal</span>
+<a name="l00344"></a>00344 } <span class="comment">// namespace tbb</span>
+<a name="l00345"></a>00345
+<a name="l00346"></a>00346 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1</span>
+<a name="l00347"></a>00347 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
+<a name="l00348"></a>00348 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00349"></a>00349 <span class="preprocessor"></span>
+<a name="l00350"></a>00350 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2 </span>
+<a name="l00351"></a>00351 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
+<a name="l00352"></a>00352 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00353"></a>00353 <span class="preprocessor"></span>
+<a name="l00354"></a>00354 <span class="preprocessor">#ifndef __TBB_CompareAndSwapW</span>
+<a name="l00355"></a>00355 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
+<a name="l00356"></a>00356 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00357"></a>00357 <span class="preprocessor"></span>
+<a name="l00358"></a>00358 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1</span>
+<a name="l00359"></a>00359 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
+<a name="l00360"></a>00360 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00361"></a>00361 <span class="preprocessor"></span>
+<a name="l00362"></a>00362 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2</span>
+<a name="l00363"></a>00363 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
+<a name="l00364"></a>00364 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00365"></a>00365 <span class="preprocessor"></span>
+<a name="l00366"></a>00366 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4</span>
+<a name="l00367"></a>00367 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
+<a name="l00368"></a>00368 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00369"></a>00369 <span class="preprocessor"></span>
+<a name="l00370"></a>00370 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8</span>
+<a name="l00371"></a>00371 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
+<a name="l00372"></a>00372 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00373"></a>00373 <span class="preprocessor"></span>
+<a name="l00374"></a>00374 <span class="preprocessor">#ifndef __TBB_FetchAndAddW</span>
+<a name="l00375"></a>00375 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
+<a name="l00376"></a>00376 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00377"></a>00377 <span class="preprocessor"></span>
+<a name="l00378"></a>00378 <span class="preprocessor">#ifndef __TBB_FetchAndStore1</span>
+<a name="l00379"></a>00379 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
+<a name="l00380"></a>00380 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00381"></a>00381 <span class="preprocessor"></span>
+<a name="l00382"></a>00382 <span class="preprocessor">#ifndef __TBB_FetchAndStore2</span>
+<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
+<a name="l00384"></a>00384 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00385"></a>00385 <span class="preprocessor"></span>
+<a name="l00386"></a>00386 <span class="preprocessor">#ifndef __TBB_FetchAndStore4</span>
+<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
+<a name="l00388"></a>00388 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00389"></a>00389 <span class="preprocessor"></span>
+<a name="l00390"></a>00390 <span class="preprocessor">#ifndef __TBB_FetchAndStore8</span>
+<a name="l00391"></a>00391 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
+<a name="l00392"></a>00392 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00393"></a>00393 <span class="preprocessor"></span>
+<a name="l00394"></a>00394 <span class="preprocessor">#ifndef __TBB_FetchAndStoreW</span>
+<a name="l00395"></a>00395 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
+<a name="l00396"></a>00396 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00397"></a>00397 <span class="preprocessor"></span>
+<a name="l00398"></a>00398 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
+<a name="l00399"></a>00399 <span class="preprocessor"></span>
+<a name="l00400"></a>00400 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1__TBB_full_fence</span>
+<a name="l00401"></a>00401 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1</span>
+<a name="l00402"></a>00402 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00403"></a>00403 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1acquire</span>
+<a name="l00404"></a>00404 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence</span>
+<a name="l00405"></a>00405 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00406"></a>00406 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1release</span>
+<a name="l00407"></a>00407 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence</span>
+<a name="l00408"></a>00408 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00409"></a>00409 <span class="preprocessor"></span>
+<a name="l00410"></a>00410 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2__TBB_full_fence</span>
+<a name="l00411"></a>00411 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2</span>
+<a name="l00412"></a>00412 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00413"></a>00413 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2acquire</span>
+<a name="l00414"></a>00414 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence</span>
+<a name="l00415"></a>00415 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00416"></a>00416 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2release</span>
+<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence</span>
+<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00419"></a>00419 <span class="preprocessor"></span>
+<a name="l00420"></a>00420 <span class="preprocessor">#ifndef __TBB_CompareAndSwap4__TBB_full_fence</span>
+<a name="l00421"></a>00421 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4</span>
+<a name="l00422"></a>00422 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00423"></a>00423 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4acquire</span>
+<a name="l00424"></a>00424 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence</span>
+<a name="l00425"></a>00425 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4release</span>
+<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence</span>
+<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00429"></a>00429 <span class="preprocessor"></span>
+<a name="l00430"></a>00430 <span class="preprocessor">#ifndef __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8</span>
+<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8acquire</span>
+<a name="l00434"></a>00434 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00436"></a>00436 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8release</span>
+<a name="l00437"></a>00437 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00439"></a>00439 <span class="preprocessor"></span>
+<a name="l00440"></a>00440 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1__TBB_full_fence</span>
+<a name="l00441"></a>00441 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1</span>
+<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1acquire</span>
+<a name="l00444"></a>00444 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence</span>
+<a name="l00445"></a>00445 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00446"></a>00446 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1release</span>
+<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence</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">#ifndef __TBB_FetchAndAdd2__TBB_full_fence</span>
+<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2</span>
+<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00453"></a>00453 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2acquire</span>
+<a name="l00454"></a>00454 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence</span>
+<a name="l00455"></a>00455 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2release</span>
+<a name="l00457"></a>00457 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence</span>
+<a name="l00458"></a>00458 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00459"></a>00459 <span class="preprocessor"></span>
+<a name="l00460"></a>00460 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4__TBB_full_fence</span>
+<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4</span>
+<a name="l00462"></a>00462 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00463"></a>00463 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4acquire</span>
+<a name="l00464"></a>00464 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence</span>
+<a name="l00465"></a>00465 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4release</span>
+<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence</span>
+<a name="l00468"></a>00468 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00469"></a>00469 <span class="preprocessor"></span>
+<a name="l00470"></a>00470 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8__TBB_full_fence</span>
+<a name="l00471"></a>00471 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8</span>
+<a name="l00472"></a>00472 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00473"></a>00473 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8acquire</span>
+<a name="l00474"></a>00474 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence</span>
+<a name="l00475"></a>00475 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00476"></a>00476 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8release</span>
+<a name="l00477"></a>00477 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence</span>
+<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00479"></a>00479 <span class="preprocessor"></span>
+<a name="l00480"></a>00480 <span class="preprocessor">#ifndef __TBB_FetchAndStore1__TBB_full_fence</span>
+<a name="l00481"></a>00481 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1</span>
+<a name="l00482"></a>00482 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00483"></a>00483 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1acquire</span>
+<a name="l00484"></a>00484 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence</span>
+<a name="l00485"></a>00485 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00486"></a>00486 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1release</span>
+<a name="l00487"></a>00487 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence</span>
+<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00489"></a>00489 <span class="preprocessor"></span>
+<a name="l00490"></a>00490 <span class="preprocessor">#ifndef __TBB_FetchAndStore2__TBB_full_fence</span>
+<a name="l00491"></a>00491 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2</span>
+<a name="l00492"></a>00492 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00493"></a>00493 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2acquire</span>
+<a name="l00494"></a>00494 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence</span>
+<a name="l00495"></a>00495 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2release</span>
+<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence</span>
+<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00499"></a>00499 <span class="preprocessor"></span>
+<a name="l00500"></a>00500 <span class="preprocessor">#ifndef __TBB_FetchAndStore4__TBB_full_fence</span>
+<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4</span>
+<a name="l00502"></a>00502 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00503"></a>00503 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4acquire</span>
+<a name="l00504"></a>00504 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence</span>
+<a name="l00505"></a>00505 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00506"></a>00506 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4release</span>
+<a name="l00507"></a>00507 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence</span>
+<a name="l00508"></a>00508 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00509"></a>00509 <span class="preprocessor"></span>
+<a name="l00510"></a>00510 <span class="preprocessor">#ifndef __TBB_FetchAndStore8__TBB_full_fence</span>
+<a name="l00511"></a>00511 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8</span>
+<a name="l00512"></a>00512 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00513"></a>00513 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8acquire</span>
+<a name="l00514"></a>00514 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence</span>
+<a name="l00515"></a>00515 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00516"></a>00516 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8release</span>
+<a name="l00517"></a>00517 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence</span>
+<a name="l00518"></a>00518 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00519"></a>00519 <span class="preprocessor"></span>
+<a name="l00520"></a>00520 <span class="preprocessor">#endif // __TBB_DECL_FENCED_ATOMICS</span>
+<a name="l00521"></a>00521 <span class="preprocessor"></span>
+<a name="l00522"></a>00522 <span class="comment">// Special atomic functions</span>
+<a name="l00523"></a>00523 <span class="preprocessor">#ifndef __TBB_FetchAndAddWrelease</span>
+<a name="l00524"></a>00524 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW</span>
+<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00526"></a>00526 <span class="preprocessor"></span>
+<a name="l00527"></a>00527 <span class="preprocessor">#ifndef __TBB_FetchAndIncrementWacquire</span>
+<a name="l00528"></a>00528 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
+<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00530"></a>00530 <span class="preprocessor"></span>
+<a name="l00531"></a>00531 <span class="preprocessor">#ifndef __TBB_FetchAndDecrementWrelease</span>
+<a name="l00532"></a>00532 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</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">#if __TBB_WORDSIZE==4</span>
+<a name="l00536"></a>00536 <span class="preprocessor"></span><span class="comment">// On 32-bit platforms, "atomic.h" requires definition of __TBB_Store8 and __TBB_Load8</span>
+<a name="l00537"></a>00537 <span class="preprocessor">#ifndef __TBB_Store8</span>
+<a name="l00538"></a>00538 <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="l00539"></a>00539 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00540"></a>00540 <span class="keywordflow">for</span>(;;) {
+<a name="l00541"></a>00541 int64_t result = *(int64_t *)ptr;
+<a name="l00542"></a>00542 <span class="keywordflow">if</span>( __TBB_CompareAndSwap8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
+<a name="l00543"></a>00543 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00544"></a>00544 }
+<a name="l00545"></a>00545 }
+<a name="l00546"></a>00546 <span class="preprocessor">#endif</span>
+<a name="l00547"></a>00547 <span class="preprocessor"></span>
+<a name="l00548"></a>00548 <span class="preprocessor">#ifndef __TBB_Load8</span>
+<a name="l00549"></a>00549 <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="l00550"></a>00550 int64_t result = *(int64_t *)ptr;
+<a name="l00551"></a>00551 result = __TBB_CompareAndSwap8((<span class="keyword">volatile</span> <span class="keywordtype">void</span> *)ptr,result,result);
+<a name="l00552"></a>00552 <span class="keywordflow">return</span> result;
<a name="l00553"></a>00553 }
<a name="l00554"></a>00554 <span class="preprocessor">#endif</span>
-<a name="l00555"></a>00555 <span class="preprocessor"></span>
-<a name="l00556"></a>00556 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
-<a name="l00557"></a>00557 <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="l00558"></a>00558 <a class="code" href="a00124.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00559"></a>00559 <span class="keywordflow">for</span>(;;) {
-<a name="l00560"></a>00560 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00561"></a>00561 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
-<a name="l00562"></a>00562 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00563"></a>00563 b.<a class="code" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00564"></a>00564 }
-<a name="l00565"></a>00565 }
-<a name="l00566"></a>00566 <span class="preprocessor">#endif</span>
-<a name="l00567"></a>00567 <span class="preprocessor"></span>
-<a name="l00568"></a>00568 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
-<a name="l00569"></a>00569 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> &flag ) {
-<a name="l00570"></a>00570 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(&flag,1,0)==0;
-<a name="l00571"></a>00571 }
-<a name="l00572"></a>00572 <span class="preprocessor">#endif</span>
-<a name="l00573"></a>00573 <span class="preprocessor"></span>
-<a name="l00574"></a>00574 <span class="preprocessor">#ifndef __TBB_LockByte</span>
-<a name="l00575"></a>00575 <span class="preprocessor"></span><span class="keyword">inline</span> uintptr_t __TBB_LockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>& flag ) {
-<a name="l00576"></a>00576 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
-<a name="l00577"></a>00577 <a class="code" href="a00124.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00578"></a>00578 <span class="keywordflow">do</span> {
-<a name="l00579"></a>00579 b.<a class="code" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00580"></a>00580 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
+<a name="l00555"></a>00555 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
+<a name="l00556"></a>00556
+<a name="l00557"></a>00557 <span class="preprocessor">#ifndef __TBB_Log2</span>
+<a name="l00558"></a>00558 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
+<a name="l00559"></a>00559 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
+<a name="l00560"></a>00560 intptr_t result = 0;
+<a name="l00561"></a>00561 uintptr_t tmp;
+<a name="l00562"></a>00562 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
+<a name="l00563"></a>00563 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
+<a name="l00564"></a>00564 <span class="preprocessor">#endif</span>
+<a name="l00565"></a>00565 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
+<a name="l00566"></a>00566 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
+<a name="l00567"></a>00567 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
+<a name="l00568"></a>00568 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
+<a name="l00569"></a>00569 <span class="keywordflow">return</span> (x&2)? result+1: result;
+<a name="l00570"></a>00570 }
+<a name="l00571"></a>00571 <span class="preprocessor">#endif</span>
+<a name="l00572"></a>00572 <span class="preprocessor"></span>
+<a name="l00573"></a>00573 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
+<a name="l00574"></a>00574 <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="l00575"></a>00575 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00576"></a>00576 <span class="keywordflow">for</span>(;;) {
+<a name="l00577"></a>00577 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00578"></a>00578 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
+<a name="l00579"></a>00579 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00580"></a>00580 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
<a name="l00581"></a>00581 }
-<a name="l00582"></a>00582 <span class="keywordflow">return</span> 0;
-<a name="l00583"></a>00583 }
-<a name="l00584"></a>00584 <span class="preprocessor">#endif</span>
-<a name="l00585"></a>00585 <span class="preprocessor"></span>
-<a name="l00586"></a>00586 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
+<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="preprocessor">#ifndef __TBB_AtomicAND</span>
+<a name="l00586"></a>00586 <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="l00587"></a>00587 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00588"></a>00588 <span class="keywordflow">for</span>(;;) {
+<a name="l00589"></a>00589 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00590"></a>00590 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
+<a name="l00591"></a>00591 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00592"></a>00592 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00593"></a>00593 }
+<a name="l00594"></a>00594 }
+<a name="l00595"></a>00595 <span class="preprocessor">#endif</span>
+<a name="l00596"></a>00596 <span class="preprocessor"></span>
+<a name="l00597"></a>00597 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
+<a name="l00598"></a>00598 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> &flag ) {
+<a name="l00599"></a>00599 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(&flag,1,0)==0;
+<a name="l00600"></a>00600 }
+<a name="l00601"></a>00601 <span class="preprocessor">#endif</span>
+<a name="l00602"></a>00602 <span class="preprocessor"></span>
+<a name="l00603"></a>00603 <span class="preprocessor">#ifndef __TBB_LockByte</span>
+<a name="l00604"></a>00604 <span class="preprocessor"></span><span class="keyword">inline</span> uintptr_t __TBB_LockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>& flag ) {
+<a name="l00605"></a>00605 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
+<a name="l00606"></a>00606 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00607"></a>00607 <span class="keywordflow">do</span> {
+<a name="l00608"></a>00608 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00609"></a>00609 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
+<a name="l00610"></a>00610 }
+<a name="l00611"></a>00611 <span class="keywordflow">return</span> 0;
+<a name="l00612"></a>00612 }
+<a name="l00613"></a>00613 <span class="preprocessor">#endif</span>
+<a name="l00614"></a>00614 <span class="preprocessor"></span>
+<a name="l00615"></a>00615 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
+<a name="l00616"></a>00616 <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="l00617"></a>00617 <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
+<a name="l00618"></a>00618 }
+<a name="l00619"></a>00619 <span class="preprocessor">#endif</span>
+<a name="l00620"></a>00620 <span class="preprocessor"></span>
+<a name="l00621"></a>00621 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00622"></a>00622 T __TBB_ReverseBits(T src)
+<a name="l00623"></a>00623 {
+<a name="l00624"></a>00624 T dst;
+<a name="l00625"></a>00625 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
+<a name="l00626"></a>00626 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
+<a name="l00627"></a>00627
+<a name="l00628"></a>00628 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
+<a name="l00629"></a>00629 reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
+<a name="l00630"></a>00630
+<a name="l00631"></a>00631 <span class="keywordflow">return</span> dst;
+<a name="l00632"></a>00632 }
+<a name="l00633"></a>00633
+<a name="l00634"></a>00634 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00397.html b/doc/html/a00458.html
similarity index 98%
rename from doc/html/a00397.html
rename to doc/html/a00458.html
index 4ecd6ee..cf221d6 100644
--- a/doc/html/a00397.html
+++ b/doc/html/a00458.html
@@ -43,7 +43,7 @@
<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__) && TBB_USE_THREADING_TOOLS</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>
@@ -116,7 +116,7 @@
<a name="l00097"></a>00097 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_profiling_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00398.html b/doc/html/a00459.html
similarity index 65%
rename from doc/html/a00398.html
rename to doc/html/a00459.html
index 8df7505..2eb8a4a 100644
--- a/doc/html/a00398.html
+++ b/doc/html/a00459.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 2</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define TBB_VERSION_MINOR 2</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 4003</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 5000</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>
@@ -122,9 +122,8 @@
<a name="l00151"></a>00151 <span class="preprocessor"></span>
<a name="l00152"></a>00152 <span class="preprocessor">#include "tbb_config.h"</span>
<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keyword">namespace </span>tbb {
-<a name="l00156"></a><a class="code" href="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">00156</a> <span class="keyword">typedef</span> void(*<a class="code" href="a00237.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="l00157"></a>00157 }
+<a name="l00155"></a>00155 <span class="keyword">namespace </span>tbb {
+<a name="l00157"></a><a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">00157</a> <span class="keyword">typedef</span> void(*<a class="code" href="a00267.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="l00158"></a>00158
<a name="l00159"></a>00159 <span class="preprocessor">#if TBB_USE_ASSERT</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span>
@@ -132,95 +131,116 @@
<a name="l00165"></a>00165 <span class="preprocessor">#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
<a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ASSERT_EX __TBB_ASSERT</span>
<a name="l00167"></a>00167 <span class="preprocessor"></span>
-<a name="l00168"></a>00168 <span class="keyword">namespace </span>tbb {
-<a name="l00170"></a>00170 <a class="code" href="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00237.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
-<a name="l00171"></a>00171
-<a name="l00173"></a>00173
-<a name="l00176"></a>00176 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00237.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="l00177"></a>00177 } <span class="comment">// namespace tbb</span>
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <span class="preprocessor">#else</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span>
-<a name="l00182"></a>00182 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00184"></a>00184 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span>
-<a name="l00186"></a>00186 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00169"></a>00169 <a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
+<a name="l00170"></a>00170
+<a name="l00172"></a>00172
+<a name="l00175"></a>00175 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00267.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="l00176"></a>00176
+<a name="l00177"></a>00177 <span class="preprocessor">#else</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>
+<a name="l00180"></a>00180 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
+<a name="l00182"></a>00182 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
+<a name="l00183"></a>00183 <span class="preprocessor"></span>
+<a name="l00184"></a>00184 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00185"></a>00185
<a name="l00187"></a>00187
-<a name="l00189"></a>00189 <span class="keyword">namespace </span>tbb {
-<a name="l00190"></a>00190
+<a name="l00191"></a>00191 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00267.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
<a name="l00192"></a>00192
-<a name="l00196"></a>00196 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00237.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
-<a name="l00197"></a>00197
-<a name="l00199"></a>00199
-<a name="l00203"></a><a class="code" href="a00173.html">00203</a> <span class="keyword">class </span><a class="code" href="a00173.html">split</a> {
-<a name="l00204"></a>00204 };
-<a name="l00205"></a>00205
-<a name="l00210"></a>00210 <span class="keyword">namespace </span>internal {
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 <span class="keyword">using</span> std::size_t;
-<a name="l00213"></a>00213
-<a name="l00215"></a>00215
-<a name="l00217"></a>00217 <span class="keyword">typedef</span> size_t uintptr;
-<a name="l00218"></a>00218
+<a name="l00194"></a>00194
+<a name="l00198"></a><a class="code" href="a00198.html">00198</a> <span class="keyword">class </span><a class="code" href="a00198.html">split</a> {
+<a name="l00199"></a>00199 };
+<a name="l00200"></a>00200
+<a name="l00205"></a>00205 <span class="keyword">namespace </span>internal {
+<a name="l00206"></a>00206
+<a name="l00207"></a>00207 <span class="keyword">using</span> std::size_t;
+<a name="l00208"></a>00208
+<a name="l00210"></a>00210
+<a name="l00213"></a>00213 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
+<a name="l00214"></a>00214
+<a name="l00215"></a>00215 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
+<a name="l00216"></a>00216 <span class="keyword">struct </span>padded_base : T {
+<a name="l00217"></a>00217 <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
+<a name="l00218"></a>00218 };
+<a name="l00219"></a>00219 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
<a name="l00220"></a>00220
-<a name="l00222"></a>00222 <span class="keyword">typedef</span> std::ptrdiff_t intptr;
-<a name="l00223"></a>00223
-<a name="l00225"></a>00225
-<a name="l00228"></a>00228 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
-<a name="l00229"></a>00229
-<a name="l00231"></a>00231 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00235"></a>00235 <span class="preprocessor">template<typename T></span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* & p ) {
-<a name="l00237"></a>00237 p = reinterpret_cast<T*>(-1);
-<a name="l00238"></a>00238 }
-<a name="l00239"></a>00239 <span class="preprocessor">#else</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00241"></a>00241 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00242"></a>00242 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00243"></a>00243
-<a name="l00245"></a>00245 <span class="keyword">class </span>no_assign {
-<a name="l00246"></a>00246 <span class="comment">// Deny assignment</span>
-<a name="l00247"></a>00247 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00248"></a>00248 <span class="keyword">public</span>:
-<a name="l00249"></a>00249 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00251"></a>00251 <span class="preprocessor"> no_assign() {}</span>
-<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00253"></a>00253 };
-<a name="l00254"></a>00254
-<a name="l00256"></a>00256 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00258"></a>00258 no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00259"></a>00259 <span class="keyword">public</span>:
-<a name="l00261"></a>00261 no_copy() {}
-<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> T>
-<a name="l00266"></a>00266 <span class="keyword">struct </span>allocator_type {
-<a name="l00267"></a>00267 <span class="keyword">typedef</span> T value_type;
-<a name="l00268"></a>00268 };
-<a name="l00269"></a>00269
-<a name="l00270"></a>00270 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00272"></a>00272 <span class="preprocessor">template<typename T></span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00274"></a>00274 <span class="keyword">typedef</span> T value_type;
-<a name="l00275"></a>00275 };
-<a name="l00276"></a>00276 <span class="preprocessor">#endif</span>
-<a name="l00277"></a>00277 <span class="preprocessor"></span>
-<a name="l00278"></a>00278 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00281"></a>00281 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00282"></a>00282
-<a name="l00283"></a>00283 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00222"></a>00222 <span class="keyword">template</span><<span class="keyword">class</span> T>
+<a name="l00223"></a>00223 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
+<a name="l00224"></a>00224
+<a name="l00226"></a>00226
+<a name="l00228"></a>00228 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
+<a name="l00229"></a>00229 <span class="preprocessor"> ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span>
+<a name="l00232"></a>00232 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
+<a name="l00233"></a>00233 <span class="preprocessor"> (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
+<a name="l00234"></a>00234 <span class="preprocessor"></span>
+<a name="l00236"></a>00236 <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="l00237"></a>00237
+<a name="l00238"></a>00238 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TRY try</span>
+<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) catch(e)</span>
+<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) throw e</span>
+<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() throw</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00244"></a>00244 <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00245"></a>00245 <span class="preprocessor"> #define __TBB_TRY</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
+<a name="l00247"></a>00247 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) ((void)0)</span>
+<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() ((void)0)</span>
+<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00250"></a>00250
+<a name="l00252"></a>00252 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
+<a name="l00253"></a>00253
+<a name="l00254"></a>00254 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00256"></a>00256 <span class="preprocessor">template<typename T></span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* & p ) {
+<a name="l00258"></a>00258 p = reinterpret_cast<T*>(-1);
+<a name="l00259"></a>00259 }
+<a name="l00260"></a>00260 <span class="preprocessor">#else</span>
+<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00262"></a>00262 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
+<a name="l00263"></a>00263 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00264"></a>00264
+<a name="l00266"></a>00266 <span class="keyword">class </span>no_assign {
+<a name="l00267"></a>00267 <span class="comment">// Deny assignment</span>
+<a name="l00268"></a>00268 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
+<a name="l00269"></a>00269 <span class="keyword">public</span>:
+<a name="l00270"></a>00270 <span class="preprocessor">#if __GNUC__</span>
+<a name="l00272"></a>00272 <span class="preprocessor"> no_assign() {}</span>
+<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
+<a name="l00274"></a>00274 };
+<a name="l00275"></a>00275
+<a name="l00277"></a>00277 <span class="keyword">class </span>no_copy: no_assign {
+<a name="l00279"></a>00279 no_copy( <span class="keyword">const</span> no_copy& );
+<a name="l00280"></a>00280 <span class="keyword">public</span>:
+<a name="l00282"></a>00282 no_copy() {}
+<a name="l00283"></a>00283 };
<a name="l00284"></a>00284
-<a name="l00285"></a>00285 } <span class="comment">// internal</span>
-<a name="l00287"></a>00287 <span class="comment"></span>
-<a name="l00288"></a>00288 } <span class="comment">// tbb</span>
-<a name="l00289"></a>00289
-<a name="l00290"></a>00290 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00291"></a>00291 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00286"></a>00286 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00287"></a>00287 <span class="keyword">struct </span>allocator_type {
+<a name="l00288"></a>00288 <span class="keyword">typedef</span> T value_type;
+<a name="l00289"></a>00289 };
+<a name="l00290"></a>00290
+<a name="l00291"></a>00291 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00293"></a>00293 <span class="preprocessor">template<typename T></span>
+<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
+<a name="l00295"></a>00295 <span class="keyword">typedef</span> T value_type;
+<a name="l00296"></a>00296 };
+<a name="l00297"></a>00297 <span class="preprocessor">#endif</span>
+<a name="l00298"></a>00298 <span class="preprocessor"></span>
+<a name="l00299"></a>00299 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
+<a name="l00302"></a>00302 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
+<a name="l00303"></a>00303
+<a name="l00304"></a>00304 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00305"></a>00305
+<a name="l00306"></a>00306 } <span class="comment">// internal</span>
+<a name="l00308"></a>00308 <span class="comment"></span>
+<a name="l00309"></a>00309 } <span class="comment">// tbb</span>
+<a name="l00310"></a>00310
+<a name="l00311"></a>00311 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
+<a name="l00312"></a>00312 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00466.html b/doc/html/a00466.html
new file mode 100644
index 0000000..93b10cb
--- /dev/null
+++ b/doc/html/a00466.html
@@ -0,0 +1,310 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>tbb_thread.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>tbb_thread.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_thread_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_thread_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>
+<a name="l00026"></a>00026 <span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE unsigned WINAPI</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) unsigned (WINAPI* r)( void* )</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE void*</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) void* (*r)( void* )</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "tick_count.h"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include <exception></span> <span class="comment">// Need std::terminate from here.</span>
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</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: 4530)</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="preprocessor">#include <iosfwd></span>
+<a name="l00045"></a>00045
+<a name="l00046"></a>00046 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</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="keyword">namespace </span>tbb {
+<a name="l00051"></a>00051
+<a name="l00053"></a>00053 <span class="keyword">namespace </span>internal {
+<a name="l00054"></a>00054
+<a name="l00055"></a>00055 <span class="keyword">class </span>tbb_thread_v3;
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 } <span class="comment">// namespace internal</span>
+<a name="l00058"></a>00058
+<a name="l00059"></a>00059 <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 );
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061 <span class="keyword">namespace </span>internal {
+<a name="l00062"></a>00062
+<a name="l00064"></a>00064 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_closure_v3( size_t size );
+<a name="l00066"></a>00066 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free_closure_v3( <span class="keywordtype">void</span>* );
+<a name="l00067"></a>00067
+<a name="l00068"></a>00068 <span class="keyword">struct </span>thread_closure_base {
+<a name="l00069"></a>00069 <span class="keywordtype">void</span>* operator new( size_t size ) {<span class="keywordflow">return</span> allocate_closure_v3(size);}
+<a name="l00070"></a>00070 <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* ptr ) {free_closure_v3(ptr);}
+<a name="l00071"></a>00071 };
+<a name="l00072"></a>00072
+<a name="l00073"></a>00073 <span class="keyword">template</span><<span class="keyword">class</span> F> <span class="keyword">struct </span>thread_closure_0: thread_closure_base {
+<a name="l00074"></a>00074 F function;
+<a name="l00075"></a>00075
+<a name="l00076"></a>00076 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
+<a name="l00077"></a>00077 thread_closure_0 *<span class="keyword">self</span> = static_cast<thread_closure_0*>(c);
+<a name="l00078"></a>00078 __TBB_TRY {
+<a name="l00079"></a>00079 <span class="keyword">self</span>->function();
+<a name="l00080"></a>00080 } __TBB_CATCH( ... ) {
+<a name="l00081"></a>00081 std::terminate();
+<a name="l00082"></a>00082 }
+<a name="l00083"></a>00083 <span class="keyword">delete</span> <span class="keyword">self</span>;
+<a name="l00084"></a>00084 <span class="keywordflow">return</span> 0;
+<a name="l00085"></a>00085 }
+<a name="l00086"></a>00086 thread_closure_0( <span class="keyword">const</span> F& f ) : function(f) {}
+<a name="l00087"></a>00087 };
+<a name="l00089"></a>00089 <span class="keyword">template</span><<span class="keyword">class</span> F, <span class="keyword">class</span> X> <span class="keyword">struct </span>thread_closure_1: thread_closure_base {
+<a name="l00090"></a>00090 F function;
+<a name="l00091"></a>00091 X arg1;
+<a name="l00093"></a>00093 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
+<a name="l00094"></a>00094 thread_closure_1 *<span class="keyword">self</span> = static_cast<thread_closure_1*>(c);
+<a name="l00095"></a>00095 __TBB_TRY {
+<a name="l00096"></a>00096 <span class="keyword">self</span>->function(self->arg1);
+<a name="l00097"></a>00097 } __TBB_CATCH( ... ) {
+<a name="l00098"></a>00098 std::terminate();
+<a name="l00099"></a>00099 }
+<a name="l00100"></a>00100 <span class="keyword">delete</span> <span class="keyword">self</span>;
+<a name="l00101"></a>00101 <span class="keywordflow">return</span> 0;
+<a name="l00102"></a>00102 }
+<a name="l00103"></a>00103 thread_closure_1( <span class="keyword">const</span> F& f, <span class="keyword">const</span> X& x ) : function(f), arg1(x) {}
+<a name="l00104"></a>00104 };
+<a name="l00105"></a>00105 <span class="keyword">template</span><<span class="keyword">class</span> F, <span class="keyword">class</span> X, <span class="keyword">class</span> Y> <span class="keyword">struct </span>thread_closure_2: thread_closure_base {
+<a name="l00106"></a>00106 F function;
+<a name="l00107"></a>00107 X arg1;
+<a name="l00108"></a>00108 Y arg2;
+<a name="l00110"></a>00110 <span class="keyword">static</span> __TBB_NATIVE_THREAD_ROUTINE start_routine( <span class="keywordtype">void</span>* c ) {
+<a name="l00111"></a>00111 thread_closure_2 *<span class="keyword">self</span> = static_cast<thread_closure_2*>(c);
+<a name="l00112"></a>00112 __TBB_TRY {
+<a name="l00113"></a>00113 <span class="keyword">self</span>->function(self->arg1, self->arg2);
+<a name="l00114"></a>00114 } __TBB_CATCH( ... ) {
+<a name="l00115"></a>00115 std::terminate();
+<a name="l00116"></a>00116 }
+<a name="l00117"></a>00117 <span class="keyword">delete</span> <span class="keyword">self</span>;
+<a name="l00118"></a>00118 <span class="keywordflow">return</span> 0;
+<a name="l00119"></a>00119 }
+<a name="l00120"></a>00120 thread_closure_2( <span class="keyword">const</span> F& f, <span class="keyword">const</span> X& x, <span class="keyword">const</span> Y& y ) : function(f), arg1(x), arg2(y) {}
+<a name="l00121"></a>00121 };
+<a name="l00122"></a>00122
+<a name="l00124"></a>00124 <span class="keyword">class </span>tbb_thread_v3 {
+<a name="l00125"></a>00125 tbb_thread_v3(<span class="keyword">const</span> tbb_thread_v3&); <span class="comment">// = delete; // Deny access</span>
+<a name="l00126"></a>00126 <span class="keyword">public</span>:
+<a name="l00127"></a>00127 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span> <span class="keyword">typedef</span> HANDLE native_handle_type;
+<a name="l00129"></a>00129 <span class="preprocessor">#else</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t native_handle_type;
+<a name="l00131"></a>00131 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
+<a name="l00132"></a>00132 <span class="preprocessor"></span>
+<a name="l00133"></a>00133 <span class="keyword">class </span>id;
+<a name="l00135"></a>00135 tbb_thread_v3() : my_handle(0)
+<a name="l00136"></a>00136 #if _WIN32||_WIN64
+<a name="l00137"></a>00137 , my_thread_id(0)
+<a name="l00138"></a>00138 #endif <span class="comment">// _WIN32||_WIN64</span>
+<a name="l00139"></a>00139 {}
+<a name="l00140"></a>00140
+<a name="l00142"></a>00142 <span class="keyword">template</span> <<span class="keyword">class</span> F> <span class="keyword">explicit</span> tbb_thread_v3(F f) {
+<a name="l00143"></a>00143 <span class="keyword">typedef</span> internal::thread_closure_0<F> closure_type;
+<a name="l00144"></a>00144 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f));
+<a name="l00145"></a>00145 }
+<a name="l00147"></a>00147 <span class="keyword">template</span> <<span class="keyword">class</span> F, <span class="keyword">class</span> X> tbb_thread_v3(F f, X x) {
+<a name="l00148"></a>00148 <span class="keyword">typedef</span> internal::thread_closure_1<F,X> closure_type;
+<a name="l00149"></a>00149 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f,x));
+<a name="l00150"></a>00150 }
+<a name="l00152"></a>00152 <span class="keyword">template</span> <<span class="keyword">class</span> F, <span class="keyword">class</span> X, <span class="keyword">class</span> Y> tbb_thread_v3(F f, X x, Y y) {
+<a name="l00153"></a>00153 <span class="keyword">typedef</span> internal::thread_closure_2<F,X,Y> closure_type;
+<a name="l00154"></a>00154 internal_start(closure_type::start_routine, <span class="keyword">new</span> closure_type(f,x,y));
+<a name="l00155"></a>00155 }
+<a name="l00156"></a>00156
+<a name="l00157"></a>00157 tbb_thread_v3& operator=(tbb_thread_v3& x) {
+<a name="l00158"></a>00158 <span class="keywordflow">if</span> (joinable()) detach();
+<a name="l00159"></a>00159 my_handle = x.my_handle;
+<a name="l00160"></a>00160 x.my_handle = 0;
+<a name="l00161"></a>00161 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00162"></a>00162 <span class="preprocessor"></span> my_thread_id = x.my_thread_id;
+<a name="l00163"></a>00163 x.my_thread_id = 0;
+<a name="l00164"></a>00164 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
+<a name="l00165"></a>00165 <span class="preprocessor"></span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00166"></a>00166 }
+<a name="l00167"></a>00167 <span class="keywordtype">void</span> swap( tbb_thread_v3& t ) {tbb::swap( *<span class="keyword">this</span>, t );}
+<a name="l00168"></a>00168 <span class="keywordtype">bool</span> joinable()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_handle!=0; }
+<a name="l00170"></a>00170 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD join();
+<a name="l00172"></a>00172 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD detach();
+<a name="l00173"></a>00173 ~tbb_thread_v3() {<span class="keywordflow">if</span>( joinable() ) detach();}
+<a name="l00174"></a>00174 <span class="keyword">inline</span> <span class="keywordtype">id</span> get_id() <span class="keyword">const</span>;
+<a name="l00175"></a>00175 native_handle_type native_handle() { <span class="keywordflow">return</span> my_handle; }
+<a name="l00176"></a>00176
+<a name="l00178"></a>00178 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> __TBB_EXPORTED_FUNC hardware_concurrency();
+<a name="l00179"></a>00179 <span class="keyword">private</span>:
+<a name="l00180"></a>00180 native_handle_type my_handle;
+<a name="l00181"></a>00181 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00182"></a>00182 <span class="preprocessor"></span> DWORD my_thread_id;
+<a name="l00183"></a>00183 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span>
+<a name="l00186"></a>00186 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine),
+<a name="l00187"></a>00187 <span class="keywordtype">void</span>* closure );
+<a name="l00188"></a>00188 <span class="keyword">friend</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
+<a name="l00189"></a>00189 <span class="keyword">friend</span> <span class="keywordtype">void</span> tbb::swap( tbb_thread_v3& t1, tbb_thread_v3& t2 );
+<a name="l00190"></a>00190 };
+<a name="l00191"></a>00191
+<a name="l00192"></a>00192 <span class="keyword">class </span>tbb_thread_v3::id {
+<a name="l00193"></a>00193 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span> DWORD my_id;
+<a name="l00195"></a>00195 id( DWORD id_ ) : my_id(id_) {}
+<a name="l00196"></a>00196 <span class="preprocessor">#else</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span> pthread_t my_id;
+<a name="l00198"></a>00198 id( pthread_t id_ ) : my_id(id_) {}
+<a name="l00199"></a>00199 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>tbb_thread_v3;
+<a name="l00201"></a>00201 <span class="keyword">public</span>:
+<a name="l00202"></a>00202 id() : my_id(0) {}
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( tbb_thread_v3::id x, tbb_thread_v3::id y );
+<a name="l00205"></a>00205 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( tbb_thread_v3::id x, tbb_thread_v3::id y );
+<a name="l00206"></a>00206 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( tbb_thread_v3::id x, tbb_thread_v3::id y );
+<a name="l00207"></a>00207 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<=( tbb_thread_v3::id x, tbb_thread_v3::id y );
+<a name="l00208"></a>00208 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator>( tbb_thread_v3::id x, tbb_thread_v3::id y );
+<a name="l00209"></a>00209 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator>=( tbb_thread_v3::id x, tbb_thread_v3::id y );
+<a name="l00210"></a>00210
+<a name="l00211"></a>00211 <span class="keyword">template</span><<span class="keyword">class</span> <span class="keywordtype">char</span>T, <span class="keyword">class</span> traits>
+<a name="l00212"></a>00212 <span class="keyword">friend</span> std::basic_ostream<charT, traits>&
+<a name="l00213"></a>00213 operator<< (std::basic_ostream<charT, traits> &out,
+<a name="l00214"></a>00214 tbb_thread_v3::id id)
+<a name="l00215"></a>00215 {
+<a name="l00216"></a>00216 out << <span class="keywordtype">id</span>.my_id;
+<a name="l00217"></a>00217 <span class="keywordflow">return</span> out;
+<a name="l00218"></a>00218 }
+<a name="l00219"></a>00219 <span class="keyword">friend</span> tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
+<a name="l00220"></a>00220 }; <span class="comment">// tbb_thread_v3::id</span>
+<a name="l00221"></a>00221
+<a name="l00222"></a>00222 tbb_thread_v3::id tbb_thread_v3::get_id()<span class="keyword"> const </span>{
+<a name="l00223"></a>00223 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00224"></a>00224 <span class="preprocessor"></span> <span class="keywordflow">return</span> id(my_thread_id);
+<a name="l00225"></a>00225 <span class="preprocessor">#else</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span> <span class="keywordflow">return</span> id(my_handle);
+<a name="l00227"></a>00227 <span class="preprocessor">#endif // _WIN32||_WIN64</span>
+<a name="l00228"></a>00228 <span class="preprocessor"></span> }
+<a name="l00229"></a>00229 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
+<a name="l00230"></a>00230 tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
+<a name="l00231"></a>00231 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC thread_yield_v3();
+<a name="l00232"></a>00232 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC thread_sleep_v3(<span class="keyword">const</span> tick_count::interval_t &i);
+<a name="l00233"></a>00233
+<a name="l00234"></a>00234 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(tbb_thread_v3::id x, tbb_thread_v3::id y)
+<a name="l00235"></a>00235 {
+<a name="l00236"></a>00236 <span class="keywordflow">return</span> x.my_id == y.my_id;
+<a name="l00237"></a>00237 }
+<a name="l00238"></a>00238 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(tbb_thread_v3::id x, tbb_thread_v3::id y)
+<a name="l00239"></a>00239 {
+<a name="l00240"></a>00240 <span class="keywordflow">return</span> x.my_id != y.my_id;
+<a name="l00241"></a>00241 }
+<a name="l00242"></a>00242 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(tbb_thread_v3::id x, tbb_thread_v3::id y)
+<a name="l00243"></a>00243 {
+<a name="l00244"></a>00244 <span class="keywordflow">return</span> x.my_id < y.my_id;
+<a name="l00245"></a>00245 }
+<a name="l00246"></a>00246 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<=(tbb_thread_v3::id x, tbb_thread_v3::id y)
+<a name="l00247"></a>00247 {
+<a name="l00248"></a>00248 <span class="keywordflow">return</span> x.my_id <= y.my_id;
+<a name="l00249"></a>00249 }
+<a name="l00250"></a>00250 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>(tbb_thread_v3::id x, tbb_thread_v3::id y)
+<a name="l00251"></a>00251 {
+<a name="l00252"></a>00252 <span class="keywordflow">return</span> x.my_id > y.my_id;
+<a name="l00253"></a>00253 }
+<a name="l00254"></a>00254 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>=(tbb_thread_v3::id x, tbb_thread_v3::id y)
+<a name="l00255"></a>00255 {
+<a name="l00256"></a>00256 <span class="keywordflow">return</span> x.my_id >= y.my_id;
+<a name="l00257"></a>00257 }
+<a name="l00258"></a>00258
+<a name="l00259"></a>00259 } <span class="comment">// namespace internal;</span>
+<a name="l00260"></a>00260
+<a name="l00262"></a>00262 <span class="keyword">typedef</span> internal::tbb_thread_v3 tbb_thread;
+<a name="l00263"></a>00263
+<a name="l00264"></a>00264 <span class="keyword">using</span> internal::operator==;
+<a name="l00265"></a>00265 <span class="keyword">using</span> internal::operator!=;
+<a name="l00266"></a>00266 <span class="keyword">using</span> internal::operator<;
+<a name="l00267"></a>00267 <span class="keyword">using</span> internal::operator>;
+<a name="l00268"></a>00268 <span class="keyword">using</span> internal::operator<=;
+<a name="l00269"></a>00269 <span class="keyword">using</span> internal::operator>=;
+<a name="l00270"></a>00270
+<a name="l00271"></a>00271 <span class="keyword">inline</span> <span class="keywordtype">void</span> move( tbb_thread& t1, tbb_thread& t2 ) {
+<a name="l00272"></a>00272 internal::move_v3(t1, t2);
+<a name="l00273"></a>00273 }
+<a name="l00274"></a>00274
+<a name="l00275"></a>00275 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ) {
+<a name="l00276"></a>00276 tbb::tbb_thread::native_handle_type h = t1.my_handle;
+<a name="l00277"></a>00277 t1.my_handle = t2.my_handle;
+<a name="l00278"></a>00278 t2.my_handle = h;
+<a name="l00279"></a>00279 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00280"></a>00280 <span class="preprocessor"></span> DWORD i = t1.my_thread_id;
+<a name="l00281"></a>00281 t1.my_thread_id = t2.my_thread_id;
+<a name="l00282"></a>00282 t2.my_thread_id = i;
+<a name="l00283"></a>00283 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00284"></a>00284 }
+<a name="l00285"></a>00285
+<a name="l00286"></a>00286 <span class="keyword">namespace </span>this_tbb_thread {
+<a name="l00287"></a>00287 <span class="keyword">inline</span> tbb_thread::id get_id() { <span class="keywordflow">return</span> internal::thread_get_id_v3(); }
+<a name="l00289"></a>00289 <span class="keyword">inline</span> <span class="keywordtype">void</span> yield() { internal::thread_yield_v3(); }
+<a name="l00291"></a>00291 <span class="keyword">inline</span> <span class="keywordtype">void</span> sleep(<span class="keyword">const</span> tick_count::interval_t &i) {
+<a name="l00292"></a>00292 internal::thread_sleep_v3(i);
+<a name="l00293"></a>00293 }
+<a name="l00294"></a>00294 } <span class="comment">// namespace this_tbb_thread</span>
+<a name="l00295"></a>00295
+<a name="l00296"></a>00296 } <span class="comment">// namespace tbb</span>
+<a name="l00297"></a>00297
+<a name="l00298"></a>00298 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_thread_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00411.html b/doc/html/a00474.html
similarity index 99%
rename from doc/html/a00411.html
rename to doc/html/a00474.html
index 7df1b4d..4fc22f9 100644
--- a/doc/html/a00411.html
+++ b/doc/html/a00474.html
@@ -87,7 +87,7 @@
<a name="l00066"></a>00066 <span class="preprocessor">#endif //__TBB_tbbmalloc_proxy_H</span>
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/a00413.html b/doc/html/a00476.html
similarity index 74%
rename from doc/html/a00413.html
rename to doc/html/a00476.html
index b74c274..809b56b 100644
--- a/doc/html/a00413.html
+++ b/doc/html/a00476.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="a00183.html">00038</a> <span class="keyword">class </span><a class="code" href="a00183.html">tick_count</a> {
+<a name="l00038"></a><a class="code" href="a00210.html">00038</a> <span class="keyword">class </span><a class="code" href="a00210.html">tick_count</a> {
<a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00041"></a><a class="code" href="a00184.html">00041</a> <span class="keyword">class </span><a class="code" href="a00184.html">interval_t</a> {
+<a name="l00041"></a><a class="code" href="a00211.html">00041</a> <span class="keyword">class </span><a class="code" href="a00211.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="a00184.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="a00211.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="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a> <a class="code" href="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>() : value(0) {};
+<a name="l00046"></a><a class="code" href="a00211.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a> <a class="code" href="a00211.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="a00184.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="a00211.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="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() <span class="keyword">const</span>;
+<a name="l00052"></a>00052 <span class="keywordtype">double</span> <a class="code" href="a00211.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="a00183.html">tbb::tick_count</a>;
+<a name="l00054"></a>00054 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00210.html">tbb::tick_count</a>;
<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keyword">friend</span> <a class="code" href="a00184.html">interval_t</a> <a class="code" href="a00184.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00183.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00183.html">tick_count</a>& t0 );
+<a name="l00057"></a>00057 <span class="keyword">friend</span> <a class="code" href="a00211.html">interval_t</a> <a class="code" href="a00211.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00210.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00210.html">tick_count</a>& t0 );
<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00184.html#5871ead1ca230efbe52a5008470e6428">00060</a> <span class="keyword">friend</span> <a class="code" href="a00184.html">interval_t</a> <a class="code" href="a00184.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00184.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00184.html">interval_t</a>& j ) {
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> <a class="code" href="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00184.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00184.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
+<a name="l00060"></a><a class="code" href="a00211.html#5871ead1ca230efbe52a5008470e6428">00060</a> <span class="keyword">friend</span> <a class="code" href="a00211.html">interval_t</a> <a class="code" href="a00211.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00211.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00211.html">interval_t</a>& j ) {
+<a name="l00061"></a>00061 <span class="keywordflow">return</span> <a class="code" href="a00211.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00211.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00211.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
<a name="l00062"></a>00062 }
<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00184.html#fa509691e1d689830931e36edd274f76">00065</a> <span class="keyword">friend</span> <a class="code" href="a00184.html">interval_t</a> <a class="code" href="a00184.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00184.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00184.html">interval_t</a>& j ) {
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> <a class="code" href="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00184.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00184.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
+<a name="l00065"></a><a class="code" href="a00211.html#fa509691e1d689830931e36edd274f76">00065</a> <span class="keyword">friend</span> <a class="code" href="a00211.html">interval_t</a> <a class="code" href="a00211.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00211.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00211.html">interval_t</a>& j ) {
+<a name="l00066"></a>00066 <span class="keywordflow">return</span> <a class="code" href="a00211.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00211.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00211.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
<a name="l00067"></a>00067 }
<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00184.html#cd9814947902e26463a69a111530f81b">00070</a> <a class="code" href="a00184.html">interval_t</a>& <a class="code" href="a00184.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00184.html">interval_t</a>& i ) {value += i.<a class="code" href="a00184.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
+<a name="l00070"></a><a class="code" href="a00211.html#cd9814947902e26463a69a111530f81b">00070</a> <a class="code" href="a00211.html">interval_t</a>& <a class="code" href="a00211.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00211.html">interval_t</a>& i ) {value += i.<a class="code" href="a00211.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="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a> <a class="code" href="a00184.html">interval_t</a>& <a class="code" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00184.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00184.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
+<a name="l00073"></a><a class="code" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a> <a class="code" href="a00211.html">interval_t</a>& <a class="code" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00211.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00211.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="a00183.html#34593326ae4191e02a13c7cbdab9de4c">00077</a> <a class="code" href="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>() : my_count(0) {};
+<a name="l00077"></a><a class="code" href="a00210.html#34593326ae4191e02a13c7cbdab9de4c">00077</a> <a class="code" href="a00210.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="a00183.html">tick_count</a> <a class="code" href="a00183.html#fb7f78ca61cf28398645ace66e284473">now</a>();
+<a name="l00080"></a>00080 <span class="keyword">static</span> <a class="code" href="a00210.html">tick_count</a> <a class="code" href="a00210.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="a00183.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00183.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00183.html">tick_count</a>& t0 );
+<a name="l00083"></a>00083 <span class="keyword">friend</span> interval_t <a class="code" href="a00210.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00210.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00210.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="a00183.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00183.html">tick_count</a> <a class="code" href="a00183.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
-<a name="l00090"></a>00090 <a class="code" href="a00183.html">tick_count</a> result;
+<a name="l00089"></a><a class="code" href="a00210.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00210.html">tick_count</a> <a class="code" href="a00210.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
+<a name="l00090"></a>00090 <a class="code" href="a00210.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="a00183.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = qpcnt.QuadPart;
+<a name="l00094"></a>00094 result.<a class="code" href="a00210.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="a00183.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="a00210.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="a00183.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="a00210.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="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00184.html#75a9a0949f8a8a84d6758835f1b48dad">tick_count::interval_t::interval_t</a>( <span class="keywordtype">double</span> sec )
+<a name="l00115"></a><a class="code" href="a00211.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00211.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="a00183.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00184.html">tick_count::interval_t</a> <a class="code" href="a00183.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00183.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00183.html">tick_count</a>& t0 ) {
-<a name="l00129"></a>00129 <span class="keywordflow">return</span> <a class="code" href="a00184.html">tick_count::interval_t</a>( t1.<a class="code" href="a00183.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00183.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
+<a name="l00128"></a><a class="code" href="a00210.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00211.html">tick_count::interval_t</a> <a class="code" href="a00210.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00210.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00210.html">tick_count</a>& t0 ) {
+<a name="l00129"></a>00129 <span class="keywordflow">return</span> <a class="code" href="a00211.html">tick_count::interval_t</a>( t1.<a class="code" href="a00210.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00210.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131
-<a name="l00132"></a><a class="code" href="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">tick_count::interval_t::seconds</a>()<span class="keyword"> const </span>{
+<a name="l00132"></a><a class="code" href="a00211.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00211.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);
@@ -155,7 +155,7 @@
<a name="l00147"></a>00147
</pre></div><hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index 4ed86df..92e7cbc 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -21,78 +21,84 @@
<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="a00120.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00121.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="a00122.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00123.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00123.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00124.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="a00125.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00126.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00127.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="a00128.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="a00129.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="a00130.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="a00131.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="a00132.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="a00133.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="a00134.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="a00135.html">tbb::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="a00136.html">tbb::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="a00137.html">tbb::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="a00138.html">tbb::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="a00139.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="a00140.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="a00141.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00142.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="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The thread local class template </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00144.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00145.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="a00146.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00147.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="a00148.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="a00149.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="a00150.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="a00151.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00152.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00153.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="a00154.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="a00155.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="a00156.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="a00157.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="a00158.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeling that applies filters to items </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00159.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="a00160.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="a00161.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="a00162.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="a00163.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="a00164.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="a00165.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="a00166.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="a00167.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="a00168.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00169.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="a00170.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="a00171.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="a00172.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="a00173.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="a00174.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00175.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="a00176.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00177.html">tbb::task_scheduler_init</a></td><td class="indexvalue">Class representing reference to tbb scheduler </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00178.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="a00179.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="a00180.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="a00181.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="a00182.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="a00183.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00184.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00185.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="a00186.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="a00187.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="a00141.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00142.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="a00143.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00144.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00145.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="a00146.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00147.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00148.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="a00149.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="a00150.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="a00151.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="a00152.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="a00153.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="a00154.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="a00155.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="a00156.html">tbb::interface4::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="a00157.html">tbb::interface4::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="a00158.html">tbb::interface4::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="a00159.html">tbb::interface4::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="a00160.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="a00161.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="a00162.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00163.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="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00164.html">enumerable_thread_specific</a> container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00165.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00166.html">tbb::interface5::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="a00167.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="a00168.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00169.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="a00170.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="a00171.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="a00172.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="a00173.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00174.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00175.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="a00176.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="a00177.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="a00178.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="a00179.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="a00180.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeling that applies filters to items </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00181.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="a00182.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="a00183.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="a00184.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="a00185.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="a00186.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="a00187.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="a00188.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="a00189.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="a00190.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="a00191.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="a00192.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="a00193.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00194.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="a00195.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="a00196.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="a00197.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="a00198.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="a00199.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00200.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="a00201.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="a00202.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td><td class="indexvalue">Class representing reference to tbb scheduler </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00204.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="a00205.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="a00206.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="a00207.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="a00208.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="a00209.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="a00210.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00211.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00212.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="a00213.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="a00214.html">tbb::zero_allocator< void, Allocator ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/concepts.html b/doc/html/concepts.html
index 5bc1b55..cfb3171 100644
--- a/doc/html/concepts.html
+++ b/doc/html/concepts.html
@@ -22,7 +22,7 @@ TBB defines a set of minimal requirements each concept must conform to. Here is
<li><a class="el" href="range_req.html">Requirements on range concept</a></li><li><a class="el" href="parallel_do_body_req.html">Requirements on parallel_do body</a></li><li><a class="el" href="parallel_for_body_req.html">Requirements on parallel_for body</a></li><li><a class="el" href="parallel_reduce_body_req.html">Requirements on parallel_reduce body</a></li><li><a class="el" href="parallel_scan_body_req.html">Requirements on parallel_scan body</a></li><li><a class="el" href="parallel [...]
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
index ed3cb23..64f4a72 100644
--- a/doc/html/deprecated.html
+++ b/doc/html/deprecated.html
@@ -15,17 +15,12 @@
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1><a class="anchor" name="deprecated">Deprecated List</a></h1><a class="anchor" name="_deprecated000001"></a> <dl>
-<dt>Member <a class="el" href="a00140.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
+<dt>Member <a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
<dd>Use try_pop() </dd>
</dl>
-<p>
-<a class="anchor" name="_deprecated000002"></a> <dl>
-<dt>Member <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">tbb::filter::serial</a> </dt>
-<dd>use serial_in_order instead </dd>
-</dl>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/files.html b/doc/html/files.html
index 49fabc6..35b0b7f 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -20,58 +20,61 @@
<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>_concurrent_queue_internal.h</b> <a href="a00247.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>_tbb_windef.h</b> <a href="a00263.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00265.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>atomic.h</b> <a href="a00266.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00274.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00275.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00276.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00277.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>combinable.h</b> <a href="a00279.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00280.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00292.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00293.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00302.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00305.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>mutex.h</b> <a href="a00313.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00315.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00316.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00317.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00326.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00330.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00332.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00338.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00342.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00347.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00351.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00355.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00360.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00361.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00362.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00363.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00218.html">scalable_allocator.h</a> <a href="a00364.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00365.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00366.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task.h</b> <a href="a00367.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_group.h</b> <a href="a00376.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_scheduler_init.h</b> <a href="a00383.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_scheduler_observer.h</b> <a href="a00384.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb.h</b> <a href="a00386.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_allocator.h</b> <a href="a00387.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00391.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_config_lrb.h</b> <a href="a00392.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00393.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00394.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00397.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00398.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00403.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00411.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00413.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>_concurrent_queue_internal.h</b> <a href="a00280.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>_concurrent_unordered_internal.h</b> <a href="a00298.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>_tbb_windef.h</b> <a href="a00308.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00310.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>atomic.h</b> <a href="a00311.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00319.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00320.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00321.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00322.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>combinable.h</b> <a href="a00324.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00325.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00335.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00336.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00341.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00350.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00353.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>mutex.h</b> <a href="a00362.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00364.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00365.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00366.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00375.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00379.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00381.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00387.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00391.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00396.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00400.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00404.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00409.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00420.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00421.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00422.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00423.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00248.html">scalable_allocator.h</a> <a href="a00424.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00425.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00426.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task.h</b> <a href="a00427.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task_group.h</b> <a href="a00436.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task_scheduler_init.h</b> <a href="a00443.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task_scheduler_observer.h</b> <a href="a00444.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb.h</b> <a href="a00446.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_allocator.h</b> <a href="a00447.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00451.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_config_lrb.h</b> <a href="a00452.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00453.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00454.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00458.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00459.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00466.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00474.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00476.html">[code]</a></td><td class="indexvalue"></td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions.html b/doc/html/functions.html
index eb9c00e..70fd895 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -62,244 +62,244 @@ 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="a00172.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00157.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00156.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00158.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00174.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
-: <a class="el" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
-: <a class="el" href="a00181.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00178.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00166.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00130.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_additional_child_of()
-: <a class="el" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">tbb::task</a><li>allocate_child()
-: <a class="el" href="a00174.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00174.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00174.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
-: <a class="el" href="a00178.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00143.html#60047d25605a1ef993c49234e9ac5c2d">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
-: <a class="el" href="a00141.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00141.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
-: <a class="el" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00179.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00178.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
+: <a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
+: <a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
+: <a class="el" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00199.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
+: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
+: <a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
+: <a class="el" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00141.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00143.html#ba6674c6102a6faf8f96d131497654b3">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00127.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00127.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00135.html#d1c1e23f2a3ba1f943d00d95388d718f">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
-: <a class="el" href="a00174.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00175.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00141.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
-: <a class="el" href="a00141.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00141.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
-: <a class="el" href="a00176.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00158.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">tbb::c [...]
-: <a class="el" href="a00129.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00128.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00141.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00135.html#b5132202dff9ee3d619bef6b1d84edea">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
-: <a class="el" href="a00140.html#383187b910f8c3ca27a39c1638566f15">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00139.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00141.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00138.html#6eedb35a3ca397dd289ed5ca6fb4d95d">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
-: <a class="el" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>construct()
-: <a class="el" href="a00178.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00130.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
-: <a class="el" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>count()
-: <a class="el" href="a00135.html#a3e97a1f3cb66e81a2336b013ef1ae7d">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00141.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00141.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
+: <a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
+: <a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
+: <a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>construct()
+: <a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>count()
+: <a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00174.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>default_num_threads()
-: <a class="el" href="a00177.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
-: <a class="el" href="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00181.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00149.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00180.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00178.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>downgrade_to_reader()
-: <a class="el" href="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00163.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>default_num_threads()
+: <a class="el" href="a00203.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
+: <a class="el" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>downgrade_to_reader()
+: <a class="el" href="a00197.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>empty()
-: <a class="el" href="a00176.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00143.html#ad23345a722622199deaa4dfd243d9f8">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#f3f6fce0cf [...]
-: <a class="el" href="a00143.html#89811890e6a77f1e0cfc6c24ed35d09b">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00121.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enumerable_thread_specific()
-: <a class="el" href="a00143.html#0466c43272d8458185e980fc2dc4abe2">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00135.html#b65abfa291da566617dd58dfb349630a">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00135.html#671965989ffb5f6084c776cb0bb6cdab">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
-: <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">tbb::task</a><li>executing
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
+: <a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.htm [...]
+: <a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00199.html#22c298cd40937a431a06777423f002f6">tbb::task</a><li>executing
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>finalize()
-: <a class="el" href="a00144.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00135.html#4f7cc0aab2d8216c0a6e681f32dd48c8">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>freed
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
-: <a class="el" href="a00141.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>freed
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
+: <a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00141.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00135.html#79d1e5c3b975dbd38b43138266fe4c0e">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>grainsize()
-: <a class="el" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
-: <a class="el" href="a00141.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
-: <a class="el" href="a00141.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><l [...]
+: <a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
+: <a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
-: <a class="el" href="a00174.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>init()
-: <a class="el" href="a00175.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00177.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00135.html#7b42dba04d71e1367f0d542087906178">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00135.html#7973cd92f57dcb092ab757f8d9e089f9">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00135.html#308ec5ad19fdd1be4d345f8013070150">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00135.html#f0cdf5930563a49ffe827c520e948e01">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
-: <a class="el" href="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00177.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00144.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00174.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00129.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00128.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00127.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00175.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00144.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00174.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00144.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00174.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00137.html#adf8e405df5787351fe816c42042b9ec">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
+: <a class="el" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>init()
+: <a class="el" href="a00201.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00203.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
+: <a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
+: <a class="el" href="a00211.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00203.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
+: <a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
+: <a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00199.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
+: <a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>local()
-: <a class="el" href="a00143.html#9505351eace34ed7130257adcae91706">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00169.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00164.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00150.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00171.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a><li>lookup()
-: <a class="el" href="a00135.html#0f0ba43d9cb783f12dd01bf5677da097">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00196.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00196.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>malloc_type
-: <a class="el" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
-: <a class="el" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00166.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00141.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00135.html#6ed260e217fb310050928d7bd03f1b5e">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00130.html#fb23b68 [...]
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">tbb::filter</a><li>move()
-: <a class="el" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
-: <a class="el" href="a00150.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a><li>my_exception_data
-: <a class="el" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
+: <a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00151. [...]
+: <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00172.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a><li>my_exception_data
+: <a class="el" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00180.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
-: <a class="el" href="a00174.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00183.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
+: <a class="el" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
+: <a class="el" href="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00210.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>operator *()
-: <a class="el" href="a00136.html#03a091f7355a3c0c03f839893695f372">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00138.html#d95b7a39a08b7ab256dfff2ca37cdb75">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00144.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00137.html#7e98ad1b46ed35fb4a92d65c16c6982d">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
-: <a class="el" href="a00184.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
-: <a class="el" href="a00184.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00183.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00184.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00136.html#302f02e5deec0a67b872e9cfb08d9e60">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00138.html#6fc0491f6420ffe38c48786e7b9ab042">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00141.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00135.html#adadeb9d1acb8c3b34517435666cf297">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00141.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
+: <a class="el" href="a00211.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
+: <a class="el" href="a00211.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00210.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00211.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>page_range_type
-: <a class="el" href="a00129.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
-: <a class="el" href="a00129.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">tbb::filter</a><li>parallel_while()
-: <a class="el" href="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00158.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00176.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00140.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
-: <a class="el" href="a00182.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
-: <a class="el" href="a00176.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00140.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
+: <a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00202.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
+: <a class="el" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
+: <a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queuing_mutex()
-: <a class="el" href="a00160.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00162.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00143.html#a32dd1d88e42dc1faccceca244b12b6c">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00141.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>ready
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
-: <a class="el" href="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
-: <a class="el" href="a00174.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00174.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00174.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00174.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
-: <a class="el" href="a00174.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
-: <a class="el" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>register_pending_exception()
-: <a class="el" href="a00175.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>rehash()
-: <a class="el" href="a00135.html#9ba53dc3a98d81331ded7c6c2b17f58f">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00141.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00141.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
-: <a class="el" href="a00175.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00141.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>row_range_type
-: <a class="el" href="a00128.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
-: <a class="el" href="a00129.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00128.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00158.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00157.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a></ul>
+: <a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
+: <a class="el" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
+: <a class="el" href="a00199.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00199.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00199.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
+: <a class="el" href="a00199.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
+: <a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>register_pending_exception()
+: <a class="el" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>rehash()
+: <a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
+: <a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>row_range_type
+: <a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
+: <a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00180.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a></ul>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
-: <a class="el" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#fbb8798792d3aebb136c46fc63d2529e">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#9b51ef972f5618ac17caadb58841ab6d">tbb::qu [...]
-: <a class="el" href="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>serial
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">tbb::filter</a><li>serial_in_order
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">tbb::filter</a><li>serial_out_of_order
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">tbb::filter</a><li>set_affinity()
-: <a class="el" href="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
-: <a class="el" href="a00174.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>shrink_to_fit()
-: <a class="el" href="a00141.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
-: <a class="el" href="a00143.html#302a4d6f55f852d5b7a6679e0e00316e">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00135.html#25b0e3881038877604c5efc1c14c4afd">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator &g [...]
-: <a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>spawn()
-: <a class="el" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">tbb::task</a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00174.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00171.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00174.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>swap()
-: <a class="el" href="a00141.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00135.html#dd73f70aa6602021ea2c56bac9715353">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00197.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00187.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00185.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00188.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00211.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>set_affinity()
+: <a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
+: <a class="el" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">tbb::interface4::concurrent_hash_map< Key, T, H [...]
+: <a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00194.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
+: <a class="el" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>swap()
+: <a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
-: <a class="el" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00176.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00177.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00181.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00149.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00180.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00171.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00164.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00150.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00171.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a><li>try_pop()
-: <a class="el" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
-: <a class="el" href="a00182.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
+: <a class="el" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
+: <a class="el" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
+: <a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00210.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00196.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00189.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00196.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
+: <a class="el" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
-: <a class="el" href="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00169.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00164.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00150.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00139.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00172.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00163.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00196.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00197.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_v">- v -</a></h3><ul>
<li>value_type
-: <a class="el" href="a00157.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00134.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00136.html#34035ddb9e2a27f2f0a1f6a2a16730cf">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a cl [...]
+: <a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accesso [...]
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
-: <a class="el" href="a00174.html#53d2615ad9c38859b4c8080936600283">tbb::task</a><li>what()
-: <a class="el" href="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00180.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00199.html#53d2615ad9c38859b4c8080936600283">tbb::task</a><li>what()
+: <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
-<li>~bad_last_alloc()
-: <a class="el" href="a00126.html#af817b8268cabc44ecd9c9ef986f6192">tbb::bad_last_alloc</a><li>~combinable()
-: <a class="el" href="a00133.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00135.html#5e96649f71f68f3b6bf3b1eee6b441a7">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00139.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00141.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00138.html#e002771760f510e06c03e0a198286172">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00143.html#41176526161d6fef1bdd19c2db7ded4d">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00144.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
-: <a class="el" href="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00158.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00162.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~scoped_lock()
-: <a class="el" href="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#ac2c576a93570957d694192a5f491443">tbb::qu [...]
-: <a class="el" href="a00171.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00174.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00176.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00177.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+<li>~combinable()
+: <a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
+: <a class="el" href="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00186.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~scoped_lock()
+: <a class="el" href="a00197.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00187.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00185.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00188.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00196.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
+: <a class="el" href="a00202.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
+: <a class="el" href="a00203.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html
index 1c15b28..2e25ba7 100644
--- a/doc/html/functions_enum.html
+++ b/doc/html/functions_enum.html
@@ -35,12 +35,12 @@
<p>
<ul>
<li>malloc_type
-: <a class="el" href="a00178.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>mode
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf">tbb::filter</a><li>state_type
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a></ul>
+: <a class="el" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
+: <a class="el" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html
index b6c77e3..1887a18 100644
--- a/doc/html/functions_eval.html
+++ b/doc/html/functions_eval.html
@@ -35,19 +35,15 @@
<p>
<ul>
<li>allocated
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>executing
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>parallel
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf75740556347260927e94ce3b23a34abe">tbb::filter</a><li>ready
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
-: <a class="el" href="a00174.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>serial
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cff8662693d85bd1cd3df052b761edd237">tbb::filter</a><li>serial_in_order
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf5645f2f2a541e53009d3e719c06c5f93">tbb::filter</a><li>serial_out_of_order
-: <a class="el" href="a00144.html#d3b6ed2c517144199d0c39c62ddfd8cf7fb70bcb663107adfc2938de89bab7d9">tbb::filter</a></ul>
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>executing
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
+: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index 8ce672e..c7261f4 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -61,215 +61,218 @@
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>acquire()
-: <a class="el" href="a00172.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00157.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00156.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00158.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00174.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
-: <a class="el" href="a00181.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00178.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00166.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00130.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_additional_child_of()
-: <a class="el" href="a00174.html#43bfe64c0e9333c0ca895cc0c375512b">tbb::task</a><li>allocate_child()
-: <a class="el" href="a00174.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00174.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00174.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
-: <a class="el" href="a00178.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00143.html#60047d25605a1ef993c49234e9ac5c2d">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
-: <a class="el" href="a00141.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00141.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00179.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00178.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
+: <a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
+: <a class="el" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00199.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
+: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
+: <a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00141.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00143.html#ba6674c6102a6faf8f96d131497654b3">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00127.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00121.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00127.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00135.html#d1c1e23f2a3ba1f943d00d95388d718f">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
-: <a class="el" href="a00174.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00175.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00141.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
-: <a class="el" href="a00141.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00141.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
-: <a class="el" href="a00176.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00158.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00143.html#c890601a45273ef759e64ac2fe75cb6a">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#90b31e2954c6e4596c7900435a5f4bc1">tbb::c [...]
-: <a class="el" href="a00129.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00128.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00141.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00134.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00135.html#b5132202dff9ee3d619bef6b1d84edea">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
-: <a class="el" href="a00140.html#383187b910f8c3ca27a39c1638566f15">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00139.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00141.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00138.html#6eedb35a3ca397dd289ed5ca6fb4d95d">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
-: <a class="el" href="a00178.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00130.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
-: <a class="el" href="a00174.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>count()
-: <a class="el" href="a00135.html#a3e97a1f3cb66e81a2336b013ef1ae7d">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00141.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00141.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
+: <a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
+: <a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
+: <a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>count()
+: <a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00178.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00166.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00130.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00174.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>default_num_threads()
-: <a class="el" href="a00177.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00181.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00149.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00180.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00178.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00172.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00163.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>default_num_threads()
+: <a class="el" href="a00203.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00197.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>empty()
-: <a class="el" href="a00176.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00143.html#ad23345a722622199deaa4dfd243d9f8">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#f3f6fce0cf [...]
-: <a class="el" href="a00143.html#89811890e6a77f1e0cfc6c24ed35d09b">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00127.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00121.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enumerable_thread_specific()
-: <a class="el" href="a00143.html#0466c43272d8458185e980fc2dc4abe2">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00135.html#b65abfa291da566617dd58dfb349630a">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00135.html#671965989ffb5f6084c776cb0bb6cdab">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
-: <a class="el" href="a00174.html#22c298cd40937a431a06777423f002f6">tbb::task</a></ul>
+: <a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.htm [...]
+: <a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00199.html#22c298cd40937a431a06777423f002f6">tbb::task</a></ul>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>finalize()
-: <a class="el" href="a00144.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00135.html#4f7cc0aab2d8216c0a6e681f32dd48c8">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>front()
-: <a class="el" href="a00141.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>front()
+: <a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00141.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00135.html#79d1e5c3b975dbd38b43138266fe4c0e">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>grainsize()
-: <a class="el" href="a00127.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
-: <a class="el" href="a00141.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
-: <a class="el" href="a00141.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><l [...]
+: <a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
+: <a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
-: <a class="el" href="a00174.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>init()
-: <a class="el" href="a00175.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00177.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00135.html#7b42dba04d71e1367f0d542087906178">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00135.html#7973cd92f57dcb092ab757f8d9e089f9">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00135.html#308ec5ad19fdd1be4d345f8013070150">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00135.html#f0cdf5930563a49ffe827c520e948e01">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
-: <a class="el" href="a00184.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00177.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00144.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00174.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00129.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00128.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00127.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00175.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00144.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00174.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00144.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00174.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00137.html#adf8e405df5787351fe816c42042b9ec">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
+: <a class="el" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>init()
+: <a class="el" href="a00201.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00203.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
+: <a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
+: <a class="el" href="a00211.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00203.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
+: <a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
+: <a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00199.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
+: <a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>local()
-: <a class="el" href="a00143.html#9505351eace34ed7130257adcae91706">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00171.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00169.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00164.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00150.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00171.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a><li>lookup()
-: <a class="el" href="a00135.html#0f0ba43d9cb783f12dd01bf5677da097">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00196.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00196.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>max_size()
-: <a class="el" href="a00178.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00166.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00141.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00135.html#6ed260e217fb310050928d7bd03f1b5e">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00130.html#fb23b68 [...]
-: <a class="el" href="a00149.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00180.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
-: <a class="el" href="a00150.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a></ul>
+: <a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00151. [...]
+: <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00172.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a></ul>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00149.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00180.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
-: <a class="el" href="a00174.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00183.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
+: <a class="el" href="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00210.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>operator *()
-: <a class="el" href="a00136.html#03a091f7355a3c0c03f839893695f372">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00138.html#d95b7a39a08b7ab256dfff2ca37cdb75">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00180.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00144.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00137.html#7e98ad1b46ed35fb4a92d65c16c6982d">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
-: <a class="el" href="a00184.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00184.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00136.html#302f02e5deec0a67b872e9cfb08d9e60">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00138.html#6fc0491f6420ffe38c48786e7b9ab042">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00141.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00135.html#adadeb9d1acb8c3b34517435666cf297">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00141.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
+: <a class="el" href="a00211.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>pages()
-: <a class="el" href="a00129.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00157.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00174.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00124.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00158.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00134.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00176.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00140.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
-: <a class="el" href="a00182.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00134.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
-: <a class="el" href="a00176.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00141.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00140.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00202.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
+: <a class="el" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
+: <a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queuing_mutex()
-: <a class="el" href="a00160.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00162.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00143.html#a32dd1d88e42dc1faccceca244b12b6c">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00141.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>recursive_mutex()
-: <a class="el" href="a00164.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
-: <a class="el" href="a00174.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00174.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00174.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00174.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
-: <a class="el" href="a00174.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
-: <a class="el" href="a00175.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>rehash()
-: <a class="el" href="a00135.html#9ba53dc3a98d81331ded7c6c2b17f58f">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00172.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00141.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00141.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
-: <a class="el" href="a00175.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00141.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>rows()
-: <a class="el" href="a00129.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00128.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00158.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00157.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a></ul>
+: <a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
+: <a class="el" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
+: <a class="el" href="a00199.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00199.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00199.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
+: <a class="el" href="a00199.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
+: <a class="el" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>rehash()
+: <a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
+: <a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>rows()
+: <a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00180.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a></ul>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
-: <a class="el" href="a00172.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#fbb8798792d3aebb136c46fc63d2529e">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#9b51ef972f5618ac17caadb58841ab6d">tbb::qu [...]
-: <a class="el" href="a00184.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00174.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>set_affinity()
-: <a class="el" href="a00174.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00134.html#089f33dfd504e30a95f40ed2a5799367">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
-: <a class="el" href="a00174.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>shrink_to_fit()
-: <a class="el" href="a00141.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
-: <a class="el" href="a00143.html#302a4d6f55f852d5b7a6679e0e00316e">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00141.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00134.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00135.html#25b0e3881038877604c5efc1c14c4afd">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator &g [...]
-: <a class="el" href="a00174.html#db841c647eb6d754440c2f4e4a73c80b">tbb::task</a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00174.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00174.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00169.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00171.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00174.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>swap()
-: <a class="el" href="a00141.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00135.html#dd73f70aa6602021ea2c56bac9715353">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00197.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00187.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00185.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00188.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00211.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>set_affinity()
+: <a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
+: <a class="el" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">tbb::interface4::concurrent_hash_map< Key, T, H [...]
+: <a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00194.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>swap()
+: <a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
-: <a class="el" href="a00174.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00175.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00176.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00177.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00177.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00181.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00149.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00180.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00183.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00172.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00171.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00169.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00164.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00150.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00171.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a><li>try_pop()
-: <a class="el" href="a00134.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
-: <a class="el" href="a00182.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00134.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
+: <a class="el" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
+: <a class="el" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
+: <a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00210.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00196.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00189.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00196.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
+: <a class="el" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
-: <a class="el" href="a00171.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00169.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00164.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00150.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00139.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00172.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00163.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00196.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00197.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
-: <a class="el" href="a00174.html#53d2615ad9c38859b4c8080936600283">tbb::task</a><li>what()
-: <a class="el" href="a00149.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00132.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00180.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00199.html#53d2615ad9c38859b4c8080936600283">tbb::task</a><li>what()
+: <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
-<li>~bad_last_alloc()
-: <a class="el" href="a00126.html#af817b8268cabc44ecd9c9ef986f6192">tbb::bad_last_alloc</a><li>~combinable()
-: <a class="el" href="a00133.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00134.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00135.html#5e96649f71f68f3b6bf3b1eee6b441a7">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00139.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00141.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00138.html#e002771760f510e06c03e0a198286172">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00143.html#41176526161d6fef1bdd19c2db7ded4d">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00144.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
-: <a class="el" href="a00157.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00158.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00162.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~scoped_lock()
-: <a class="el" href="a00172.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00170.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00165.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00163.html#32c7d67a660d23ebbaab1a1d2826d31a">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00161.html#ac2c576a93570957d694192a5f491443">tbb::qu [...]
-: <a class="el" href="a00171.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00174.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00176.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00177.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+<li>~combinable()
+: <a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
+: <a class="el" href="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00186.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~scoped_lock()
+: <a class="el" href="a00197.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00187.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00185.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00188.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00196.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
+: <a class="el" href="a00202.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
+: <a class="el" href="a00203.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index d4dd222..0499987 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -35,11 +35,11 @@
<p>
<ul>
<li>operator+
-: <a class="el" href="a00184.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00183.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00184.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
+: <a class="el" href="a00211.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00210.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00211.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html
index b07ebac..20895b7 100644
--- a/doc/html/functions_type.html
+++ b/doc/html/functions_type.html
@@ -35,19 +35,20 @@
<p>
<ul>
<li>affinity_id
-: <a class="el" href="a00174.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
-: <a class="el" href="a00178.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00143.html#60047d25605a1ef993c49234e9ac5c2d">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00134.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>const_iterator
-: <a class="el" href="a00127.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00134.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>difference_type
-: <a class="el" href="a00134.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>page_range_type
-: <a class="el" href="a00129.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>reference
-: <a class="el" href="a00134.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>row_range_type
-: <a class="el" href="a00128.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
-: <a class="el" href="a00134.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00127.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>value_type
-: <a class="el" href="a00157.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00134.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00139.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00136.html#34035ddb9e2a27f2f0a1f6a2a16730cf">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a cl [...]
+: <a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
+: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>co [...]
+: <a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>difference_type
+: <a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>native_handle_type
+: <a class="el" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>page_range_type
+: <a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>reference
+: <a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>row_range_type
+: <a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
+: <a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>value_type
+: <a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accesso [...]
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
index 2cfa6d1..9841113 100644
--- a/doc/html/functions_vars.html
+++ b/doc/html/functions_vars.html
@@ -35,12 +35,12 @@
<p>
<ul>
<li>automatic
-: <a class="el" href="a00177.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>deferred
-: <a class="el" href="a00177.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>my_exception_data
-: <a class="el" href="a00149.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>deferred
+: <a class="el" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>my_exception_data
+: <a class="el" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/globals.html b/doc/html/globals.html
index 058fc3f..a799f1d 100644
--- a/doc/html/globals.html
+++ b/doc/html/globals.html
@@ -29,18 +29,18 @@ Here is a list of all documented file members with links to the documentation:
<p>
<ul>
<li>scalable_aligned_free()
-: <a class="el" href="a00243.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00243.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00243.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00243.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00243.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00243.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00243.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00243.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00243.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+: <a class="el" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
index 56d2188..853ac56 100644
--- a/doc/html/globals_func.html
+++ b/doc/html/globals_func.html
@@ -29,18 +29,18 @@
<p>
<ul>
<li>scalable_aligned_free()
-: <a class="el" href="a00243.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00243.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00243.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00243.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00243.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00243.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00243.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00243.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00243.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+: <a class="el" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index e644b0d..152759b 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -21,89 +21,95 @@
<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="a00120.html">tbb::affinity_partitioner</a>
-<li><a class="el" href="a00121.html">tbb::aligned_space< T, N ></a>
-<li><a class="el" href="a00122.html">tbb::atomic< T ></a>
-<li><a class="el" href="a00123.html">tbb::atomic< void * ></a>
-<li><a class="el" href="a00124.html">tbb::internal::atomic_backoff</a>
-<li><a class="el" href="a00125.html">tbb::auto_partitioner</a>
-<li><a class="el" href="a00126.html">tbb::bad_last_alloc</a>
-<li><a class="el" href="a00127.html">tbb::blocked_range< Value ></a>
-<li><a class="el" href="a00128.html">tbb::blocked_range2d< RowValue, ColValue ></a>
-<li><a class="el" href="a00129.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
-<li><a class="el" href="a00127.html">tbb::blocked_range< I ></a>
-<li><a class="el" href="a00130.html">tbb::cache_aligned_allocator< T ></a>
-<li><a class="el" href="a00131.html">tbb::cache_aligned_allocator< void ></a>
-<li><a class="el" href="a00133.html">tbb::combinable< T ></a>
-<li><a class="el" href="a00134.html">tbb::concurrent_bounded_queue< T, A ></a>
+<li><a class="el" href="a00141.html">tbb::affinity_partitioner</a>
+<li><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a>
+<li><a class="el" href="a00143.html">tbb::atomic< T ></a>
+<li><a class="el" href="a00144.html">tbb::atomic< void * ></a>
+<li><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a>
+<li><a class="el" href="a00146.html">tbb::auto_partitioner</a>
+<li><a class="el" href="a00147.html">tbb::bad_last_alloc</a>
+<li><a class="el" href="a00148.html">tbb::blocked_range< Value ></a>
+<li><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>
+<li><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
+<li><a class="el" href="a00148.html">tbb::blocked_range< I ></a>
+<li><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>
+<li><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a>
+<li><a class="el" href="a00154.html">tbb::combinable< T ></a>
+<li><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>
<ul>
-<li><a class="el" href="a00140.html">tbb::deprecated::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>
</ul>
-<li><a class="el" href="a00135.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
-<li><a class="el" href="a00137.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
-<li><a class="el" href="a00138.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<li><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
+<li><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
+<li><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
<ul>
-<li><a class="el" href="a00136.html">tbb::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+<li><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
</ul>
-<li><a class="el" href="a00139.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
-<li><a class="el" href="a00141.html">tbb::concurrent_vector< T, A ></a>
-<li><a class="el" href="a00143.html">tbb::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
-<li><a class="el" href="a00144.html">tbb::filter</a>
+<li><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>
+<li><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
+<li><a class="el" href="a00165.html">tbb::filter</a>
<ul>
-<li><a class="el" href="a00182.html">tbb::thread_bound_filter</a>
+<li><a class="el" href="a00209.html">tbb::thread_bound_filter</a>
</ul>
-<li><a class="el" href="a00145.html">tbb::final_scan_tag</a>
-<li><a class="el" href="a00146.html">tbb::improper_lock</a>
-<li><b>atomic_impl</b><li><a class="el" href="a00147.html">tbb::invalid_multiple_scheduling</a>
-<li><a class="el" href="a00148.html">tbb::missing_wait</a>
-<li><a class="el" href="a00150.html">tbb::mutex</a>
-<li><a class="el" href="a00151.html">tbb::mutex::scoped_lock</a>
-<li><a class="el" href="a00152.html">tbb::null_mutex</a>
-<li><a class="el" href="a00153.html">tbb::null_mutex::scoped_lock</a>
-<li><a class="el" href="a00154.html">tbb::null_rw_mutex</a>
-<li><a class="el" href="a00155.html">tbb::null_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00156.html">tbb::parallel_do_feeder< Item ></a>
-<li><a class="el" href="a00157.html">tbb::parallel_while< Body ></a>
-<li><a class="el" href="a00158.html">tbb::pipeline</a>
-<li><a class="el" href="a00159.html">tbb::pre_scan_tag</a>
-<li><a class="el" href="a00160.html">tbb::queuing_mutex</a>
-<li><a class="el" href="a00161.html">tbb::queuing_mutex::scoped_lock</a>
-<li><a class="el" href="a00162.html">tbb::queuing_rw_mutex</a>
-<li><a class="el" href="a00163.html">tbb::queuing_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00164.html">tbb::recursive_mutex</a>
-<li><a class="el" href="a00165.html">tbb::recursive_mutex::scoped_lock</a>
-<li><a class="el" href="a00166.html">tbb::scalable_allocator< T ></a>
-<li><a class="el" href="a00167.html">tbb::scalable_allocator< void ></a>
-<li><a class="el" href="a00168.html">tbb::simple_partitioner</a>
-<li><a class="el" href="a00169.html">tbb::spin_mutex</a>
-<li><a class="el" href="a00170.html">tbb::spin_mutex::scoped_lock</a>
-<li><a class="el" href="a00171.html">tbb::spin_rw_mutex_v3</a>
-<li><a class="el" href="a00172.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
-<li><a class="el" href="a00173.html">tbb::split</a>
-<li><a class="el" href="a00174.html">tbb::task</a>
+<li><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>
+<li><a class="el" href="a00167.html">tbb::final_scan_tag</a>
+<li><a class="el" href="a00168.html">tbb::improper_lock</a>
+<li><b>atomic_impl</b><li><a class="el" href="a00169.html">tbb::invalid_multiple_scheduling</a>
+<li><a class="el" href="a00170.html">tbb::missing_wait</a>
+<li><a class="el" href="a00172.html">tbb::mutex</a>
+<li><a class="el" href="a00173.html">tbb::mutex::scoped_lock</a>
+<li><a class="el" href="a00174.html">tbb::null_mutex</a>
+<li><a class="el" href="a00175.html">tbb::null_mutex::scoped_lock</a>
+<li><a class="el" href="a00176.html">tbb::null_rw_mutex</a>
+<li><a class="el" href="a00177.html">tbb::null_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00178.html">tbb::parallel_do_feeder< Item ></a>
+<li><a class="el" href="a00179.html">tbb::parallel_while< Body ></a>
+<li><a class="el" href="a00180.html">tbb::pipeline</a>
+<li><a class="el" href="a00181.html">tbb::pre_scan_tag</a>
+<li><a class="el" href="a00182.html">tbb::queuing_mutex</a>
+<li><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a>
+<li><a class="el" href="a00184.html">tbb::queuing_rw_mutex</a>
+<li><a class="el" href="a00185.html">tbb::queuing_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a>
+<li><a class="el" href="a00187.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
+<li><a class="el" href="a00188.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
+<li><a class="el" href="a00189.html">tbb::recursive_mutex</a>
+<li><a class="el" href="a00190.html">tbb::recursive_mutex::scoped_lock</a>
+<li><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a>
+<li><a class="el" href="a00192.html">tbb::scalable_allocator< void ></a>
+<li><a class="el" href="a00193.html">tbb::simple_partitioner</a>
+<li><a class="el" href="a00194.html">tbb::spin_mutex</a>
+<li><a class="el" href="a00195.html">tbb::spin_mutex::scoped_lock</a>
+<li><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a>
+<li><a class="el" href="a00197.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
+<li><a class="el" href="a00198.html">tbb::split</a>
+<li><a class="el" href="a00199.html">tbb::task</a>
<ul>
-<li><a class="el" href="a00142.html">tbb::empty_task</a>
+<li><a class="el" href="a00163.html">tbb::empty_task</a>
</ul>
-<li><a class="el" href="a00175.html">tbb::task_group_context</a>
-<li><a class="el" href="a00176.html">tbb::task_list</a>
-<li><a class="el" href="a00177.html">tbb::task_scheduler_init</a>
-<li><a class="el" href="a00178.html">tbb::tbb_allocator< T ></a>
-<li><a class="el" href="a00179.html">tbb::tbb_allocator< void ></a>
-<li><a class="el" href="a00180.html">tbb::tbb_exception</a>
+<li><a class="el" href="a00200.html">tbb::interface5::internal::task_base</a>
+<li><a class="el" href="a00201.html">tbb::task_group_context</a>
+<li><a class="el" href="a00202.html">tbb::task_list</a>
+<li><a class="el" href="a00203.html">tbb::task_scheduler_init</a>
+<li><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a>
+<li><a class="el" href="a00205.html">tbb::tbb_allocator< void ></a>
+<li><a class="el" href="a00206.html">tbb::tbb_exception</a>
<ul>
-<li><a class="el" href="a00132.html">tbb::captured_exception</a>
-<li><a class="el" href="a00149.html">tbb::movable_exception< ExceptionData ></a>
+<li><a class="el" href="a00153.html">tbb::captured_exception</a>
+<li><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a>
</ul>
-<li><a class="el" href="a00181.html">tbb::internal::tbb_exception_ptr</a>
-<li><a class="el" href="a00183.html">tbb::tick_count</a>
-<li><a class="el" href="a00184.html">tbb::tick_count::interval_t</a>
-<li><a class="el" href="a00185.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
-<li><a class="el" href="a00186.html">tbb::zero_allocator< T, Allocator ></a>
-<li><a class="el" href="a00187.html">tbb::zero_allocator< void, Allocator ></a>
+<li><a class="el" href="a00207.html">tbb::internal::tbb_exception_ptr</a>
+<li><a class="el" href="a00208.html">tbb::tbb_hash_compare< Key ></a>
+<li><a class="el" href="a00210.html">tbb::tick_count</a>
+<li><a class="el" href="a00211.html">tbb::tick_count::interval_t</a>
+<li><a class="el" href="a00212.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
+<li><a class="el" href="a00213.html">tbb::zero_allocator< T, Allocator ></a>
+<li><a class="el" href="a00214.html">tbb::zero_allocator< void, Allocator ></a>
</ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/index.html b/doc/html/index.html
index 7625a32..b41f471 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -23,7 +23,7 @@ Additional pieces of information can be found here<ul>
<li><a class="el" href="concepts.html">TBB concepts</a></li></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/modules.html b/doc/html/modules.html
index f36e3ae..8f3371d 100644
--- a/doc/html/modules.html
+++ b/doc/html/modules.html
@@ -15,16 +15,16 @@
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1>Modules</h1>Here is a list of all modules:<ul>
-<li><a class="el" href="a00241.html">Algorithms</a>
-<li><a class="el" href="a00242.html">Containers</a>
-<li><a class="el" href="a00243.html">Memory Allocation</a>
-<li><a class="el" href="a00244.html">Synchronization</a>
-<li><a class="el" href="a00245.html">Timing</a>
-<li><a class="el" href="a00246.html">Task Scheduling</a>
+<li><a class="el" href="a00274.html">Algorithms</a>
+<li><a class="el" href="a00275.html">Containers</a>
+<li><a class="el" href="a00276.html">Memory Allocation</a>
+<li><a class="el" href="a00277.html">Synchronization</a>
+<li><a class="el" href="a00278.html">Timing</a>
+<li><a class="el" href="a00279.html">Task Scheduling</a>
</ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
index 9856182..7886652 100644
--- a/doc/html/namespacemembers.html
+++ b/doc/html/namespacemembers.html
@@ -23,7 +23,6 @@
<ul>
<li id="current"><a href="namespacemembers.html"><span>All</span></a></li>
<li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
- <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
<li><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
<li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
<li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
@@ -33,28 +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="a00237.html#ad165cf61abbe349d413df2589679add">tbb</a><li>__TBB_full_fence
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>assertion_failure()
-: <a class="el" href="a00237.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>assertion_handler_type
-: <a class="el" href="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>ets_key_usage_type
-: <a class="el" href="a00237.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>hash_multiplier
-: <a class="el" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">tbb</a><li>memory_semantics
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_do()
-: <a class="el" href="a00241.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00240.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00241.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00241.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00241.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00241.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00241.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00241.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>release
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
-: <a class="el" href="a00237.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>tbb_hasher()
-: <a class="el" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00237.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00267.html#ad165cf61abbe349d413df2589679add">tbb</a><li>__TBB_full_fence
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>assertion_failure()
+: <a class="el" href="a00267.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>assertion_handler_type
+: <a class="el" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>ets_key_usage_type
+: <a class="el" href="a00267.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_do()
+: <a class="el" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00273.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>release
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00267.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_enum.html b/doc/html/namespacemembers_enum.html
index d071910..9b6ead3 100644
--- a/doc/html/namespacemembers_enum.html
+++ b/doc/html/namespacemembers_enum.html
@@ -23,7 +23,6 @@
<ul>
<li><a href="namespacemembers.html"><span>All</span></a></li>
<li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
- <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
<li><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
<li id="current"><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
<li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
@@ -33,11 +32,11 @@
<p>
<ul>
<li>ets_key_usage_type
-: <a class="el" href="a00237.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
+: <a class="el" href="a00267.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_eval.html b/doc/html/namespacemembers_eval.html
index 6e3d80f..48292ad 100644
--- a/doc/html/namespacemembers_eval.html
+++ b/doc/html/namespacemembers_eval.html
@@ -23,7 +23,6 @@
<ul>
<li><a href="namespacemembers.html"><span>All</span></a></li>
<li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
- <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
<li><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
<li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
<li id="current"><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
@@ -33,12 +32,12 @@
<p>
<ul>
<li>__TBB_full_fence
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>release
-: <a class="el" href="a00237.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>release
+: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
index ead1550..1408889 100644
--- a/doc/html/namespacemembers_func.html
+++ b/doc/html/namespacemembers_func.html
@@ -23,7 +23,6 @@
<ul>
<li><a href="namespacemembers.html"><span>All</span></a></li>
<li id="current"><a href="namespacemembers_func.html"><span>Functions</span></a></li>
- <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
<li><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
<li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
<li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
@@ -33,21 +32,20 @@
<p>
<ul>
<li>__TBB_DECL_ATOMIC_ALT()
-: <a class="el" href="a00237.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
-: <a class="el" href="a00237.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>parallel_do()
-: <a class="el" href="a00241.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00240.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00241.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00241.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00241.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00241.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00241.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00241.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
-: <a class="el" href="a00237.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>tbb_hasher()
-: <a class="el" href="a00237.html#4b4d8d820cb2ec18147261226f2dd999">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00237.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00267.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
+: <a class="el" href="a00267.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>parallel_do()
+: <a class="el" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00273.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00267.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_type.html b/doc/html/namespacemembers_type.html
index 0f474e7..8cee2cb 100644
--- a/doc/html/namespacemembers_type.html
+++ b/doc/html/namespacemembers_type.html
@@ -23,7 +23,6 @@
<ul>
<li><a href="namespacemembers.html"><span>All</span></a></li>
<li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
- <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
<li id="current"><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
<li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
<li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
@@ -33,10 +32,10 @@
<p>
<ul>
<li>assertion_handler_type
-: <a class="el" href="a00237.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a></ul>
+: <a class="el" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a></ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/namespacemembers_vars.html b/doc/html/namespacemembers_vars.html
deleted file mode 100644
index 11202f2..0000000
--- a/doc/html/namespacemembers_vars.html
+++ /dev/null
@@ -1,45 +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>Class Members</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 id="current"><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="namespacemembers.html"><span>All</span></a></li>
- <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
- <li id="current"><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
- <li><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
- <li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
- <li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
- </ul>
-</div>
-
-<p>
-<ul>
-<li>hash_multiplier
-: <a class="el" href="a00237.html#6902d551186a654ffbf88582d4a0bdfa">tbb</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2009 Intel Corporation. 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/namespaces.html b/doc/html/namespaces.html
index 501ffb9..0fa11d7 100644
--- a/doc/html/namespaces.html
+++ b/doc/html/namespaces.html
@@ -20,12 +20,12 @@
<li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
</ul></div>
<h1>Namespace List</h1>Here is a list of all documented namespaces with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="a00237.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="a00240.html">tbb::strict_ppl</a></td><td class="indexvalue">For internal use only </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00267.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="a00273.html">tbb::strict_ppl</a></td><td class="indexvalue">For internal use only </td></tr>
</table>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/pages.html b/doc/html/pages.html
index c865eb3..e2061d1 100644
--- a/doc/html/pages.html
+++ b/doc/html/pages.html
@@ -22,7 +22,7 @@
</ul>
<hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_do_body_req.html b/doc/html/parallel_do_body_req.html
index c35d5c6..a434c11 100644
--- a/doc/html/parallel_do_body_req.html
+++ b/doc/html/parallel_do_body_req.html
@@ -29,7 +29,7 @@
</pre></div> Copy a work item. -<div class="fragment"><pre class="fragment"> ~item_type()
</pre></div> Destroy a work item <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_for_body_req.html b/doc/html/parallel_for_body_req.html
index aa57658..8a7fa48 100644
--- a/doc/html/parallel_for_body_req.html
+++ b/doc/html/parallel_for_body_req.html
@@ -21,7 +21,7 @@
</pre></div> Destructor -<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> Body::operator()( Range& r ) <span class="keyword">const</span>;
</pre></div> Function call operator applying the body to range <code>r</code>. <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_reduce_body_req.html b/doc/html/parallel_reduce_body_req.html
index 32e67c4..e152812 100644
--- a/doc/html/parallel_reduce_body_req.html
+++ b/doc/html/parallel_reduce_body_req.html
@@ -22,7 +22,7 @@
</pre></div> Function call operator applying body to range <code>r</code> and accumulating the result -<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> Body::join( Body& b );
</pre></div> Join results. The result in <code>b</code> should be merged into the result of <code>this</code> <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_reduce_lambda_req.html b/doc/html/parallel_reduce_lambda_req.html
index d607d03..9892b0c 100644
--- a/doc/html/parallel_reduce_lambda_req.html
+++ b/doc/html/parallel_reduce_lambda_req.html
@@ -16,7 +16,7 @@
</ul></div>
<h1><a class="anchor" name="parallel_reduce_lambda_req">Requirements on parallel_reduce anonymous function objects (lambda functions)</a></h1>TO BE DOCUMENTED <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_scan_body_req.html b/doc/html/parallel_scan_body_req.html
index 9806d53..861bb6e 100644
--- a/doc/html/parallel_scan_body_req.html
+++ b/doc/html/parallel_scan_body_req.html
@@ -23,7 +23,7 @@
</pre></div> Do final processing for iterations of range <code>r</code> -<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> Body::reverse_join( Body& a );
</pre></div> Merge preprocessing state of <code>a</code> into <code>this</code>, where <code>a</code> was created earlier from <code>b</code> by b's splitting constructor <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/parallel_sort_iter_req.html b/doc/html/parallel_sort_iter_req.html
index 15b4c39..df61866 100644
--- a/doc/html/parallel_sort_iter_req.html
+++ b/doc/html/parallel_sort_iter_req.html
@@ -20,7 +20,7 @@
</pre></div> Swaps <code>x</code> and <code>y</code> -<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> Compare::operator()( <span class="keyword">const</span> T& x, <span class="keyword">const</span> T& y )
</pre></div> True if x comes before y; <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/doc/html/range_req.html b/doc/html/range_req.html
index 5509280..a8f667d 100644
--- a/doc/html/range_req.html
+++ b/doc/html/range_req.html
@@ -23,7 +23,7 @@
</pre></div> True if range is empty -<div class="fragment"><pre class="fragment"> R::R( R& r, split );
</pre></div> Split range <code>r</code> into two subranges. <hr>
<p></p>
-Copyright © 2005-2009 Intel Corporation. All Rights Reserved.
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
diff --git a/examples/GettingStarted/sub_string_finder/Makefile b/examples/GettingStarted/sub_string_finder/Makefile
index a1e3db3..c234e3d 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile
+++ b/examples/GettingStarted/sub_string_finder/Makefile
@@ -29,7 +29,9 @@ PROG=sub_string_finder_extended
ARGS=
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/GettingStarted/sub_string_finder/Makefile.windows b/examples/GettingStarted/sub_string_finder/Makefile.windows
index 018bd77..9b81760 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile.windows
+++ b/examples/GettingStarted/sub_string_finder/Makefile.windows
@@ -29,16 +29,20 @@ PROG=sub_string_finder_extended
ARGS=
# The C++ compiler options
-CXX = cl.exe
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) sub_string_finder.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder.exe
$(CXX) sub_string_finder_extended.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_extended.exe
$(CXX) sub_string_finder_pretty.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_pretty.exe
-debug:
+debug: compiler_check
$(CXX) sub_string_finder.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder.exe
$(CXX) sub_string_finder_extended.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_extended.exe
$(CXX) sub_string_finder_pretty.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_pretty.exe
@@ -46,3 +50,6 @@ clean:
@cmd.exe /C del sub_string_finder*.exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/GettingStarted/sub_string_finder/index.html b/examples/GettingStarted/sub_string_finder/index.html
index 87f1eaf..4c208e9 100644
--- a/examples/GettingStarted/sub_string_finder/index.html
+++ b/examples/GettingStarted/sub_string_finder/index.html
@@ -24,12 +24,8 @@ string (position 3).
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.icproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.icproj
new file mode 100644
index 0000000..fb1bb75
--- /dev/null
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="sub_string_finder"
+ ProjectGUID="{3929DD8E-420D-4360-BCBA-3C14C674EFC7}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2525}"
+ VCNestedProjectFileName="sub_string_finder.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
similarity index 81%
rename from examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.vcproj
rename to examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
index 325ad09..8e20b66 100644
--- a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
@@ -1,352 +1,352 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="sub_string_finder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2525}"
- RootNamespace="sub_string_finder"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sub_string_finder.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="sub_string_finder"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2525}"
+ RootNamespace="sub_string_finder"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\sub_string_finder.cpp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.sln b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_cl.sln
similarity index 98%
rename from examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.sln
rename to examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_cl.sln
index fc96ac1..0054e4f 100644
--- a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.sln
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_cl.sln
@@ -1,50 +1,50 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder", "sub_string_finder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2525}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_extended", "sub_string_finder_extended.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2526}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_pretty", "sub_string_finder_pretty.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2524}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A26B588D-97F7-4466-9672-8A7E3173FBA1}"
- ProjectSection(SolutionItems) = preProject
- ..\index.html = ..\index.html
- EndProjectSection
-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-068F511A2525}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder", "sub_string_finder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2525}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_extended", "sub_string_finder_extended.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2526}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_pretty", "sub_string_finder_pretty.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2524}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A26B588D-97F7-4466-9672-8A7E3173FBA1}"
+ ProjectSection(SolutionItems) = preProject
+ ..\index.html = ..\index.html
+ EndProjectSection
+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-068F511A2525}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.icproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.icproj
new file mode 100644
index 0000000..576e473
--- /dev/null
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="sub_string_finder_extended"
+ ProjectGUID="{BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2526}"
+ VCNestedProjectFileName="sub_string_finder_extended.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder_extended.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
similarity index 81%
rename from examples/GettingStarted/sub_string_finder/vc8/sub_string_finder_extended.vcproj
rename to examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
index 91702f4..8eb1b8d 100644
--- a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder_extended.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
@@ -1,352 +1,352 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="sub_string_finder_extended"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2526}"
- RootNamespace="sub_string_finder_extended"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sub_string_finder_extended.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="sub_string_finder_extended"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2526}"
+ RootNamespace="sub_string_finder_extended"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\sub_string_finder_extended.cpp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.sln b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_icl.sln
similarity index 50%
rename from examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.sln
rename to examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_icl.sln
index f8aec9b..5dcab35 100644
--- a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.sln
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_icl.sln
@@ -1,50 +1,74 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A26B588D-97F7-4466-9672-8A7E3173FBA1}"
- ProjectSection(SolutionItems) = preProject
- ..\index.html = ..\index.html
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder", "sub_string_finder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2525}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_extended", "sub_string_finder_extended.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2526}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_pretty", "sub_string_finder_pretty.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2524}"
-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-068F511A2525}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "sub_string_finder", "sub_string_finder.icproj", "{3929DD8E-420D-4360-BCBA-3C14C674EFC7}"
+EndProject
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "sub_string_finder_extended", "sub_string_finder_extended.icproj", "{BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}"
+EndProject
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "sub_string_finder_pretty", "sub_string_finder_pretty.icproj", "{8ADCDB85-B3E0-4376-9378-0C349F9E6140}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A26B588D-97F7-4466-9672-8A7E3173FBA1}"
+ ProjectSection(SolutionItems) = preProject
+ ..\index.html = ..\index.html
+ EndProjectSection
+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
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Debug|Win32.Build.0 = Debug|Win32
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Debug|x64.ActiveCfg = Debug|x64
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Debug|x64.Build.0 = Debug|x64
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Release|Win32.ActiveCfg = Release|Win32
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Release|Win32.Build.0 = Release|Win32
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Release|x64.ActiveCfg = Release|x64
+ {3929DD8E-420D-4360-BCBA-3C14C674EFC7}.Release|x64.Build.0 = Release|x64
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Debug|Win32.Build.0 = Debug|Win32
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Debug|x64.ActiveCfg = Debug|x64
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Debug|x64.Build.0 = Debug|x64
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Release|Win32.ActiveCfg = Release|Win32
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Release|Win32.Build.0 = Release|Win32
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Release|x64.ActiveCfg = Release|x64
+ {BFF3077B-EB9A-4AF5-998B-7C1BA757C06F}.Release|x64.Build.0 = Release|x64
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Debug|Win32.Build.0 = Debug|Win32
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Debug|x64.ActiveCfg = Debug|x64
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Debug|x64.Build.0 = Debug|x64
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Release|Win32.ActiveCfg = Release|Win32
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Release|Win32.Build.0 = Release|Win32
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Release|x64.ActiveCfg = Release|x64
+ {8ADCDB85-B3E0-4376-9378-0C349F9E6140}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.icproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.icproj
new file mode 100644
index 0000000..a303820
--- /dev/null
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="sub_string_finder_pretty"
+ ProjectGUID="{8ADCDB85-B3E0-4376-9378-0C349F9E6140}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2524}"
+ VCNestedProjectFileName="sub_string_finder_pretty.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder_pretty.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
similarity index 81%
rename from examples/GettingStarted/sub_string_finder/vc8/sub_string_finder_pretty.vcproj
rename to examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
index 8588144..cff384d 100644
--- a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder_pretty.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
@@ -1,352 +1,352 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="sub_string_finder_pretty"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2524}"
- RootNamespace="sub_string_finder_pretty"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sub_string_finder_pretty.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="sub_string_finder_pretty"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2524}"
+ RootNamespace="sub_string_finder_pretty"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\sub_string_finder_pretty.cpp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp b/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp
index 43844f3..e7298ca 100644
--- a/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp
+++ b/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp
@@ -29,59 +29,56 @@
#include <iostream>
#include <string>
#include <algorithm>
-
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
using namespace tbb;
using namespace std;
-
static const size_t N = 23;
class SubStringFinder {
- const string str;
- size_t *max_array;
- size_t *pos_array;
- public:
- void operator() ( const blocked_range<size_t>& r ) const {
- for ( size_t i = r.begin(); i != r.end(); ++i ) {
- size_t max_size = 0, max_pos = 0;
- for (size_t j = 0; j < str.size(); ++j)
- if (j != i) {
- size_t limit = str.size()-( i > j ? i : j );
- for (size_t k = 0; k < limit; ++k) {
- if (str[i + k] != str[j + k]) break;
- if (k > max_size) {
- max_size = k;
- max_pos = j;
+ const string str;
+ size_t *max_array;
+ size_t *pos_array;
+public:
+ void operator() ( const blocked_range<size_t>& r ) const {
+ for ( size_t i = r.begin(); i != r.end(); ++i ) {
+ size_t max_size = 0, max_pos = 0;
+ for (size_t j = 0; j < str.size(); ++j)
+ if (j != i) {
+ size_t limit = str.size()-max(i,j);
+ for (size_t k = 0; k < limit; ++k) {
+ if (str[i + k] != str[j + k]) break;
+ if (k > max_size) {
+ max_size = k;
+ max_pos = j;
+ }
+ }
}
- }
+ max_array[i] = max_size;
+ pos_array[i] = max_pos;
}
- max_array[i] = max_size;
- pos_array[i] = max_pos;
}
- }
- SubStringFinder(string &s, size_t *m, size_t *p) :
- str(s), max_array(m), pos_array(p) { }
+ SubStringFinder(string &s, size_t *m, size_t *p) :
+ str(s), max_array(m), pos_array(p) { }
};
-int main(int argc, char *argv[]) {
-
+int main() {
- string str[N] = { string("a"), string("b") };
- for (size_t i = 2; i < N; ++i) str[i] = str[i-1]+str[i-2];
- string &to_scan = str[N-1];
+ string str[N] = { string("a"), string("b") };
+ for (size_t i = 2; i < N; ++i) str[i] = str[i-1]+str[i-2];
+ string &to_scan = str[N-1];
- size_t *max = new size_t[to_scan.size()];
- size_t *pos = new size_t[to_scan.size()];
+ size_t *max = new size_t[to_scan.size()];
+ size_t *pos = new size_t[to_scan.size()];
- parallel_for(blocked_range<size_t>(0, to_scan.size(), 100),
- SubStringFinder( to_scan, max, pos ) );
+ parallel_for(blocked_range<size_t>(0, to_scan.size() ),
+ SubStringFinder( to_scan, max, pos ) );
- for (size_t i = 0; i < to_scan.size(); ++i)
- cout << " " << (int)max[i] << "(" << (int)pos[i] << ")" << endl;
- delete[] max;
- delete[] pos;
- return 0;
+ for (size_t i = 0; i < to_scan.size(); ++i)
+ cout << " " << max[i] << "(" << pos[i] << ")" << endl;
+ delete[] pos;
+ delete[] max;
+ return 0;
}
diff --git a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.sln b/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.sln
deleted file mode 100644
index 8d55e19..0000000
--- a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.sln
+++ /dev/null
@@ -1,40 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder", "sub_string_finder.vcproj", "{C64078BC-8A63-4C3D-B48D-ECC2B60E75E6}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_pretty", "sub_string_finder_pretty.vcproj", "{8DCA120F-7D8C-4D43-A939-9403F03D3F45}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_extended", "sub_string_finder_extended.vcproj", "{2607C858-EE23-429D-BCCC-D89D2A5EDFFE}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {C64078BC-8A63-4C3D-B48D-ECC2B60E75E6}.Debug.ActiveCfg = Debug|Win32
- {C64078BC-8A63-4C3D-B48D-ECC2B60E75E6}.Debug.Build.0 = Debug|Win32
- {C64078BC-8A63-4C3D-B48D-ECC2B60E75E6}.Release.ActiveCfg = Release|Win32
- {C64078BC-8A63-4C3D-B48D-ECC2B60E75E6}.Release.Build.0 = Release|Win32
- {8DCA120F-7D8C-4D43-A939-9403F03D3F45}.Debug.ActiveCfg = Debug|Win32
- {8DCA120F-7D8C-4D43-A939-9403F03D3F45}.Debug.Build.0 = Debug|Win32
- {8DCA120F-7D8C-4D43-A939-9403F03D3F45}.Release.ActiveCfg = Release|Win32
- {8DCA120F-7D8C-4D43-A939-9403F03D3F45}.Release.Build.0 = Release|Win32
- {2607C858-EE23-429D-BCCC-D89D2A5EDFFE}.Debug.ActiveCfg = Debug|Win32
- {2607C858-EE23-429D-BCCC-D89D2A5EDFFE}.Debug.Build.0 = Debug|Win32
- {2607C858-EE23-429D-BCCC-D89D2A5EDFFE}.Release.ActiveCfg = Release|Win32
- {2607C858-EE23-429D-BCCC-D89D2A5EDFFE}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionItems) = postSolution
- ..\index.html = ..\index.html
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.suo b/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.suo
deleted file mode 100644
index 47fb326..0000000
Binary files a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.suo and /dev/null differ
diff --git a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.vcproj b/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.vcproj
deleted file mode 100644
index f63add3..0000000
--- a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder.vcproj
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="sub_string_finder"
- ProjectGUID="{C64078BC-8A63-4C3D-B48D-ECC2B60E75E6}"
- RootNamespace="sub_string_finder"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\sub_string_finder.cpp">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder_extended.vcproj b/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder_extended.vcproj
deleted file mode 100644
index 176e625..0000000
--- a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder_extended.vcproj
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="sub_string_finder_extended"
- ProjectGUID="{2607C858-EE23-429D-BCCC-D89D2A5EDFFE}"
- RootNamespace="sub_string_finder_extended"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\sub_string_finder_extended.cpp">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder_pretty.vcproj b/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder_pretty.vcproj
deleted file mode 100644
index 80e8d09..0000000
--- a/examples/GettingStarted/sub_string_finder/vc7.1/sub_string_finder_pretty.vcproj
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="sub_string_finder_pretty"
- ProjectGUID="{8DCA120F-7D8C-4D43-A939-9403F03D3F45}"
- RootNamespace="sub_string_finder_pretty"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\sub_string_finder_pretty.cpp">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.suo b/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.suo
deleted file mode 100644
index 9ad071b..0000000
Binary files a/examples/GettingStarted/sub_string_finder/vc8/sub_string_finder.suo and /dev/null differ
diff --git a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.suo b/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.suo
deleted file mode 100644
index dd4f01e..0000000
Binary files a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.suo and /dev/null differ
diff --git a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.vcproj b/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.vcproj
deleted file mode 100644
index bf46161..0000000
--- a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="sub_string_finder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2525}"
- RootNamespace="sub_string_finder"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sub_string_finder.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder_extended.vcproj b/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder_extended.vcproj
deleted file mode 100644
index 30fea84..0000000
--- a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder_extended.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="sub_string_finder_extended"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2526}"
- RootNamespace="sub_string_finder_extended"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sub_string_finder_extended.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder_pretty.vcproj b/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder_pretty.vcproj
deleted file mode 100644
index e6d9177..0000000
--- a/examples/GettingStarted/sub_string_finder/vc9/sub_string_finder_pretty.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="sub_string_finder_pretty"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2524}"
- RootNamespace="sub_string_finder_pretty"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sub_string_finder_pretty.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/Makefile b/examples/Makefile
index 785d18c..48d146f 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -41,16 +41,18 @@ include ../build/common.inc
ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),)
# also changes related variables like work_dir
override tbb_root := $(CWD)$(SLASH)..
- export TBB22_INSTALL_DIR := $(tbb_root)
+ export TBB30_INSTALL_DIR := $(tbb_root)
endif
ifeq ($(tbb_os),windows)
- ifeq ($(compiler),gcc)
+ ifeq ($(UNIXMODE),1)
EXAMPLE_MAKEFILE = Makefile
EXAMPLES = $(wildcard */*/$(EXAMPLE_MAKEFILE))
+ ifeq ($(compiler),gcc)
+ override CXXFLAGS += -Wl,--enable-auto-import
+ endif
export CPATH := $(CPATH);$(tbb_root)/include
export LIBRARY_PATH := $(LIBRARY_PATH);$(work_dir)_release;$(work_dir)_debug
- export CXXFLAGS += -Wl,--enable-auto-import
export RM = cmd /C del /Q /F
else
EXAMPLE_MAKEFILE = Makefile.windows
@@ -62,6 +64,7 @@ ifeq ($(tbb_os),windows)
work_dir := $(subst /,$(SLASH),$(work_dir))
export PATH := $(work_dir)_release;$(work_dir)_debug;$(PATH)
export TBB_ARCH_PLATFORM = $(arch)\$(runtime)
+ export TBB_TARGET_ARCH = $(arch)
else
EXAMPLE_MAKEFILE = Makefile
EXAMPLES := $(wildcard */*/$(EXAMPLE_MAKEFILE))
@@ -87,7 +90,7 @@ else
endif
endif
ifeq ($(compiler),suncc)
- override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause
+ 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 ($(arch),intel64)
override CXXFLAGS += -m64
endif
diff --git a/examples/common/copy_libraries.bat b/examples/common/copy_libraries.bat
new file mode 100644
index 0000000..2fd9e75
--- /dev/null
+++ b/examples/common/copy_libraries.bat
@@ -0,0 +1,66 @@
+ at echo off
+REM
+REM Copyright 2005-2010 Intel Corporation. All Rights Reserved.
+REM
+REM This file is part of Threading Building Blocks.
+REM
+REM Threading Building Blocks is free software; you can redistribute it
+REM and/or modify it under the terms of the GNU General Public License
+REM version 2 as published by the Free Software Foundation.
+REM
+REM Threading Building Blocks is distributed in the hope that it will be
+REM useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+REM of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+REM GNU General Public License for more details.
+REM
+REM You should have received a copy of the GNU General Public License
+REM along with Threading Building Blocks; if not, write to the Free Software
+REM Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+REM
+REM As a special exception, you may use this file as part of a free software
+REM library without restriction. Specifically, if other files instantiate
+REM templates or use macros or inline functions from this file, or you compile
+REM this file and link it with other files to produce an executable, this
+REM file does not by itself cause the resulting executable to be covered by
+REM the GNU General Public License. This exception does not however
+REM invalidate any other reasons why the executable file might be covered by
+REM the GNU General Public License.
+REM
+
+:: Getting parameters
+if ("%1") == ("") goto error
+if ("%2") == ("") goto error
+if ("%3") == ("") goto error
+set arch=%1
+if ("%2") == ("debug") set postfix=_debug
+set output_dir=%3
+
+:: Getting vs folders in case vc_mt binaries are not provided
+if ("%VS80COMNTOOLS%") NEQ ("") set vc_dir=vc8
+if ("%VS90COMNTOOLS%") NEQ ("") set vc_dir=vc9
+
+:: 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 ("%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 ("%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%"
+
+goto end
+:error
+echo Error occured in libraries copying during post-build step.
+exit /B 1
+
+:end
+exit /B 0
+
diff --git a/examples/common/gui/Makefile.win b/examples/common/gui/Makefile.win
index 7ca42c0..8ff6641 100644
--- a/examples/common/gui/Makefile.win
+++ b/examples/common/gui/Makefile.win
@@ -27,9 +27,9 @@
# Per-build Makefile rules (for recursive $(MAKE) calls from Makefile)
# Base compile/link options
-MYCXXFLAGS = /nologo $(TBB_SECURITY_SWITCH) /EHsc /Zc:forScope /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
+MYCXXFLAGS = /nologo $(TBB_SECURITY_SWITCH) /EHsc /Zc:forScope /D WIN32 /D _MBCS /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
MYLFLAGS = /link /incremental:no /fixed:no $(LFLAGS)
-CXXFLAGS_NDEBUG = /MD /O2 /Oy /Ot /Gy /D NDEBUG
+CXXFLAGS_NDEBUG = /MD /O2 /Ot /Gy /D NDEBUG
CXXFLAGS_DEBUG = /MDd /Od /Zi /D _DEBUG
# Specify library directory for Direct X SDK
@@ -49,31 +49,34 @@ build_echo:
build_one: build_echo build_$(UI)$(DEBUG)
-build_con: $(SOURCE) $(UISRC)
+build_con: $(SOURCE) $(UISRC) compiler_check
$(CXX) $(CXXFLAGS_NDEBUG) $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) /subsystem:console /OUT:$(EXE)
@cmd.exe /C del *.obj
-build_con_debug: $(SOURCE) $(UISRC)
+build_con_debug: $(SOURCE) $(UISRC) compiler_check
$(CXX) $(CXXFLAGS_DEBUG) $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) /debug /subsystem:console /OUT:$(EXE)
@cmd.exe /C del *.obj
-build_gdi: $(SOURCE) $(UISRC) vc7.1/$(RCNAME).res
- $(CXX) $(CXXFLAGS_NDEBUG) /D _WINDOWS $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) vc7.1/$(RCNAME).res /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
+build_gdi: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check
+ $(CXX) $(CXXFLAGS_NDEBUG) /D _WINDOWS $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) msvs/$(RCNAME).res /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
@cmd.exe /C del *.obj
-build_gdi_debug: $(SOURCE) $(UISRC) vc7.1/$(RCNAME).res
- $(CXX) $(CXXFLAGS_DEBUG) /D _WINDOWS $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) vc7.1/$(RCNAME).res /debug /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
+build_gdi_debug: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check
+ $(CXX) $(CXXFLAGS_DEBUG) /D _WINDOWS $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) msvs/$(RCNAME).res /debug /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
@cmd.exe /C del *.obj
-build_dd: $(SOURCE) $(UISRC) vc7.1/$(RCNAME).res
+build_dd: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check
- at echo Using DirectX SDK from "$(DDLIB_DIR)"
- $(CXX) $(CXXFLAGS_NDEBUG) /D _WINDOWS $(MYCXXFLAGS) /I "$(DXSDK_DIR)\include" $(SOURCE) $(UISRC) $(MYLFLAGS) /LIBPATH:"$(DDLIB_DIR)" vc7.1/$(RCNAME).res /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
+ $(CXX) $(CXXFLAGS_NDEBUG) /D _WINDOWS $(MYCXXFLAGS) /I "$(DXSDK_DIR)\include" $(SOURCE) $(UISRC) $(MYLFLAGS) /LIBPATH:"$(DDLIB_DIR)" msvs/$(RCNAME).res /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
@cmd.exe /C del *.obj
-build_dd_debug: $(SOURCE) $(UISRC) vc7.1/$(RCNAME).res
+build_dd_debug: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check
- at echo Using DirectX SDK from "$(DDLIB_DIR)"
- $(CXX) $(CXXFLAGS_DEBUG) /D _WINDOWS $(MYCXXFLAGS) /I "$(DXSDK_DIR)\include" $(SOURCE) $(UISRC) $(MYLFLAGS) /LIBPATH:"$(DDLIB_DIR)" vc7.1/$(RCNAME).res /debug /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
+ $(CXX) $(CXXFLAGS_DEBUG) /D _WINDOWS $(MYCXXFLAGS) /I "$(DXSDK_DIR)\include" $(SOURCE) $(UISRC) $(MYLFLAGS) /LIBPATH:"$(DDLIB_DIR)" msvs/$(RCNAME).res /debug /subsystem:windows /machine:$(XARCH) /OUT:$(EXE)
@cmd.exe /C del *.obj
-vc7.1/$(RCNAME).res:
- rc /r vc7.1/$(RCNAME)
+msvs/$(RCNAME).res:
+ rc /r msvs/$(RCNAME)
+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/concurrent_hash_map/count_strings/Makefile b/examples/concurrent_hash_map/count_strings/Makefile
index 42c0163..ae94214 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile
+++ b/examples/concurrent_hash_map/count_strings/Makefile
@@ -29,7 +29,9 @@ PROG=count_strings
ARGS=
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/concurrent_hash_map/count_strings/Makefile.windows b/examples/concurrent_hash_map/count_strings/Makefile.windows
index 65519ec..2f6e6c0 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile.windows
+++ b/examples/concurrent_hash_map/count_strings/Makefile.windows
@@ -31,16 +31,24 @@ PROG=Count_Strings
ARGS=
# The C++ compiler options
-CXX = cl.exe
+
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug: compiler_check
$(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/concurrent_hash_map/count_strings/index.html b/examples/concurrent_hash_map/count_strings/index.html
index 7c014d4..e8230a4 100644
--- a/examples/concurrent_hash_map/count_strings/index.html
+++ b/examples/concurrent_hash_map/count_strings/index.html
@@ -14,12 +14,8 @@ Example program that demonstrates template class concurrent_hash_map.
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/concurrent_hash_map/count_strings/msvs/count_strings.icproj b/examples/concurrent_hash_map/count_strings/msvs/count_strings.icproj
new file mode 100644
index 0000000..c873cd5
--- /dev/null
+++ b/examples/concurrent_hash_map/count_strings/msvs/count_strings.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="count_strings"
+ ProjectGUID="{ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252C}"
+ VCNestedProjectFileName="count_strings.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/concurrent_hash_map/count_strings/vc8/count_strings.vcproj b/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
similarity index 81%
rename from examples/concurrent_hash_map/count_strings/vc8/count_strings.vcproj
rename to examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
index 52f8719..bef6268 100644
--- a/examples/concurrent_hash_map/count_strings/vc8/count_strings.vcproj
+++ b/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
@@ -1,356 +1,356 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="count_strings"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252C}"
- RootNamespace="count_strings"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\count_strings.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="count_strings"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252C}"
+ RootNamespace="count_strings"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\count_strings.cpp"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/concurrent_hash_map/count_strings/vc8/count_strings.sln b/examples/concurrent_hash_map/count_strings/msvs/count_strings_cl.sln
similarity index 97%
rename from examples/concurrent_hash_map/count_strings/vc8/count_strings.sln
rename to examples/concurrent_hash_map/count_strings/msvs/count_strings_cl.sln
index 73768d9..5a9c27e 100644
--- a/examples/concurrent_hash_map/count_strings/vc8/count_strings.sln
+++ b/examples/concurrent_hash_map/count_strings/msvs/count_strings_cl.sln
@@ -1,25 +1,26 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "count_strings", "count_strings.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252C}"
-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-068F511A252C}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "count_strings", "count_strings.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252C}"
+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-068F511A252C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/concurrent_hash_map/count_strings/vc9/count_strings.sln b/examples/concurrent_hash_map/count_strings/msvs/count_strings_icl.sln
similarity index 53%
rename from examples/concurrent_hash_map/count_strings/vc9/count_strings.sln
rename to examples/concurrent_hash_map/count_strings/msvs/count_strings_icl.sln
index 86e5827..ff1ba24 100644
--- a/examples/concurrent_hash_map/count_strings/vc9/count_strings.sln
+++ b/examples/concurrent_hash_map/count_strings/msvs/count_strings_icl.sln
@@ -1,25 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "count_strings", "count_strings.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252C}"
-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-068F511A252C}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "count_strings", "count_strings.icproj", "{ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}"
+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
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Debug|Win32.Build.0 = Debug|Win32
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Debug|x64.ActiveCfg = Debug|x64
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Debug|x64.Build.0 = Debug|x64
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Release|Win32.ActiveCfg = Release|Win32
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Release|Win32.Build.0 = Release|Win32
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Release|x64.ActiveCfg = Release|x64
+ {ACC0CC2E-3102-4ED2-AFA2-996AF7DEC9A8}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252C}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.sln b/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.sln
deleted file mode 100644
index 2424739..0000000
--- a/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "count_strings", "count_strings.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411C}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {C931C7A2-074E-4150-9E7A-39A03250411C}.Debug.ActiveCfg = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411C}.Debug.Build.0 = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411C}.Release.ActiveCfg = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411C}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.suo b/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.suo
deleted file mode 100644
index ac4c9d5..0000000
Binary files a/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.suo and /dev/null differ
diff --git a/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.vcproj b/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.vcproj
deleted file mode 100644
index 931c2ea..0000000
--- a/examples/concurrent_hash_map/count_strings/vc7.1/count_strings.vcproj
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="count_strings"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411C}"
- RootNamespace="count_strings"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\count_strings.cpp">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/concurrent_hash_map/count_strings/vc8/count_strings.suo b/examples/concurrent_hash_map/count_strings/vc8/count_strings.suo
deleted file mode 100644
index 83be2c2..0000000
Binary files a/examples/concurrent_hash_map/count_strings/vc8/count_strings.suo and /dev/null differ
diff --git a/examples/concurrent_hash_map/count_strings/vc9/count_strings.suo b/examples/concurrent_hash_map/count_strings/vc9/count_strings.suo
deleted file mode 100644
index 2aea0a3..0000000
Binary files a/examples/concurrent_hash_map/count_strings/vc9/count_strings.suo and /dev/null differ
diff --git a/examples/concurrent_hash_map/count_strings/vc9/count_strings.vcproj b/examples/concurrent_hash_map/count_strings/vc9/count_strings.vcproj
deleted file mode 100644
index 28e518b..0000000
--- a/examples/concurrent_hash_map/count_strings/vc9/count_strings.vcproj
+++ /dev/null
@@ -1,353 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="count_strings"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252C}"
- RootNamespace="count_strings"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\count_strings.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/index.html b/examples/index.html
index 6f143ef..1598624 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -16,8 +16,6 @@ This directory has example usages of Threading Building Blocks.
<DD>Examples using <CODE>parallel_for</CODE>.
<DT><A HREF="parallel_reduce/index.html">parallel_reduce</A>
<DD>Examples using <CODE>parallel_reduce</CODE>.
-<DT><A HREF="parallel_while/index.html">parallel_while</A>
-<DD>Examples using <CODE>parallel_while</CODE>.
<DT><A HREF="pipeline/index.html">pipeline</A>
<DD>Examples using <CODE>pipeline</CODE>.
<DT><A HREF="task/index.html">task</A>
@@ -47,10 +45,12 @@ sh, bash, csh, ksh, etc. (or compatible) shell window (Windows*, Linux* or Mac O
<A NAME=build_1><H4>To build by using a Microsoft* Visual Studio* project (Windows* systems):</H4></A>
Perform the following steps:
<OL>
-<LI>Identify the solution (*.sln) file for the example you wish to build and run.
+<LI>Identify the solution (*.sln) file for the example you wish to build and run.For Microsoft* Visual Studio* 2005, the *.sln file is in the example's msvs sub-directory. For other versions please use Microsoft*
+ Visual Studio* project converter
<UL>
- <LI>For Microsoft* Visual Studio* .NET 2003, the *.sln file is in the example's vc7.1 sub-directory.
- <LI>For Microsoft* Visual Studio* 2005, the *.sln file is in the example's vc8 sub-directory.
+ <li><example_name>_cl.sln - Solution for Microsoft* Visual C++* compiler
+ </li>
+ <li><example_name>_icl.sln - Solution for Intel® C++ Compiler </li>
</UL>
<LI>Open the project by using one of the following methods:
<UL>
@@ -122,19 +122,20 @@ during installation, or you wish to build for an alternate architecture or Micro
it may be set up, for a given type of shell window, by using one of the following commands:
<DL>
<DT>For cmd.exe (command prompt):
-<DD><TT><<I>installdir</I>>\{ia32,intel64}\{vc7.1,vc8}\bin\tbbvars.bat</TT>
+<DD><TT><<I>installdir</I>>\{ia32,intel64}\{vc8,vc9,vc_mt}\bin\tbbvars.bat</TT>
<DT>For sh, bash, ksh (or compatibles):
-<DD><TT>. <<I>installdir</I>>\{ia32,intel64}\{vc7.1,vc8}\bin\tbbvars.sh</TT>
+<DD><TT>. <<I>installdir</I>>\{ia32,intel64}\{vc8,vc9,vc_mt}\bin\tbbvars.sh</TT>
<DT>For csh (or compatibles):
-<DD><TT>source <<I>installdir</I>>\{ia32,intel64}\{vc7.1,vc8}\bin\tbbvars.csh</TT>
+<DD><TT>source <<I>installdir</I>>\{ia32,intel64}\{vc8,vc9,vc_mt}\bin\tbbvars.csh</TT>
<DT><I>Notes:</I>
<DD><I><SL>
<LI>Choose one of {ia32,intel64} depending on the architecture to be used.
- <LI>Choose one of {vc7.1,vc8} depending on whether Microsoft* Visual Studio* .NET 2003 or
- Microsoft* Visual Studio* 2005 is to be used.
<LI>Environment setup need only be performed once per shell window to be used.
<LI>Always source tbbvars.sh or tbbvars.csh rather than executing them directly.
- </SL></I>
+ </SL>
+ {<span style="font-family: Courier New">vc8,vc9,vc_mt</span>}
+ {<span style="font-family: Courier New">vc8,vc9,vc_mt</span>} depending on which
+ Microsoft* Visual Studio* </I>
</DL>
<A NAME=env_23><H4>To set up the environment (Linux* or Mac OS* X systems):</H4></A>
@@ -143,7 +144,7 @@ The environment may be set up, for a given type of shell window, by using one of
<DT>For sh, bash, ksh (or compatibles):
<DD>. <<I>installdir</I>>/bin/tbbvars.sh
<DT>For csh (or compatibles):
-<DD>source <<I>installdir</I>>/tbbvars.csh
+<DD>source <<I>installdir</I>>/bin/tbbvars.csh
<DT>For sh, bash, ksh (or compatibles), when using an alternate architecture or platform:
<DD>. <<I>installdir</I>>/{ia32,intel64,ia64}/cc<<I>gccversion</I>>_libc<<I>libcversion</I>>_kernel<<I>kernelversion</I>>/bin/tbbvars.sh
<DT>For csh (or compatibles), when using an alternate architecture or platform:
diff --git a/examples/parallel_do/parallel_preorder/Makefile b/examples/parallel_do/parallel_preorder/Makefile
index 48cb976..f6b3524 100644
--- a/examples/parallel_do/parallel_preorder/Makefile
+++ b/examples/parallel_do/parallel_preorder/Makefile
@@ -29,7 +29,9 @@ PROG=parallel_preorder
ARGS=1:4
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/parallel_do/parallel_preorder/Makefile.windows b/examples/parallel_do/parallel_preorder/Makefile.windows
index e7371bf..1bf9e6d 100644
--- a/examples/parallel_do/parallel_preorder/Makefile.windows
+++ b/examples/parallel_do/parallel_preorder/Makefile.windows
@@ -30,17 +30,24 @@
PROG=Parallel_Preorder
ARGS=1:4
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug: compiler_check
$(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/parallel_do/parallel_preorder/index.html b/examples/parallel_do/parallel_preorder/index.html
index 76b7c3f..a276978 100644
--- a/examples/parallel_do/parallel_preorder/index.html
+++ b/examples/parallel_do/parallel_preorder/index.html
@@ -53,12 +53,8 @@ if the cell values are changed to type "float". The reason is twofold.
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.icproj b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.icproj
new file mode 100644
index 0000000..f63923f
--- /dev/null
+++ b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="parallel_preorder"
+ ProjectGUID="{68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
+ VCNestedProjectFileName="parallel_preorder.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.vcproj b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
similarity index 81%
rename from examples/parallel_do/parallel_preorder/vc8/parallel_preorder.vcproj
rename to examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
index 1141985..d7bde29 100644
--- a/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.vcproj
+++ b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
@@ -1,374 +1,374 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="parallel_preorder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
- RootNamespace="parallel_preorder"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\Graph.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"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="parallel_preorder"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
+ RootNamespace="parallel_preorder"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\Graph.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"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.sln b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder_cl.sln
similarity index 97%
rename from examples/parallel_while/parallel_preorder/vc8/parallel_preorder.sln
rename to examples/parallel_do/parallel_preorder/msvs/parallel_preorder_cl.sln
index 6b466e9..665106e 100644
--- a/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.sln
+++ b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder_cl.sln
@@ -1,25 +1,25 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252B}"
-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-068F511A252B}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252B}"
+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-068F511A252B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.sln b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder_icl.sln
similarity index 57%
rename from examples/parallel_do/parallel_preorder/vc8/parallel_preorder.sln
rename to examples/parallel_do/parallel_preorder/msvs/parallel_preorder_icl.sln
index 6b466e9..b0ba4ac 100644
--- a/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.sln
+++ b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder_icl.sln
@@ -1,25 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252B}"
-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-068F511A252B}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "parallel_preorder", "parallel_preorder.icproj", "{68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}"
+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
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Debug|Win32.Build.0 = Debug|Win32
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Debug|x64.ActiveCfg = Debug|x64
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Debug|x64.Build.0 = Debug|x64
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Release|Win32.ActiveCfg = Release|Win32
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Release|Win32.Build.0 = Release|Win32
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Release|x64.ActiveCfg = Release|x64
+ {68C4AFEA-1847-4EEE-9CC5-D4FCB712D09F}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.sln b/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.sln
deleted file mode 100644
index 1cda54a..0000000
--- a/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{519446A2-AF27-429B-A5DF-625B8F034021}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {519446A2-AF27-429B-A5DF-625B8F034021}.Debug.ActiveCfg = Debug|Win32
- {519446A2-AF27-429B-A5DF-625B8F034021}.Debug.Build.0 = Debug|Win32
- {519446A2-AF27-429B-A5DF-625B8F034021}.Release.ActiveCfg = Release|Win32
- {519446A2-AF27-429B-A5DF-625B8F034021}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.suo b/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.suo
deleted file mode 100644
index b1af83e..0000000
Binary files a/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.suo and /dev/null differ
diff --git a/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.vcproj b/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.vcproj
deleted file mode 100644
index 5b7c292..0000000
--- a/examples/parallel_do/parallel_preorder/vc7.1/parallel_preorder.vcproj
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="parallel_preorder"
- ProjectGUID="{519446A2-AF27-429B-A5DF-625B8F034021}"
- RootNamespace="parallel_preorder"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\Graph.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">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.suo b/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.suo
deleted file mode 100644
index 958de8b..0000000
Binary files a/examples/parallel_do/parallel_preorder/vc8/parallel_preorder.suo and /dev/null differ
diff --git a/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.sln b/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.sln
deleted file mode 100644
index 178fea0..0000000
--- a/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252B}"
-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-068F511A252B}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.suo b/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.suo
deleted file mode 100644
index 4721c27..0000000
Binary files a/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.suo and /dev/null differ
diff --git a/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.vcproj b/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.vcproj
deleted file mode 100644
index d9e48f5..0000000
--- a/examples/parallel_do/parallel_preorder/vc9/parallel_preorder.vcproj
+++ /dev/null
@@ -1,371 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="parallel_preorder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
- RootNamespace="parallel_preorder"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\Graph.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"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/game_of_life.NET/Makefile b/examples/parallel_for/game_of_life.NET/Makefile
index 16f963b..0defaf5 100644
--- a/examples/parallel_for/game_of_life.NET/Makefile
+++ b/examples/parallel_for/game_of_life.NET/Makefile
@@ -27,6 +27,9 @@
# GNU Makefile that builds and runs example.
PROG=game_of_life
ARGS=2:4 -t 5
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/parallel_for/game_of_life.NET/Makefile.windows b/examples/parallel_for/game_of_life.NET/Makefile.windows
index 5ea1868..8ba2821 100644
--- a/examples/parallel_for/game_of_life.NET/Makefile.windows
+++ b/examples/parallel_for/game_of_life.NET/Makefile.windows
@@ -30,17 +30,20 @@
PROG=game_of_life
ARGS=2:4 -t 5
+# Trying to find if icl.exe is set
+CXX = cl.exe
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release:
$(CXX) ./src/Evolution.cpp ./src/Game_of_life.cpp ./src/Update_state.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug:
$(CXX) ./src/Evolution.cpp ./src/Game_of_life.cpp ./src/Update_state.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)
+
diff --git a/examples/parallel_for/game_of_life.NET/index.html b/examples/parallel_for/game_of_life.NET/index.html
index bc7d850..35e643a 100644
--- a/examples/parallel_for/game_of_life.NET/index.html
+++ b/examples/parallel_for/game_of_life.NET/index.html
@@ -23,10 +23,8 @@ The visualization is written in managed C++ and uses .NET CLR.
<DL>
<DT><A HREF="src">src</A>
<DD>Contains source files mentioned above.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
</DL>
<H2>To Build</H2>
diff --git a/examples/parallel_for/game_of_life.NET/vc8/Game_of_life.sln b/examples/parallel_for/game_of_life.NET/msvs/Game_of_life.sln
similarity index 98%
rename from examples/parallel_for/game_of_life.NET/vc8/Game_of_life.sln
rename to examples/parallel_for/game_of_life.NET/msvs/Game_of_life.sln
index 8bc8825..2aabfd5 100644
--- a/examples/parallel_for/game_of_life.NET/vc8/Game_of_life.sln
+++ b/examples/parallel_for/game_of_life.NET/msvs/Game_of_life.sln
@@ -1,37 +1,37 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game of Life", "Game_of_life.vcproj", "{731C7E2E-2766-41D9-96FC-0A3548973803}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug(console)|Win32 = Debug(console)|Win32
- Debug(console)|x64 = Debug(console)|x64
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release(console)|Win32 = Release(console)|Win32
- Release(console)|x64 = Release(console)|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.ActiveCfg = Debug(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.Build.0 = Debug(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.ActiveCfg = Debug(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.Build.0 = Debug(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.ActiveCfg = Debug|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.Build.0 = Debug|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.ActiveCfg = Debug|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.Build.0 = Debug|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.ActiveCfg = Release(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.Build.0 = Release(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.ActiveCfg = Release(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.Build.0 = Release(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.ActiveCfg = Release|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.Build.0 = Release|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.ActiveCfg = Release|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game of Life", "Game_of_life.vcproj", "{731C7E2E-2766-41D9-96FC-0A3548973803}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug(console)|Win32 = Debug(console)|Win32
+ Debug(console)|x64 = Debug(console)|x64
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release(console)|Win32 = Release(console)|Win32
+ Release(console)|x64 = Release(console)|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.ActiveCfg = Debug(console)|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.Build.0 = Debug(console)|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.ActiveCfg = Debug(console)|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.Build.0 = Debug(console)|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.ActiveCfg = Debug|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.Build.0 = Debug|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.ActiveCfg = Debug|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.Build.0 = Debug|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.ActiveCfg = Release(console)|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.Build.0 = Release(console)|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.ActiveCfg = Release(console)|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.Build.0 = Release(console)|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.ActiveCfg = Release|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.Build.0 = Release|Win32
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.ActiveCfg = Release|x64
+ {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/game_of_life.NET/vc8/Game_of_life.vcproj b/examples/parallel_for/game_of_life.NET/msvs/Game_of_life.vcproj
similarity index 83%
rename from examples/parallel_for/game_of_life.NET/vc8/Game_of_life.vcproj
rename to examples/parallel_for/game_of_life.NET/msvs/Game_of_life.vcproj
index d60ac1b..0d976a8 100644
--- a/examples/parallel_for/game_of_life.NET/vc8/Game_of_life.vcproj
+++ b/examples/parallel_for/game_of_life.NET/msvs/Game_of_life.vcproj
@@ -1,794 +1,794 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="Game of Life"
- ProjectGUID="{731C7E2E-2766-41D9-96FC-0A3548973803}"
- RootNamespace="Game_of_life"
- Keyword="ManagedCProj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;USE_SSE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- GenerateXMLDocumentationFiles="false"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
- LinkIncremental="2"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib;"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- SubSystem="2"
- EntryPointSymbol="main"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- GenerateXMLDocumentationFiles="false"
- WarningLevel="2"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
- LinkIncremental="2"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- SubSystem="2"
- EntryPointSymbol="main"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="-S -03
"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib;"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- EntryPointSymbol="main"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="-S -03
"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib;"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- EntryPointSymbol="main"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug(console)|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
- ExceptionHandling="1"
- RuntimeLibrary="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib;"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug(console)|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- ExceptionHandling="1"
- RuntimeLibrary="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib;"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release(console)|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
- RuntimeLibrary="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release(console)|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
- RuntimeLibrary="2"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- </Configurations>
- <References>
- <AssemblyReference
- RelativePath="System.dll"
- AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- />
- <AssemblyReference
- RelativePath="System.Data.dll"
- AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
- />
- <AssemblyReference
- RelativePath="System.Drawing.dll"
- AssemblyName="System.Drawing, Version=2.0.0.0, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
- />
- <AssemblyReference
- RelativePath="System.Windows.Forms.dll"
- AssemblyName="System.Windows.Forms, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- />
- <AssemblyReference
- RelativePath="System.XML.dll"
- AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- />
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\src\AssemblyInfo.cpp"
- >
- <FileConfiguration
- Name="Debug(console)|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug(console)|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release(console)|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release(console)|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\src\Evolution.cpp"
- >
- </File>
- <File
- RelativePath="..\src\Game_of_life.cpp"
- >
- </File>
- <File
- RelativePath="..\src\Update_state.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\src\Board.h"
- >
- </File>
- <File
- RelativePath="..\src\Evolution.h"
- >
- </File>
- <File
- RelativePath="..\src\Form1.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath=".\app.ico"
- >
- </File>
- <File
- RelativePath=".\app.rc"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="Game of Life"
+ ProjectGUID="{731C7E2E-2766-41D9-96FC-0A3548973803}"
+ RootNamespace="Game_of_life"
+ Keyword="ManagedCProj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ ManagedExtensions="1"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;USE_SSE"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ GenerateXMLDocumentationFiles="false"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ 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;"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ SubSystem="2"
+ EntryPointSymbol="main"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ ManagedExtensions="1"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ GenerateXMLDocumentationFiles="false"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ 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"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ SubSystem="2"
+ EntryPointSymbol="main"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ ManagedExtensions="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="-S -03
"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="false"
+ AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ EntryPointSymbol="main"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ ManagedExtensions="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="-S -03
"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="false"
+ AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ EntryPointSymbol="main"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug(console)|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ ManagedExtensions="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
+ ExceptionHandling="1"
+ RuntimeLibrary="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug(console)|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ ManagedExtensions="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
+ ExceptionHandling="1"
+ RuntimeLibrary="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release(console)|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ ManagedExtensions="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
+ RuntimeLibrary="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release(console)|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ ManagedExtensions="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
+ RuntimeLibrary="2"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ <AssemblyReference
+ RelativePath="System.dll"
+ AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="System.Data.dll"
+ AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
+ />
+ <AssemblyReference
+ RelativePath="System.Drawing.dll"
+ AssemblyName="System.Drawing, Version=2.0.0.0, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="System.Windows.Forms.dll"
+ AssemblyName="System.Windows.Forms, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="System.XML.dll"
+ AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ />
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\src\AssemblyInfo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug(console)|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug(console)|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release(console)|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release(console)|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\Evolution.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\Game_of_life.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\Update_state.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\src\Board.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\Evolution.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\Form1.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\app.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\app.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/game_of_life.NET/vc8/app.ico b/examples/parallel_for/game_of_life.NET/msvs/app.ico
similarity index 100%
rename from examples/parallel_for/game_of_life.NET/vc8/app.ico
rename to examples/parallel_for/game_of_life.NET/msvs/app.ico
diff --git a/examples/parallel_for/game_of_life.NET/vc8/app.rc b/examples/parallel_for/game_of_life.NET/msvs/app.rc
similarity index 100%
rename from examples/parallel_for/game_of_life.NET/vc8/app.rc
rename to examples/parallel_for/game_of_life.NET/msvs/app.rc
diff --git a/examples/parallel_for/game_of_life.NET/vc8/resource.h b/examples/parallel_for/game_of_life.NET/msvs/resource.h
similarity index 100%
rename from examples/parallel_for/game_of_life.NET/vc8/resource.h
rename to examples/parallel_for/game_of_life.NET/msvs/resource.h
diff --git a/examples/parallel_for/game_of_life.NET/vc9/Game_of_life.sln b/examples/parallel_for/game_of_life.NET/vc9/Game_of_life.sln
deleted file mode 100644
index b70d4b8..0000000
--- a/examples/parallel_for/game_of_life.NET/vc9/Game_of_life.sln
+++ /dev/null
@@ -1,37 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game of Life", "Game_of_life.vcproj", "{731C7E2E-2766-41D9-96FC-0A3548973803}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug(console)|Win32 = Debug(console)|Win32
- Debug(console)|x64 = Debug(console)|x64
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release(console)|Win32 = Release(console)|Win32
- Release(console)|x64 = Release(console)|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.ActiveCfg = Debug(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.Build.0 = Debug(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.ActiveCfg = Debug(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.Build.0 = Debug(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.ActiveCfg = Debug|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.Build.0 = Debug|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.ActiveCfg = Debug|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.Build.0 = Debug|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.ActiveCfg = Release(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.Build.0 = Release(console)|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.ActiveCfg = Release(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.Build.0 = Release(console)|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.ActiveCfg = Release|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.Build.0 = Release|Win32
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.ActiveCfg = Release|x64
- {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_for/game_of_life.NET/vc9/Game_of_life.vcproj b/examples/parallel_for/game_of_life.NET/vc9/Game_of_life.vcproj
deleted file mode 100644
index a826b9b..0000000
--- a/examples/parallel_for/game_of_life.NET/vc9/Game_of_life.vcproj
+++ /dev/null
@@ -1,792 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="Game of Life"
- ProjectGUID="{731C7E2E-2766-41D9-96FC-0A3548973803}"
- RootNamespace="Game_of_life"
- Keyword="ManagedCProj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;USE_SSE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- GenerateXMLDocumentationFiles="false"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
- LinkIncremental="2"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib;"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- SubSystem="2"
- EntryPointSymbol="main"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)_x64"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)_x64"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- GenerateXMLDocumentationFiles="false"
- WarningLevel="2"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
- LinkIncremental="2"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- SubSystem="2"
- EntryPointSymbol="main"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="
"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib;"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- EntryPointSymbol="main"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)_x64"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)_x64"
- ConfigurationType="1"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="
"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- IgnoreImportLibrary="false"
- AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib;"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- EntryPointSymbol="main"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug(console)|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
- ExceptionHandling="1"
- RuntimeLibrary="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib;"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug(console)|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)_x64"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)_x64"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- ExceptionHandling="1"
- RuntimeLibrary="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib;"
- GenerateDebugInformation="true"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release(console)|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
- RuntimeLibrary="2"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release(console)|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)_x64"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)_x64"
- ConfigurationType="1"
- CharacterSet="2"
- ManagedExtensions="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
- RuntimeLibrary="2"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)"
"
- />
- </Configuration>
- </Configurations>
- <References>
- <AssemblyReference
- RelativePath="System.dll"
- AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- MinFrameworkVersion="131072"
- />
- <AssemblyReference
- RelativePath="System.Data.dll"
- AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
- MinFrameworkVersion="131072"
- />
- <AssemblyReference
- RelativePath="System.Drawing.dll"
- AssemblyName="System.Drawing, Version=2.0.0.0, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
- MinFrameworkVersion="131072"
- />
- <AssemblyReference
- RelativePath="System.Windows.Forms.dll"
- AssemblyName="System.Windows.Forms, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- MinFrameworkVersion="131072"
- />
- <AssemblyReference
- RelativePath="System.XML.dll"
- AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- MinFrameworkVersion="131072"
- />
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\src\AssemblyInfo.cpp"
- >
- <FileConfiguration
- Name="Debug(console)|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug(console)|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release(console)|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release(console)|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\src\Evolution.cpp"
- >
- </File>
- <File
- RelativePath="..\src\Game_of_life.cpp"
- >
- </File>
- <File
- RelativePath="..\src\Update_state.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\src\Board.h"
- >
- </File>
- <File
- RelativePath="..\src\Evolution.h"
- >
- </File>
- <File
- RelativePath="..\src\Form1.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath=".\app.ico"
- >
- </File>
- <File
- RelativePath=".\app.rc"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/game_of_life.NET/vc9/app.ico b/examples/parallel_for/game_of_life.NET/vc9/app.ico
deleted file mode 100644
index 3a5525f..0000000
Binary files a/examples/parallel_for/game_of_life.NET/vc9/app.ico and /dev/null differ
diff --git a/examples/parallel_for/game_of_life.NET/vc9/app.rc b/examples/parallel_for/game_of_life.NET/vc9/app.rc
deleted file mode 100644
index 807aa89..0000000
--- a/examples/parallel_for/game_of_life.NET/vc9/app.rc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon placed first or with lowest ID value becomes application icon
-
-LANGUAGE 9, 1
-#pragma code_page(1252)
-1 ICON "app.ico"
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
- "\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/examples/parallel_for/game_of_life.NET/vc9/resource.h b/examples/parallel_for/game_of_life.NET/vc9/resource.h
deleted file mode 100644
index d5ac7c4..0000000
--- a/examples/parallel_for/game_of_life.NET/vc9/resource.h
+++ /dev/null
@@ -1,3 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by app.rc
diff --git a/examples/parallel_for/polygon_overlay/Makefile b/examples/parallel_for/polygon_overlay/Makefile
index 160c0f7..418dad1 100644
--- a/examples/parallel_for/polygon_overlay/Makefile
+++ b/examples/parallel_for/polygon_overlay/Makefile
@@ -29,7 +29,9 @@ NAME=pover
ARGS=
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
include ../../common/gui/Makefile.gmake
diff --git a/examples/parallel_for/polygon_overlay/Makefile.windows b/examples/parallel_for/polygon_overlay/Makefile.windows
index 32babf9..3dd0008 100644
--- a/examples/parallel_for/polygon_overlay/Makefile.windows
+++ b/examples/parallel_for/polygon_overlay/Makefile.windows
@@ -30,32 +30,36 @@
PROG=Pover
ARGS=
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
# Uncomment one of next lines to choose user interface type (console, gdiplus, direct draw)
#UI = con
UI = gdi
#UI = dd
-# Machine architecture, auto-detected from TBB_ARCH_PLATFORM by default
+# Machine architecture, auto-detected from TBB_TARGET_ARCH by default
# Use XARCH variable to change it. See index.html for more information
-ARCH0 = $(TBB_ARCH_PLATFORM)-
-ARCHA = $(ARCH0:\vc7.1-=)
-ARCHB = $(ARCHA:\vc8-=)
-ARCHC = $(ARCHB:\vc9-=)
-ARCH3 = $(ARCHC:ia32=x86)
-ARCH4 = $(ARCH3:intel64=AMD64)
-XARCH = $(ARCH4:-=x86)
+ARCH0 = $(TBB_TARGET_ARCH)-
+ARCH1 = $(ARCH0:ia32-=x86)
+ARCH2 = $(ARCH1:intel64-=AMD64)
+XARCH = $(ARCH2:-=x86)
MAKEINC = ../../common/gui/Makefile.win
all: release test
-release:
+release: compiler_check
@$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib tbbmalloc.lib $(LIBS)" XARCH=$(XARCH) RCNAME=pover SOURCE=*.cpp EXE=$(PROG).exe build_one
-debug:
+debug: compiler_check
@$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib tbbmalloc_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=pover SOURCE=*.cpp EXE=$(PROG).exe build_one
clean:
- @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest vc7.1\pover.res
+ @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\pover.res
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/parallel_for/polygon_overlay/index.html b/examples/parallel_for/polygon_overlay/index.html
index 3833c37..999bb63 100644
--- a/examples/parallel_for/polygon_overlay/index.html
+++ b/examples/parallel_for/polygon_overlay/index.html
@@ -79,12 +79,8 @@ One limitation of the program is that if the number of polygons in the source ma
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 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>
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover.icproj b/examples/parallel_for/polygon_overlay/msvs/pover.icproj
new file mode 100644
index 0000000..d8886d7
--- /dev/null
+++ b/examples/parallel_for/polygon_overlay/msvs/pover.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="pover"
+ ProjectGUID="{B175D396-7260-45F8-9E18-842ED8A32A16}"
+ VCNestedProjectGUID="{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
+ VCNestedProjectFileName="pover.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_for/polygon_overlay/vc7.1/pover.rc b/examples/parallel_for/polygon_overlay/msvs/pover.rc
similarity index 100%
rename from examples/parallel_for/polygon_overlay/vc7.1/pover.rc
rename to examples/parallel_for/polygon_overlay/msvs/pover.rc
diff --git a/examples/parallel_for/polygon_overlay/vc8/pover.vcproj b/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
similarity index 78%
rename from examples/parallel_for/polygon_overlay/vc8/pover.vcproj
rename to examples/parallel_for/polygon_overlay/msvs/pover.vcproj
index 795fa60..690197e 100644
--- a/examples/parallel_for/polygon_overlay/vc8/pover.vcproj
+++ b/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
@@ -1,832 +1,832 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="pover"
- ProjectGUID="{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
- RootNamespace="pover"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)" 
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)" 
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc_debug.dll" "$(OutDir)" 
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc_debug.pdb" "$(OutDir)"
"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;h;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\polymain.cpp"
- >
- </File>
- <File
- RelativePath="..\polymain.h"
- >
- </File>
- <File
- RelativePath="..\polyover.cpp"
- >
- </File>
- <File
- RelativePath="..\polyover.h"
- >
- </File>
- <File
- RelativePath="..\pover_global.h"
- >
- </File>
- <File
- RelativePath="..\pover_video.cpp"
- >
- </File>
- <File
- RelativePath="..\pover_video.h"
- >
- </File>
- <File
- RelativePath="..\rpolygon.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- <Filter
- Name="Video Layer"
- >
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp"
- >
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="pover"
+ ProjectGUID="{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
+ RootNamespace="pover"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"$(DXSDK_DIR)\lib\x86""
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"$(DXSDK_DIR)\lib\x64""
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;h;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\polymain.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\polymain.h"
+ >
+ </File>
+ <File
+ RelativePath="..\polyover.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\polyover.h"
+ >
+ </File>
+ <File
+ RelativePath="..\pover_global.h"
+ >
+ </File>
+ <File
+ RelativePath="..\pover_video.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\pover_video.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rpolygon.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ <Filter
+ Name="Video Layer"
+ >
+ <File
+ RelativePath="..\..\..\common\gui\ddvideo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\gdivideo.cpp"
+ >
+ <FileConfiguration
+ Name="DD Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\video.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\winvideo.h"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/polygon_overlay/vc8/pover.sln b/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
similarity index 98%
rename from examples/parallel_for/polygon_overlay/vc8/pover.sln
rename to examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
index 4168381..bb1211d 100644
--- a/examples/parallel_for/polygon_overlay/vc8/pover.sln
+++ b/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
@@ -1,37 +1,37 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pover", "pover.vcproj", "{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DD Debug|Win32 = DD Debug|Win32
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- DD Release|x64 = DD Release|x64
- GDI Debug|Win32 = GDI Debug|Win32
- GDI Debug|x64 = GDI Debug|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
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.Build.0 = DD Debug|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.Build.0 = DD Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.ActiveCfg = DD Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.Build.0 = DD Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pover", "pover.vcproj", "{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DD Debug|Win32 = DD Debug|Win32
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ DD Release|x64 = DD Release|x64
+ GDI Debug|Win32 = GDI Debug|Win32
+ GDI Debug|x64 = GDI Debug|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
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.Build.0 = DD Debug|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.ActiveCfg = DD Debug|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.Build.0 = DD Debug|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.ActiveCfg = DD Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.Build.0 = DD Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.ActiveCfg = DD Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.Build.0 = DD Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {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
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/polygon_overlay/vc9/pover.sln b/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
similarity index 54%
rename from examples/parallel_for/polygon_overlay/vc9/pover.sln
rename to examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
index 83b3887..8c2c6cf 100644
--- a/examples/parallel_for/polygon_overlay/vc9/pover.sln
+++ b/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
@@ -1,37 +1,53 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pover", "pover.vcproj", "{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DD Debug|Win32 = DD Debug|Win32
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- DD Release|x64 = DD Release|x64
- GDI Debug|Win32 = GDI Debug|Win32
- GDI Debug|x64 = GDI Debug|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
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.Build.0 = DD Debug|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.Build.0 = DD Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.ActiveCfg = DD Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.Build.0 = DD Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "pover", "pover.icproj", "{B175D396-7260-45F8-9E18-842ED8A32A16}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DD Debug|Win32 = DD Debug|Win32
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ DD Release|x64 = DD Release|x64
+ GDI Debug|Win32 = GDI Debug|Win32
+ GDI Debug|x64 = GDI Debug|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
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Debug|Win32.Build.0 = DD Debug|Win32
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Debug|x64.ActiveCfg = DD Debug|x64
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Debug|x64.Build.0 = DD Debug|x64
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Release|Win32.ActiveCfg = DD Release|Win32
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Release|Win32.Build.0 = DD Release|Win32
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Release|x64.ActiveCfg = DD Release|x64
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.DD Release|x64.Build.0 = DD Release|x64
+ {B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {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
+ {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
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.Build.0 = DD Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.ActiveCfg = DD Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.Build.0 = DD Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.ActiveCfg = DD Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.Build.0 = DD Debug|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.ActiveCfg = DD Debug|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.Build.0 = DD Debug|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/polygon_overlay/vc7.1/resource.h b/examples/parallel_for/polygon_overlay/msvs/resource.h
similarity index 100%
rename from examples/parallel_for/polygon_overlay/vc7.1/resource.h
rename to examples/parallel_for/polygon_overlay/msvs/resource.h
diff --git a/examples/parallel_for/polygon_overlay/rpolygon.h b/examples/parallel_for/polygon_overlay/rpolygon.h
index 020422a..3616b94 100644
--- a/examples/parallel_for/polygon_overlay/rpolygon.h
+++ b/examples/parallel_for/polygon_overlay/rpolygon.h
@@ -46,7 +46,7 @@ DEFINE RPolygon_allocator rAlloc;
enum MallocBehavior {
UseMalloc,
- UseScalableAllocator,
+ UseScalableAllocator
};
DEFINE MallocBehavior gMBehavior INIT(UseScalableAllocator);
diff --git a/examples/parallel_for/polygon_overlay/vc7.1/pover.sln b/examples/parallel_for/polygon_overlay/vc7.1/pover.sln
deleted file mode 100644
index 8efff51..0000000
--- a/examples/parallel_for/polygon_overlay/vc7.1/pover.sln
+++ /dev/null
@@ -1,35 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pover", "pover.vcproj", "{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Debug GDI = Debug GDI
- Debug DD = Debug DD
- Release = Release
- Release GDI = Release GDI
- Release DD = Release DD
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Debug.ActiveCfg = Debug|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Debug.Build.0 = Debug|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Debug GDI.ActiveCfg = Debug GDI|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Debug GDI.Build.0 = Debug GDI|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Debug DD.ActiveCfg = Debug DD|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Debug DD.Build.0 = Debug DD|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Release.ActiveCfg = Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Release.Build.0 = Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Release GDI.ActiveCfg = Release GDI|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Release GDI.Build.0 = Release GDI|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Release DD.ActiveCfg = Release DD|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.Release DD.Build.0 = Release DD|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_for/polygon_overlay/vc7.1/pover.suo b/examples/parallel_for/polygon_overlay/vc7.1/pover.suo
deleted file mode 100644
index b2f2d28..0000000
Binary files a/examples/parallel_for/polygon_overlay/vc7.1/pover.suo and /dev/null differ
diff --git a/examples/parallel_for/polygon_overlay/vc7.1/pover.vcproj b/examples/parallel_for/polygon_overlay/vc7.1/pover.vcproj
deleted file mode 100644
index 2933b4f..0000000
--- a/examples/parallel_for/polygon_overlay/vc7.1/pover.vcproj
+++ /dev/null
@@ -1,500 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="pover"
- ProjectGUID="{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_CONSOLE"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib""
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)"
-copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.pdb" "$(OutDir)"
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib""
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)"
-copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.pdb" "$(OutDir)"
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release GDI|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)"
-copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.pdb" "$(OutDir)"
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug GDI|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- GlobalOptimizations="FALSE"
- InlineFunctionExpansion="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WINDOWS"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)"
-copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.pdb" "$(OutDir)"
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug DD|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- GlobalOptimizations="FALSE"
- InlineFunctionExpansion="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WINDOWS"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)"
-copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.pdb" "$(OutDir)"
-"/>
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release DD|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)"
-copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.pdb" "$(OutDir)"
-"/>
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\polymain.cpp">
- </File>
- <File
- RelativePath="..\polyover.cpp">
- </File>
- <File
- RelativePath="..\pover_video.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath="..\polymain.h">
- </File>
- <File
- RelativePath="..\polyover.h">
- </File>
- <File
- RelativePath="..\pover_global.h">
- </File>
- <File
- RelativePath="..\pover_video.h">
- </File>
- <File
- RelativePath="..\rpolygon.h">
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- </Filter>
- <Filter
- Name="Video Layer"
- Filter="">
- <File
- RelativePath="..\..\..\common\gui\convideo.cpp">
- <FileConfiguration
- Name="Release GDI|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Debug GDI|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release DD|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Debug DD|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp">
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Debug DD|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release DD|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp">
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Debug GDI|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release GDI|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h">
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/polygon_overlay/vc8/pover.rc b/examples/parallel_for/polygon_overlay/vc8/pover.rc
deleted file mode 100644
index 3eee795..0000000
--- a/examples/parallel_for/polygon_overlay/vc8/pover.rc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE 9, 1
-#pragma code_page(1252)
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/examples/parallel_for/polygon_overlay/vc8/pover.suo b/examples/parallel_for/polygon_overlay/vc8/pover.suo
deleted file mode 100644
index 5121ea0..0000000
Binary files a/examples/parallel_for/polygon_overlay/vc8/pover.suo and /dev/null differ
diff --git a/examples/parallel_for/polygon_overlay/vc8/resource.h b/examples/parallel_for/polygon_overlay/vc8/resource.h
deleted file mode 100644
index e70b4ea..0000000
--- a/examples/parallel_for/polygon_overlay/vc8/resource.h
+++ /dev/null
@@ -1,14 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by pover.rc
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 101
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1001
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/examples/parallel_for/polygon_overlay/vc9/pover.rc b/examples/parallel_for/polygon_overlay/vc9/pover.rc
deleted file mode 100644
index 3eee795..0000000
--- a/examples/parallel_for/polygon_overlay/vc9/pover.rc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE 9, 1
-#pragma code_page(1252)
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/examples/parallel_for/polygon_overlay/vc9/pover.suo b/examples/parallel_for/polygon_overlay/vc9/pover.suo
deleted file mode 100644
index 9b5cbe8..0000000
Binary files a/examples/parallel_for/polygon_overlay/vc9/pover.suo and /dev/null differ
diff --git a/examples/parallel_for/polygon_overlay/vc9/pover.vcproj b/examples/parallel_for/polygon_overlay/vc9/pover.vcproj
deleted file mode 100644
index 5793781..0000000
--- a/examples/parallel_for/polygon_overlay/vc9/pover.vcproj
+++ /dev/null
@@ -1,825 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="pover"
- ProjectGUID="{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}"
- RootNamespace="pover"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;h;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\polymain.cpp"
- >
- </File>
- <File
- RelativePath="..\polymain.h"
- >
- </File>
- <File
- RelativePath="..\polyover.cpp"
- >
- </File>
- <File
- RelativePath="..\polyover.h"
- >
- </File>
- <File
- RelativePath="..\pover_global.h"
- >
- </File>
- <File
- RelativePath="..\pover_video.cpp"
- >
- </File>
- <File
- RelativePath="..\pover_video.h"
- >
- </File>
- <File
- RelativePath="..\rpolygon.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- <Filter
- Name="Video Layer"
- >
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp"
- >
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/polygon_overlay/vc9/resource.h b/examples/parallel_for/polygon_overlay/vc9/resource.h
deleted file mode 100644
index e70b4ea..0000000
--- a/examples/parallel_for/polygon_overlay/vc9/resource.h
+++ /dev/null
@@ -1,14 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by pover.rc
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 101
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1001
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/examples/parallel_for/seismic/Makefile b/examples/parallel_for/seismic/Makefile
index 0bf5323..deca9f1 100644
--- a/examples/parallel_for/seismic/Makefile
+++ b/examples/parallel_for/seismic/Makefile
@@ -29,7 +29,9 @@ NAME=seismic
ARGS=- 300
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
include ../../common/gui/Makefile.gmake
diff --git a/examples/parallel_for/seismic/Makefile.windows b/examples/parallel_for/seismic/Makefile.windows
index bb6659a..3ee3a98 100644
--- a/examples/parallel_for/seismic/Makefile.windows
+++ b/examples/parallel_for/seismic/Makefile.windows
@@ -30,32 +30,34 @@
PROG=Seismic
ARGS=- 300
-# The C++ compiler options
-CXX = cl.exe
+# Trying ot find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
# Uncomment one of next lines to choose user interface type (console, gdiplus, direct draw)
#UI = con
UI = gdi
#UI = dd
-# Machine architecture, auto-detected from TBB_ARCH_PLATFORM by default
+# Machine architecture, auto-detected from TBB_TARGET_ARCH by default
# Use XARCH variable to change it. See index.html for more information
-ARCH0 = $(TBB_ARCH_PLATFORM)-
-ARCHA = $(ARCH0:\vc7.1-=)
-ARCHB = $(ARCHA:\vc8-=)
-ARCHC = $(ARCHB:\vc9-=)
-ARCH3 = $(ARCHC:ia32=x86)
-ARCH4 = $(ARCH3:intel64=AMD64)
-XARCH = $(ARCH4:-=x86)
+ARCH0 = $(TBB_TARGET_ARCH)-
+ARCH1 = $(ARCH0:ia32-=x86)
+ARCH2 = $(ARCH1:intel64-=AMD64)
+XARCH = $(ARCH2:-=x86)
MAKEINC = ../../common/gui/Makefile.win
all: release test
-release:
+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
-debug:
+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
clean:
- @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest vc7.1\SeismicSimulation.res
+ @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\SeismicSimulation.res >nul 2>&1
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/parallel_for/seismic/SeismicSimulation.cpp b/examples/parallel_for/seismic/SeismicSimulation.cpp
index c2f6060..4902b6b 100644
--- a/examples/parallel_for/seismic/SeismicSimulation.cpp
+++ b/examples/parallel_for/seismic/SeismicSimulation.cpp
@@ -294,7 +294,7 @@ void InitializeUniverse() {
//////////////////////////////// Interface ////////////////////////////////////
#ifdef _WINDOWS
-#include "vc7.1/resource.h"
+#include "msvs/resource.h"
#endif
int main(int argc, char *argv[])
diff --git a/examples/parallel_for/seismic/index.html b/examples/parallel_for/seismic/index.html
index a49ef16..2b98f28 100644
--- a/examples/parallel_for/seismic/index.html
+++ b/examples/parallel_for/seismic/index.html
@@ -14,12 +14,8 @@ Parallel seismic simulation that demonstrates use of parallel_for.
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.ico b/examples/parallel_for/seismic/msvs/SeismicSimulation.ico
similarity index 100%
rename from examples/parallel_for/seismic/vc7.1/SeismicSimulation.ico
rename to examples/parallel_for/seismic/msvs/SeismicSimulation.ico
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj b/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
new file mode 100644
index 0000000..2db9709
--- /dev/null
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="SeismicSimulation"
+ ProjectGUID="{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
+ VCNestedProjectFileName="SeismicSimulation.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_for/seismic/vc8/SeismicSimulation.rc b/examples/parallel_for/seismic/msvs/SeismicSimulation.rc
similarity index 100%
rename from examples/parallel_for/seismic/vc8/SeismicSimulation.rc
rename to examples/parallel_for/seismic/msvs/SeismicSimulation.rc
diff --git a/examples/parallel_for/seismic/vc8/SeismicSimulation.vcproj b/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
similarity index 83%
rename from examples/parallel_for/seismic/vc8/SeismicSimulation.vcproj
rename to examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
index 0fb0b34..7980d42 100644
--- a/examples/parallel_for/seismic/vc8/SeismicSimulation.vcproj
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
@@ -1,820 +1,820 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="SeismicSimulation"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
- RootNamespace="SeismicSimulation"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;h;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\SeismicSimulation.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath=".\resource.h"
- >
- </File>
- <File
- RelativePath=".\SeismicSimulation.ico"
- >
- </File>
- <File
- RelativePath=".\SeismicSimulation.rc"
- >
- </File>
- <File
- RelativePath=".\small.ico"
- >
- </File>
- </Filter>
- <Filter
- Name="Video Layer"
- >
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp"
- >
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="SeismicSimulation"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
+ RootNamespace="SeismicSimulation"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;h;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\SeismicSimulation.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SeismicSimulation.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\SeismicSimulation.rc"
+ >
+ </File>
+ <File
+ RelativePath=".\small.ico"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Video Layer"
+ >
+ <File
+ RelativePath="..\..\..\common\gui\ddvideo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\gdivideo.cpp"
+ >
+ <FileConfiguration
+ Name="DD Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\video.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\winvideo.h"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/seismic/vc8/SeismicSimulation.sln b/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
similarity index 98%
rename from examples/parallel_for/seismic/vc8/SeismicSimulation.sln
rename to examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
index b000587..7bd1fb7 100644
--- a/examples/parallel_for/seismic/vc8/SeismicSimulation.sln
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
@@ -1,37 +1,37 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SeismicSimulation", "SeismicSimulation.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2527}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DD Debug|Win32 = DD Debug|Win32
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- DD Release|x64 = DD Release|x64
- GDI Debug|Win32 = GDI Debug|Win32
- GDI Debug|x64 = GDI Debug|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}.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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SeismicSimulation", "SeismicSimulation.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2527}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DD Debug|Win32 = DD Debug|Win32
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ DD Release|x64 = DD Release|x64
+ GDI Debug|Win32 = GDI Debug|Win32
+ GDI Debug|x64 = GDI Debug|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}.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
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/seismic/vc9/SeismicSimulation.sln b/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
similarity index 54%
rename from examples/parallel_for/seismic/vc9/SeismicSimulation.sln
rename to examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
index aa49134..77ce9b2 100644
--- a/examples/parallel_for/seismic/vc9/SeismicSimulation.sln
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
@@ -1,37 +1,53 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SeismicSimulation", "SeismicSimulation.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A2527}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DD Debug|Win32 = DD Debug|Win32
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- DD Release|x64 = DD Release|x64
- GDI Debug|Win32 = GDI Debug|Win32
- GDI Debug|x64 = GDI Debug|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}.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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "SeismicSimulation", "SeismicSimulation.icproj", "{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DD Debug|Win32 = DD Debug|Win32
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ DD Release|x64 = DD Release|x64
+ GDI Debug|Win32 = GDI Debug|Win32
+ GDI Debug|x64 = GDI Debug|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
+ {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
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/seismic/vc7.1/resource.h b/examples/parallel_for/seismic/msvs/resource.h
similarity index 100%
rename from examples/parallel_for/seismic/vc7.1/resource.h
rename to examples/parallel_for/seismic/msvs/resource.h
diff --git a/examples/parallel_for/seismic/vc7.1/small.ico b/examples/parallel_for/seismic/msvs/small.ico
similarity index 100%
rename from examples/parallel_for/seismic/vc7.1/small.ico
rename to examples/parallel_for/seismic/msvs/small.ico
diff --git a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.rc b/examples/parallel_for/seismic/vc7.1/SeismicSimulation.rc
deleted file mode 100644
index 67d1158..0000000
--- a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.rc
+++ /dev/null
@@ -1,146 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_SEISMICSIMULATION ICON "SeismicSimulation.ico"
-IDI_SMALL ICON "small.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Menu
-//
-
-IDC_SEISMICSIMULATION MENU
-BEGIN
- POPUP "&File"
- BEGIN
- MENUITEM "&Parallel", ID_FILE_PARALLEL
- MENUITEM "&Serial", ID_FILE_SERIAL
- MENUITEM SEPARATOR
- MENUITEM "&Enable GUI", ID_FILE_ENABLEGUI
- MENUITEM "&Disable GUI", ID_FILE_DISABLEGUI
- MENUITEM SEPARATOR
- MENUITEM "E&xit", IDM_EXIT
- END
- POPUP "&Help"
- BEGIN
- MENUITEM "&About ...", IDM_ABOUT
- END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Accelerator
-//
-
-IDC_SEISMICSIMULATION ACCELERATORS
-BEGIN
- VK_OEM_2, IDM_ABOUT, VIRTKEY, ALT, NOINVERT
- "P", ID_FILE_PARALLEL, VIRTKEY, ALT, NOINVERT
- "S", ID_FILE_SERIAL, VIRTKEY, ALT, NOINVERT
- "D", ID_FILE_DISABLEGUI, VIRTKEY, ALT, NOINVERT
- "E", ID_FILE_ENABLEGUI, VIRTKEY, ALT, NOINVERT
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_ABOUTBOX DIALOG 22, 17, 230, 75
-STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-CAPTION "About"
-FONT 8, "System"
-BEGIN
- ICON IDI_SEISMICSIMULATION,IDC_MYICON,14,9,16,16
- LTEXT "SeismicSimulation Version 1.1",IDC_STATIC,49,10,119,8,
- SS_NOPREFIX
- LTEXT "Copyright (C) 2005-2008",IDC_STATIC,49,20,119,8
- DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP
-END
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
- "#include ""windows.h""\r\n"
- "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE
-BEGIN
- IDS_APP_TITLE "SeismicSimulation"
- IDC_SEISMICSIMULATION "SEISMICSIMULATION"
-END
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.sln b/examples/parallel_for/seismic/vc7.1/SeismicSimulation.sln
deleted file mode 100644
index e386444..0000000
--- a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.sln
+++ /dev/null
@@ -1,27 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SeismicSimulation", "SeismicSimulation.vcproj", "{4A021AFA-E254-4BCE-918D-377DF1C0CBEC}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- DD Debug = DD Debug
- DD Release = DD Release
- GDI Debug = GDI Debug
- GDI Release = GDI Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.DD Debug.ActiveCfg = DD Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.DD Debug.Build.0 = DD Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.DD Release.ActiveCfg = DD Release|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.DD Release.Build.0 = DD Release|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.GDI Debug.ActiveCfg = Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.GDI Debug.Build.0 = Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.GDI Release.ActiveCfg = Release|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0CBEC}.GDI Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.suo b/examples/parallel_for/seismic/vc7.1/SeismicSimulation.suo
deleted file mode 100644
index c08d453..0000000
Binary files a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.suo and /dev/null differ
diff --git a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.vcproj b/examples/parallel_for/seismic/vc7.1/SeismicSimulation.vcproj
deleted file mode 100644
index d0ff8ad..0000000
--- a/examples/parallel_for/seismic/vc7.1/SeismicSimulation.vcproj
+++ /dev/null
@@ -1,313 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="SeismicSimulation"
- ProjectGUID="{4A021AFA-E254-4BCE-918D-377DF1C0CBEC}"
- RootNamespace="SeismicSimulation"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- GlobalOptimizations="TRUE"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\SeismicSimulation.cpp">
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File
- RelativePath=".\Resource.h">
- </File>
- <File
- RelativePath=".\SeismicSimulation.ico">
- </File>
- <File
- RelativePath=".\SeismicSimulation.rc">
- </File>
- <File
- RelativePath=".\small.ico">
- </File>
- </Filter>
- <Filter
- Name="Video Layer"
- Filter="">
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp">
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp">
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h">
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/seismic/vc8/SeismicSimulation.ico b/examples/parallel_for/seismic/vc8/SeismicSimulation.ico
deleted file mode 100644
index d551aa3..0000000
Binary files a/examples/parallel_for/seismic/vc8/SeismicSimulation.ico and /dev/null differ
diff --git a/examples/parallel_for/seismic/vc8/SeismicSimulation.suo b/examples/parallel_for/seismic/vc8/SeismicSimulation.suo
deleted file mode 100644
index 48336f3..0000000
Binary files a/examples/parallel_for/seismic/vc8/SeismicSimulation.suo and /dev/null differ
diff --git a/examples/parallel_for/seismic/vc8/resource.h b/examples/parallel_for/seismic/vc8/resource.h
deleted file mode 100644
index 44453d7..0000000
--- a/examples/parallel_for/seismic/vc8/resource.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by SeismicSimulation.rc
-//
-#define IDC_MYICON 2
-#define IDD_SEISMICSIMULATION_DIALOG 102
-#define IDS_APP_TITLE 103
-#define IDD_ABOUTBOX 103
-#define IDM_ABOUT 104
-#define IDM_EXIT 105
-#define IDI_SEISMICSIMULATION 107
-#define IDI_SMALL 108
-#define IDC_SEISMICSIMULATION 109
-#define IDR_MAINFRAME 128
-#define ID_FILE_PARALLEL 32771
-#define ID_FILE_SERIAL 32772
-#define IDM_PARALLEL 32773
-#define ID_FILE_ENABLEGUI 32774
-#define ID_FILE_DISABLEGUI 32775
-#define IDC_STATIC -1
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NO_MFC 1
-#define _APS_NEXT_RESOURCE_VALUE 129
-#define _APS_NEXT_COMMAND_VALUE 32782
-#define _APS_NEXT_CONTROL_VALUE 1000
-#define _APS_NEXT_SYMED_VALUE 110
-#endif
-#endif
diff --git a/examples/parallel_for/seismic/vc9/SeismicSimulation.ico b/examples/parallel_for/seismic/vc9/SeismicSimulation.ico
deleted file mode 100644
index d551aa3..0000000
Binary files a/examples/parallel_for/seismic/vc9/SeismicSimulation.ico and /dev/null differ
diff --git a/examples/parallel_for/seismic/vc9/SeismicSimulation.rc b/examples/parallel_for/seismic/vc9/SeismicSimulation.rc
deleted file mode 100644
index c200334..0000000
--- a/examples/parallel_for/seismic/vc9/SeismicSimulation.rc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_SEISMICSIMULATION ICON "SeismicSimulation.ico"
-IDI_SMALL ICON "small.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Menu
-//
-
-IDC_SEISMICSIMULATION MENU
-BEGIN
- POPUP "&File"
- BEGIN
- MENUITEM "&Parallel", ID_FILE_PARALLEL
- MENUITEM "&Serial", ID_FILE_SERIAL
- MENUITEM SEPARATOR
- MENUITEM "&Enable GUI", ID_FILE_ENABLEGUI
- MENUITEM "&Disable GUI", ID_FILE_DISABLEGUI
- MENUITEM SEPARATOR
- MENUITEM "E&xit", IDM_EXIT
- END
- POPUP "&Help"
- BEGIN
- MENUITEM "&About ...", IDM_ABOUT
- END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Accelerator
-//
-
-IDC_SEISMICSIMULATION ACCELERATORS
-BEGIN
- VK_OEM_2, IDM_ABOUT, VIRTKEY, ALT, NOINVERT
- "P", ID_FILE_PARALLEL, VIRTKEY, ALT, NOINVERT
- "S", ID_FILE_SERIAL, VIRTKEY, ALT, NOINVERT
- "D", ID_FILE_DISABLEGUI, VIRTKEY, ALT, NOINVERT
- "E", ID_FILE_ENABLEGUI, VIRTKEY, ALT, NOINVERT
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_ABOUTBOX DIALOG 22, 17, 230, 75
-STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-CAPTION "About"
-FONT 8, "System"
-BEGIN
- ICON IDI_SEISMICSIMULATION,IDC_MYICON,14,9,16,16
- LTEXT "SeismicSimulation Version 1.1",IDC_STATIC,49,10,119,8,SS_NOPREFIX
- LTEXT "Copyright (C) 2005-2008",IDC_STATIC,49,20,119,8
- DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP
-END
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
- "#include ""windows.h""\r\n"
- "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE
-BEGIN
- IDS_APP_TITLE "SeismicSimulation"
- IDC_SEISMICSIMULATION "SEISMICSIMULATION"
-END
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/examples/parallel_for/seismic/vc9/SeismicSimulation.suo b/examples/parallel_for/seismic/vc9/SeismicSimulation.suo
deleted file mode 100644
index 9fc65f4..0000000
Binary files a/examples/parallel_for/seismic/vc9/SeismicSimulation.suo and /dev/null differ
diff --git a/examples/parallel_for/seismic/vc9/SeismicSimulation.vcproj b/examples/parallel_for/seismic/vc9/SeismicSimulation.vcproj
deleted file mode 100644
index fe43053..0000000
--- a/examples/parallel_for/seismic/vc9/SeismicSimulation.vcproj
+++ /dev/null
@@ -1,813 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="SeismicSimulation"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
- RootNamespace="SeismicSimulation"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb""$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB22_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;h;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\SeismicSimulation.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath=".\resource.h"
- >
- </File>
- <File
- RelativePath=".\SeismicSimulation.ico"
- >
- </File>
- <File
- RelativePath=".\SeismicSimulation.rc"
- >
- </File>
- <File
- RelativePath=".\small.ico"
- >
- </File>
- </Filter>
- <Filter
- Name="Video Layer"
- >
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp"
- >
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/seismic/vc9/resource.h b/examples/parallel_for/seismic/vc9/resource.h
deleted file mode 100644
index 44453d7..0000000
--- a/examples/parallel_for/seismic/vc9/resource.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by SeismicSimulation.rc
-//
-#define IDC_MYICON 2
-#define IDD_SEISMICSIMULATION_DIALOG 102
-#define IDS_APP_TITLE 103
-#define IDD_ABOUTBOX 103
-#define IDM_ABOUT 104
-#define IDM_EXIT 105
-#define IDI_SEISMICSIMULATION 107
-#define IDI_SMALL 108
-#define IDC_SEISMICSIMULATION 109
-#define IDR_MAINFRAME 128
-#define ID_FILE_PARALLEL 32771
-#define ID_FILE_SERIAL 32772
-#define IDM_PARALLEL 32773
-#define ID_FILE_ENABLEGUI 32774
-#define ID_FILE_DISABLEGUI 32775
-#define IDC_STATIC -1
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NO_MFC 1
-#define _APS_NEXT_RESOURCE_VALUE 129
-#define _APS_NEXT_COMMAND_VALUE 32782
-#define _APS_NEXT_CONTROL_VALUE 1000
-#define _APS_NEXT_SYMED_VALUE 110
-#endif
-#endif
diff --git a/examples/parallel_for/seismic/vc9/small.ico b/examples/parallel_for/seismic/vc9/small.ico
deleted file mode 100644
index d551aa3..0000000
Binary files a/examples/parallel_for/seismic/vc9/small.ico and /dev/null differ
diff --git a/examples/parallel_for/tachyon/Makefile b/examples/parallel_for/tachyon/Makefile
index 7f82e00..d0b2ffb 100644
--- a/examples/parallel_for/tachyon/Makefile
+++ b/examples/parallel_for/tachyon/Makefile
@@ -55,7 +55,9 @@
NAME:=tachyon
# The C++ compiler
-#CXX = g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
# The default dataset
export DATASET = balls
diff --git a/examples/parallel_for/tachyon/Makefile.windows b/examples/parallel_for/tachyon/Makefile.windows
index 420634e..161cc0d 100644
--- a/examples/parallel_for/tachyon/Makefile.windows
+++ b/examples/parallel_for/tachyon/Makefile.windows
@@ -53,23 +53,22 @@
# Common Makefile that builds and runs example.
-# The C++ compiler
-CXX = cl.exe
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
# Uncomment one of next lines to choose user interface type (console, gdiplus, direct draw)
#UI = con
UI = gdi
#UI = dd
-# Machine architecture, auto-detected from TBB_ARCH_PLATFORM by default
+# Machine architecture, auto-detected from TBB_TARGET_ARCH by default
# Use XARCH variable to change it. See index.html for more information
-ARCH0 = $(TBB_ARCH_PLATFORM)-
-ARCHA = $(ARCH0:\vc7.1-=)
-ARCHB = $(ARCHA:\vc8-=)
-ARCHC = $(ARCHB:\vc9-=)
-ARCH3 = $(ARCHC:ia32=x86)
-ARCH4 = $(ARCH3:intel64=AMD64)
-XARCH = $(ARCH4:-=x86)
+ARCH0 = $(TBB_TARGET_ARCH)-
+ARCH1 = $(ARCH0:ia32-=x86)
+ARCH2 = $(ARCH1:intel64-=AMD64)
+XARCH = $(ARCH2:-=x86)
# The default dataset
DATASET = balls
@@ -77,7 +76,8 @@ DATASET = balls
ARGS =
# Add these for tbb/tbb1d release builds
-CXXFLAGS_TBB_NDEBUG = $(CXXFLAGS)
+# /GL is a workaround to prevent run-time crash when built by VS2010
+CXXFLAGS_TBB_NDEBUG = $(CXXFLAGS) /GL
LIBS_TBB_NDEBUG = tbb.lib $(LIBS)
# Add these for tbb/tbb1d debug builds
@@ -128,4 +128,4 @@ run_tbb1d:
clean:
- @cmd.exe /C del tachyon.* *.manifest *.obj vc7.1\gui.res *.?db
+ @cmd.exe /C del tachyon.* *.manifest *.obj msvs\gui.res *.?db
diff --git a/examples/parallel_for/tachyon/index.html b/examples/parallel_for/tachyon/index.html
index 51a0e1e..2e410c8 100644
--- a/examples/parallel_for/tachyon/index.html
+++ b/examples/parallel_for/tachyon/index.html
@@ -71,12 +71,8 @@ The following versions of the example are provided:
<DD>Contains source code and include files for the example.
<DT><A HREF="dat">dat</A>
<DD>Contains data sets for running the example.
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
@@ -150,6 +146,8 @@ named tachyon.<<I>version</I>>.exe. To run these executables directly, us
the "Applications" list. Alternatively, if X11 is not available, build without the GUI (see build targets above).
</UL>
+<a name="copyright"/>
+
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
diff --git a/examples/parallel_for/tachyon/vc7.1/gui.ico b/examples/parallel_for/tachyon/msvs/gui.ico
similarity index 100%
rename from examples/parallel_for/tachyon/vc7.1/gui.ico
rename to examples/parallel_for/tachyon/msvs/gui.ico
diff --git a/examples/parallel_for/tachyon/vc7.1/gui.rc b/examples/parallel_for/tachyon/msvs/gui.rc
similarity index 100%
rename from examples/parallel_for/tachyon/vc7.1/gui.rc
rename to examples/parallel_for/tachyon/msvs/gui.rc
diff --git a/examples/parallel_for/tachyon/vc7.1/resource.h b/examples/parallel_for/tachyon/msvs/resource.h
similarity index 100%
rename from examples/parallel_for/tachyon/vc7.1/resource.h
rename to examples/parallel_for/tachyon/msvs/resource.h
diff --git a/examples/parallel_for/seismic/vc8/small.ico b/examples/parallel_for/tachyon/msvs/small.ico
similarity index 100%
rename from examples/parallel_for/seismic/vc8/small.ico
rename to examples/parallel_for/tachyon/msvs/small.ico
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.icproj b/examples/parallel_for/tachyon/msvs/tachyon.icproj
new file mode 100644
index 0000000..4d021eb
--- /dev/null
+++ b/examples/parallel_for/tachyon/msvs/tachyon.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="tachyon.common"
+ ProjectGUID="{5F685DBD-9A04-4E94-A1CA-FC48FE799830}"
+ VCNestedProjectGUID="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
+ VCNestedProjectFileName="tachyon.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.serial.icproj b/examples/parallel_for/tachyon/msvs/tachyon.serial.icproj
new file mode 100644
index 0000000..c449959
--- /dev/null
+++ b/examples/parallel_for/tachyon/msvs/tachyon.serial.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="tachyon.serial"
+ ProjectGUID="{E085A8DB-75D4-4927-9631-6368E6D0EE72}"
+ VCNestedProjectGUID="{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}"
+ VCNestedProjectFileName="tachyon.serial.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.serial.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
similarity index 95%
rename from examples/parallel_for/tachyon/vc8/tachyon.serial.vcproj
rename to examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
index b59c8ba..9292a1b 100644
--- a/examples/parallel_for/tachyon/vc8/tachyon.serial.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
@@ -1,695 +1,695 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="tachyon.serial"
- ProjectGUID="{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}"
- RootNamespace="tachyon.serial"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- CopyLocal="false"
- CopyLocalDependencies="false"
- CopyLocalSatelliteAssemblies="false"
- RelativePathToProject=".\tachyon.vcproj"
- />
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.serial.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="tachyon.serial"
+ ProjectGUID="{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}"
+ RootNamespace="tachyon.serial"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ <ProjectReference
+ ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
+ CopyLocal="false"
+ CopyLocalDependencies="false"
+ CopyLocalSatelliteAssemblies="false"
+ RelativePathToProject=".\tachyon.vcproj"
+ />
+ </References>
+ <Files>
+ <File
+ RelativePath="..\src\trace.serial.cpp"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.tbb.icproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb.icproj
new file mode 100644
index 0000000..58ec5c6
--- /dev/null
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="tachyon.tbb"
+ ProjectGUID="{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}"
+ VCNestedProjectGUID="{6E9B1702-78E0-4D64-B771-8B274D963B58}"
+ VCNestedProjectFileName="tachyon.tbb.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.tbb.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
similarity index 82%
rename from examples/parallel_for/tachyon/vc8/tachyon.tbb.vcproj
rename to examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
index 7a5c4e4..99fb5ef 100644
--- a/examples/parallel_for/tachyon/vc8/tachyon.tbb.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
@@ -1,731 +1,731 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="tachyon.tbb"
- ProjectGUID="{6E9B1702-78E0-4D64-B771-8B274D963B58}"
- RootNamespace="tachyon.tbb"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- CopyLocal="false"
- CopyLocalDependencies="false"
- CopyLocalSatelliteAssemblies="false"
- RelativePathToProject=".\tachyon.vcproj"
- />
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.tbb.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="tachyon.tbb"
+ ProjectGUID="{6E9B1702-78E0-4D64-B771-8B274D963B58}"
+ RootNamespace="tachyon.tbb"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ <ProjectReference
+ ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
+ CopyLocal="false"
+ CopyLocalDependencies="false"
+ CopyLocalSatelliteAssemblies="false"
+ RelativePathToProject=".\tachyon.vcproj"
+ />
+ </References>
+ <Files>
+ <File
+ RelativePath="..\src\trace.tbb.cpp"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.icproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.icproj
new file mode 100644
index 0000000..1c0f608
--- /dev/null
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="tachyon.tbb1d"
+ ProjectGUID="{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}"
+ VCNestedProjectGUID="{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}"
+ VCNestedProjectFileName="tachyon.tbb1d.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.tbb1d.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
similarity index 82%
rename from examples/parallel_for/tachyon/vc8/tachyon.tbb1d.vcproj
rename to examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
index 2f7ede0..feac325 100644
--- a/examples/parallel_for/tachyon/vc8/tachyon.tbb1d.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
@@ -1,731 +1,731 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="tachyon.tbb1d"
- ProjectGUID="{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}"
- RootNamespace="tachyon.tbb1d"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc8\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc8\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- CopyLocal="false"
- CopyLocalDependencies="false"
- CopyLocalSatelliteAssemblies="false"
- RelativePathToProject=".\tachyon.vcproj"
- />
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.tbb1d.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="tachyon.tbb1d"
+ ProjectGUID="{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}"
+ RootNamespace="tachyon.tbb1d"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\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)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ 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"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ LinkTimeCodeGeneration="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ <ProjectReference
+ ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
+ CopyLocal="false"
+ CopyLocalDependencies="false"
+ CopyLocalSatelliteAssemblies="false"
+ RelativePathToProject=".\tachyon.vcproj"
+ />
+ </References>
+ <Files>
+ <File
+ RelativePath="..\src\trace.tbb1d.cpp"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.vcproj
similarity index 93%
rename from examples/parallel_for/tachyon/vc8/tachyon.vcproj
rename to examples/parallel_for/tachyon/msvs/tachyon.vcproj
index 5f48b4b..8ea73b2 100644
--- a/examples/parallel_for/tachyon/vc8/tachyon.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.vcproj
@@ -1,1042 +1,1050 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="tachyon.common"
- ProjectGUID="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- RootNamespace="tachyon.common"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\src\api.cpp"
- >
- </File>
- <File
- RelativePath="..\src\apigeom.cpp"
- >
- </File>
- <File
- RelativePath="..\src\apitrigeom.cpp"
- >
- </File>
- <File
- RelativePath="..\src\bndbox.cpp"
- >
- </File>
- <File
- RelativePath="..\src\box.cpp"
- >
- </File>
- <File
- RelativePath="..\src\camera.cpp"
- >
- </File>
- <File
- RelativePath="..\src\coordsys.cpp"
- >
- </File>
- <File
- RelativePath="..\src\cylinder.cpp"
- >
- </File>
- <File
- RelativePath="..\src\extvol.cpp"
- >
- </File>
- <File
- RelativePath="..\src\getargs.cpp"
- >
- </File>
- <File
- RelativePath="..\src\global.cpp"
- >
- </File>
- <File
- RelativePath="..\src\grid.cpp"
- >
- </File>
- <File
- RelativePath="..\src\imageio.cpp"
- >
- </File>
- <File
- RelativePath="..\src\imap.cpp"
- >
- </File>
- <File
- RelativePath="..\src\intersect.cpp"
- >
- </File>
- <File
- RelativePath="..\src\jpeg.cpp"
- >
- </File>
- <File
- RelativePath="..\src\light.cpp"
- >
- </File>
- <File
- RelativePath="..\src\objbound.cpp"
- >
- </File>
- <File
- RelativePath="..\src\parse.cpp"
- >
- </File>
- <File
- RelativePath="..\src\plane.cpp"
- >
- </File>
- <File
- RelativePath="..\src\ppm.cpp"
- >
- </File>
- <File
- RelativePath="..\src\pthread.cpp"
- >
- </File>
- <File
- RelativePath="..\src\quadric.cpp"
- >
- </File>
- <File
- RelativePath="..\src\render.cpp"
- >
- </File>
- <File
- RelativePath="..\src\ring.cpp"
- >
- </File>
- <File
- RelativePath="..\src\shade.cpp"
- >
- </File>
- <File
- RelativePath="..\src\sphere.cpp"
- >
- </File>
- <File
- RelativePath="..\src\texture.cpp"
- >
- </File>
- <File
- RelativePath="..\src\tgafile.cpp"
- >
- </File>
- <File
- RelativePath="..\src\trace_rest.cpp"
- >
- </File>
- <File
- RelativePath="..\src\triangle.cpp"
- >
- </File>
- <File
- RelativePath="..\src\ui.cpp"
- >
- </File>
- <File
- RelativePath="..\src\util.cpp"
- >
- </File>
- <File
- RelativePath="..\src\vector.cpp"
- >
- </File>
- <File
- RelativePath="..\src\video.cpp"
- >
- </File>
- <File
- RelativePath="..\src\vol.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\src\api.h"
- >
- </File>
- <File
- RelativePath="..\src\apitrigeom.h"
- >
- </File>
- <File
- RelativePath="..\src\bndbox.h"
- >
- </File>
- <File
- RelativePath="..\src\box.h"
- >
- </File>
- <File
- RelativePath="..\src\camera.h"
- >
- </File>
- <File
- RelativePath="..\src\coordsys.h"
- >
- </File>
- <File
- RelativePath="..\src\cylinder.h"
- >
- </File>
- <File
- RelativePath="..\src\extvol.h"
- >
- </File>
- <File
- RelativePath="..\src\getargs.h"
- >
- </File>
- <File
- RelativePath="..\src\global.h"
- >
- </File>
- <File
- RelativePath="..\src\grid.h"
- >
- </File>
- <File
- RelativePath="..\src\imageio.h"
- >
- </File>
- <File
- RelativePath="..\src\imap.h"
- >
- </File>
- <File
- RelativePath="..\src\intersect.h"
- >
- </File>
- <File
- RelativePath="..\src\jpeg.h"
- >
- </File>
- <File
- RelativePath="..\src\light.h"
- >
- </File>
- <File
- RelativePath="..\src\machine.h"
- >
- </File>
- <File
- RelativePath="..\src\macros.h"
- >
- </File>
- <File
- RelativePath="..\src\objbound.h"
- >
- </File>
- <File
- RelativePath="..\src\parse.h"
- >
- </File>
- <File
- RelativePath="..\src\plane.h"
- >
- </File>
- <File
- RelativePath="..\src\ppm.h"
- >
- </File>
- <File
- RelativePath="..\src\pthread.h"
- >
- </File>
- <File
- RelativePath="..\src\quadric.h"
- >
- </File>
- <File
- RelativePath="..\src\render.h"
- >
- </File>
- <File
- RelativePath="..\vc7.1\resource.h"
- >
- </File>
- <File
- RelativePath="..\src\ring.h"
- >
- </File>
- <File
- RelativePath="..\src\shade.h"
- >
- </File>
- <File
- RelativePath="..\src\sphere.h"
- >
- </File>
- <File
- RelativePath="..\src\texture.h"
- >
- </File>
- <File
- RelativePath="..\src\tgafile.h"
- >
- </File>
- <File
- RelativePath="..\src\trace.h"
- >
- </File>
- <File
- RelativePath="..\src\triangle.h"
- >
- </File>
- <File
- RelativePath="..\src\types.h"
- >
- </File>
- <File
- RelativePath="..\src\ui.h"
- >
- </File>
- <File
- RelativePath="..\src\util.h"
- >
- </File>
- <File
- RelativePath="..\src\vector.h"
- >
- </File>
- <File
- RelativePath="..\src\video.h"
- >
- </File>
- <File
- RelativePath="..\src\vol.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath="..\vc7.1\gui.ico"
- >
- </File>
- <File
- RelativePath="..\vc7.1\gui.rc"
- >
- </File>
- <File
- RelativePath="..\vc7.1\small.ico"
- >
- </File>
- </Filter>
- <Filter
- Name="Video Layer"
- >
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="tachyon.common"
+ ProjectGUID="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
+ RootNamespace="tachyon.common"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X64"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X64"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X64"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DD Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="..\..\..\common\gui\dxcheck.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ FavorSizeOrSpeed="1"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="2"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X64"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\src\api.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\apigeom.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\apitrigeom.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\bndbox.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\box.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\camera.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\coordsys.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\cylinder.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\extvol.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\getargs.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\global.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\grid.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\imageio.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\imap.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\intersect.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\jpeg.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\light.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\objbound.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\parse.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\plane.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ppm.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pthread.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\quadric.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\render.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ring.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\shade.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\sphere.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\texture.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\tgafile.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\trace_rest.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\triangle.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ui.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\util.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vector.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\video.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vol.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\src\api.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\apitrigeom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\bndbox.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\box.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\camera.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\coordsys.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\cylinder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\extvol.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\getargs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\global.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\grid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\imageio.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\imap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\intersect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\jpeg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\light.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\machine.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\macros.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\objbound.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\parse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\plane.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ppm.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\quadric.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\render.h"
+ >
+ </File>
+ <File
+ RelativePath="..\msvs\resource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ring.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\shade.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\sphere.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\texture.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\tgafile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\trace.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\triangle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\types.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ui.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\util.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\video.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vol.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\msvs\gui.ico"
+ >
+ </File>
+ <File
+ RelativePath="..\msvs\gui.rc"
+ >
+ </File>
+ <File
+ RelativePath="..\msvs\small.ico"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Video Layer"
+ >
+ <File
+ RelativePath="..\..\..\common\gui\ddvideo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
+ PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
+ PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
+ PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
+ PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\gdivideo.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Release|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DD Debug|x64"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\video.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\gui\winvideo.h"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.sln b/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
similarity index 98%
copy from examples/parallel_for/tachyon/vc8/tachyon.sln
copy to examples/parallel_for/tachyon/msvs/tachyon_cl.sln
index 6cf6081..f298725 100644
--- a/examples/parallel_for/tachyon/vc8/tachyon.sln
+++ b/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
@@ -1,92 +1,92 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-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
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- 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
- 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}.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-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-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
- {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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "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
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ 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
+ 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}.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-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-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
+ {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
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.sln b/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
similarity index 50%
rename from examples/parallel_for/tachyon/vc8/tachyon.sln
rename to examples/parallel_for/tachyon/msvs/tachyon_icl.sln
index 6cf6081..76e3a54 100644
--- a/examples/parallel_for/tachyon/vc8/tachyon.sln
+++ b/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
@@ -1,92 +1,156 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-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
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- 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
- 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}.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-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-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
- {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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "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}"
+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}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DD Debug|Win32 = DD Debug|Win32
+ DD Debug|x64 = DD Debug|x64
+ DD Release|Win32 = DD Release|Win32
+ DD Release|x64 = DD Release|x64
+ GDI Debug|Win32 = GDI Debug|Win32
+ GDI Debug|x64 = GDI Debug|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
+ {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
+ {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
+ {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
+ {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-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-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
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/tachyon/vc7.1/small.ico b/examples/parallel_for/tachyon/vc7.1/small.ico
deleted file mode 100644
index d551aa3..0000000
Binary files a/examples/parallel_for/tachyon/vc7.1/small.ico and /dev/null differ
diff --git a/examples/parallel_for/tachyon/vc7.1/tachyon.serial.vcproj b/examples/parallel_for/tachyon/vc7.1/tachyon.serial.vcproj
deleted file mode 100644
index 9e9b7d6..0000000
--- a/examples/parallel_for/tachyon/vc7.1/tachyon.serial.vcproj
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="tachyon.serial"
- ProjectGUID="{1D7176EE-63B6-48F2-AB83-FFAD2048C25D}"
- RootNamespace="tachyon.serial"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{1D7176EE-63B6-48F2-AB83-FFAD2149C25E}"
- Name="tachyon.common"/>
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.serial.cpp">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc7.1/tachyon.sln b/examples/parallel_for/tachyon/vc7.1/tachyon.sln
deleted file mode 100644
index 0dc481b..0000000
--- a/examples/parallel_for/tachyon/vc7.1/tachyon.sln
+++ /dev/null
@@ -1,63 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.common", "tachyon.vcproj", "{1D7176EE-63B6-48F2-AB83-FFAD2149C25E}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.serial", "tachyon.serial.vcproj", "{1D7176EE-63B6-48F2-AB83-FFAD2048C25D}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb1d", "tachyon.tbb1d.vcproj", "{1D7176EE-63B6-48F2-AB83-FFAD2348C25D}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb", "tachyon.tbb.vcproj", "{1D7176EE-63B6-48F2-AB83-FFAD2448C25D}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- DD Debug = DD Debug
- DD Release = DD Release
- GDI Debug = GDI Debug
- GDI Release = GDI Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.DD Debug.ActiveCfg = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.DD Debug.Build.0 = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.DD Release.ActiveCfg = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.DD Release.Build.0 = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.GDI Debug.ActiveCfg = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.GDI Debug.Build.0 = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.GDI Release.ActiveCfg = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2149C25E}.GDI Release.Build.0 = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.DD Debug.ActiveCfg = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.DD Debug.Build.0 = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.DD Release.ActiveCfg = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.DD Release.Build.0 = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.GDI Debug.ActiveCfg = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.GDI Debug.Build.0 = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.GDI Release.ActiveCfg = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2048C25D}.GDI Release.Build.0 = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.DD Debug.ActiveCfg = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.DD Debug.Build.0 = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.DD Release.ActiveCfg = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.DD Release.Build.0 = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.GDI Debug.ActiveCfg = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.GDI Debug.Build.0 = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.GDI Release.ActiveCfg = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2348C25D}.GDI Release.Build.0 = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.DD Debug.ActiveCfg = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.DD Debug.Build.0 = DD Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.DD Release.ActiveCfg = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.DD Release.Build.0 = DD Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.GDI Debug.ActiveCfg = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.GDI Debug.Build.0 = Debug|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.GDI Release.ActiveCfg = Release|Win32
- {1D7176EE-63B6-48F2-AB83-FFAD2448C25D}.GDI Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_for/tachyon/vc7.1/tachyon.suo b/examples/parallel_for/tachyon/vc7.1/tachyon.suo
deleted file mode 100644
index ddc558f..0000000
Binary files a/examples/parallel_for/tachyon/vc7.1/tachyon.suo and /dev/null differ
diff --git a/examples/parallel_for/tachyon/vc7.1/tachyon.tbb.vcproj b/examples/parallel_for/tachyon/vc7.1/tachyon.tbb.vcproj
deleted file mode 100644
index 6afd836..0000000
--- a/examples/parallel_for/tachyon/vc7.1/tachyon.tbb.vcproj
+++ /dev/null
@@ -1,259 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="tachyon.tbb"
- ProjectGUID="{1D7176EE-63B6-48F2-AB83-FFAD2448C25D}"
- RootNamespace="tachyon.tbb"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{1D7176EE-63B6-48F2-AB83-FFAD2149C25E}"
- Name="tachyon.common"/>
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.tbb.cpp">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc7.1/tachyon.tbb1d.vcproj b/examples/parallel_for/tachyon/vc7.1/tachyon.tbb1d.vcproj
deleted file mode 100644
index c342be1..0000000
--- a/examples/parallel_for/tachyon/vc7.1/tachyon.tbb1d.vcproj
+++ /dev/null
@@ -1,259 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="tachyon.tbb1d"
- ProjectGUID="{1D7176EE-63B6-48F2-AB83-FFAD2348C25D}"
- RootNamespace="tachyon.tbb1d"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- SubSystem="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- SubSystem="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)/$(InputName).pdb"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)/tachyon.common.lib tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
- SubSystem="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{1D7176EE-63B6-48F2-AB83-FFAD2149C25E}"
- Name="tachyon.common"/>
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.tbb1d.cpp">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc7.1/tachyon.vcproj b/examples/parallel_for/tachyon/vc7.1/tachyon.vcproj
deleted file mode 100644
index 28d5bc1..0000000
--- a/examples/parallel_for/tachyon/vc7.1/tachyon.vcproj
+++ /dev/null
@@ -1,494 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="tachyon.common"
- ProjectGUID="{1D7176EE-63B6-48F2-AB83-FFAD2149C25E}"
- RootNamespace="tachyon.common"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- AdditionalOptions="/LTCG"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- AdditionalOptions="/LTCG"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- AdditionalOptions="/LTCG"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="TRUE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="TRUE"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="TRUE"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- AdditionalOptions="/LTCG"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\src\api.cpp">
- </File>
- <File
- RelativePath="..\src\apigeom.cpp">
- </File>
- <File
- RelativePath="..\src\apitrigeom.cpp">
- </File>
- <File
- RelativePath="..\src\bndbox.cpp">
- </File>
- <File
- RelativePath="..\src\box.cpp">
- </File>
- <File
- RelativePath="..\src\camera.cpp">
- </File>
- <File
- RelativePath="..\src\coordsys.cpp">
- </File>
- <File
- RelativePath="..\src\cylinder.cpp">
- </File>
- <File
- RelativePath="..\src\extvol.cpp">
- </File>
- <File
- RelativePath="..\src\getargs.cpp">
- </File>
- <File
- RelativePath="..\src\global.cpp">
- </File>
- <File
- RelativePath="..\src\grid.cpp">
- </File>
- <File
- RelativePath="..\src\imageio.cpp">
- </File>
- <File
- RelativePath="..\src\imap.cpp">
- </File>
- <File
- RelativePath="..\src\intersect.cpp">
- </File>
- <File
- RelativePath="..\src\jpeg.cpp">
- </File>
- <File
- RelativePath="..\src\light.cpp">
- </File>
- <File
- RelativePath="..\src\objbound.cpp">
- </File>
- <File
- RelativePath="..\src\parse.cpp">
- </File>
- <File
- RelativePath="..\src\plane.cpp">
- </File>
- <File
- RelativePath="..\src\ppm.cpp">
- </File>
- <File
- RelativePath="..\src\pthread.cpp">
- </File>
- <File
- RelativePath="..\src\quadric.cpp">
- </File>
- <File
- RelativePath="..\src\render.cpp">
- </File>
- <File
- RelativePath="..\src\ring.cpp">
- </File>
- <File
- RelativePath="..\src\shade.cpp">
- </File>
- <File
- RelativePath="..\src\sphere.cpp">
- </File>
- <File
- RelativePath="..\src\texture.cpp">
- </File>
- <File
- RelativePath="..\src\tgafile.cpp">
- </File>
- <File
- RelativePath="..\src\trace_rest.cpp">
- </File>
- <File
- RelativePath="..\src\triangle.cpp">
- </File>
- <File
- RelativePath="..\src\ui.cpp">
- </File>
- <File
- RelativePath="..\src\util.cpp">
- </File>
- <File
- RelativePath="..\src\vector.cpp">
- </File>
- <File
- RelativePath="..\src\video.cpp">
- </File>
- <File
- RelativePath="..\src\vol.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath="..\src\api.h">
- </File>
- <File
- RelativePath="..\src\apitrigeom.h">
- </File>
- <File
- RelativePath="..\src\bndbox.h">
- </File>
- <File
- RelativePath="..\src\box.h">
- </File>
- <File
- RelativePath="..\src\camera.h">
- </File>
- <File
- RelativePath="..\src\coordsys.h">
- </File>
- <File
- RelativePath="..\src\cylinder.h">
- </File>
- <File
- RelativePath="..\src\extvol.h">
- </File>
- <File
- RelativePath="..\src\getargs.h">
- </File>
- <File
- RelativePath="..\src\global.h">
- </File>
- <File
- RelativePath="..\src\grid.h">
- </File>
- <File
- RelativePath="..\src\imageio.h">
- </File>
- <File
- RelativePath="..\src\imap.h">
- </File>
- <File
- RelativePath="..\src\intersect.h">
- </File>
- <File
- RelativePath="..\src\jpeg.h">
- </File>
- <File
- RelativePath="..\src\light.h">
- </File>
- <File
- RelativePath="..\src\machine.h">
- </File>
- <File
- RelativePath="..\src\macros.h">
- </File>
- <File
- RelativePath="..\src\objbound.h">
- </File>
- <File
- RelativePath="..\src\parse.h">
- </File>
- <File
- RelativePath="..\src\plane.h">
- </File>
- <File
- RelativePath="..\src\ppm.h">
- </File>
- <File
- RelativePath="..\src\pthread.h">
- </File>
- <File
- RelativePath="..\src\quadric.h">
- </File>
- <File
- RelativePath="..\src\render.h">
- </File>
- <File
- RelativePath=".\resource.h">
- </File>
- <File
- RelativePath="..\src\ring.h">
- </File>
- <File
- RelativePath="..\src\shade.h">
- </File>
- <File
- RelativePath="..\src\sphere.h">
- </File>
- <File
- RelativePath="..\src\texture.h">
- </File>
- <File
- RelativePath="..\src\tgafile.h">
- </File>
- <File
- RelativePath="..\src\trace.h">
- </File>
- <File
- RelativePath="..\src\triangle.h">
- </File>
- <File
- RelativePath="..\src\types.h">
- </File>
- <File
- RelativePath="..\src\ui.h">
- </File>
- <File
- RelativePath="..\src\util.h">
- </File>
- <File
- RelativePath="..\src\vector.h">
- </File>
- <File
- RelativePath="..\src\video.h">
- </File>
- <File
- RelativePath="..\src\vol.h">
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- <File
- RelativePath=".\gui.ico">
- </File>
- <File
- RelativePath=".\gui.rc">
- </File>
- <File
- RelativePath=".\small.ico">
- </File>
- </Filter>
- <Filter
- Name="Video Layer"
- Filter="">
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp">
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp">
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h">
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc8/tachyon.suo b/examples/parallel_for/tachyon/vc8/tachyon.suo
deleted file mode 100644
index 2171ff9..0000000
Binary files a/examples/parallel_for/tachyon/vc8/tachyon.suo and /dev/null differ
diff --git a/examples/parallel_for/tachyon/vc9/tachyon.serial.vcproj b/examples/parallel_for/tachyon/vc9/tachyon.serial.vcproj
deleted file mode 100644
index 81b5843..0000000
--- a/examples/parallel_for/tachyon/vc9/tachyon.serial.vcproj
+++ /dev/null
@@ -1,687 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tachyon.serial"
- ProjectGUID="{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}"
- RootNamespace="tachyon.serial"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- CopyLocal="false"
- CopyLocalDependencies="false"
- CopyLocalSatelliteAssemblies="false"
- />
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.serial.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc9/tachyon.sln b/examples/parallel_for/tachyon/vc9/tachyon.sln
deleted file mode 100644
index 1b379e3..0000000
--- a/examples/parallel_for/tachyon/vc9/tachyon.sln
+++ /dev/null
@@ -1,92 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-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
- DD Debug|x64 = DD Debug|x64
- DD Release|Win32 = DD Release|Win32
- 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
- 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}.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-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-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
- {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
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_for/tachyon/vc9/tachyon.suo b/examples/parallel_for/tachyon/vc9/tachyon.suo
deleted file mode 100644
index 866286b..0000000
Binary files a/examples/parallel_for/tachyon/vc9/tachyon.suo and /dev/null differ
diff --git a/examples/parallel_for/tachyon/vc9/tachyon.tbb.vcproj b/examples/parallel_for/tachyon/vc9/tachyon.tbb.vcproj
deleted file mode 100644
index a42ddfb..0000000
--- a/examples/parallel_for/tachyon/vc9/tachyon.tbb.vcproj
+++ /dev/null
@@ -1,723 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tachyon.tbb"
- ProjectGUID="{6E9B1702-78E0-4D64-B771-8B274D963B58}"
- RootNamespace="tachyon.tbb"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- CopyLocal="false"
- CopyLocalDependencies="false"
- CopyLocalSatelliteAssemblies="false"
- />
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.tbb.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc9/tachyon.tbb1d.vcproj b/examples/parallel_for/tachyon/vc9/tachyon.tbb1d.vcproj
deleted file mode 100644
index 125feee..0000000
--- a/examples/parallel_for/tachyon/vc9/tachyon.tbb1d.vcproj
+++ /dev/null
@@ -1,723 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tachyon.tbb1d"
- ProjectGUID="{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}"
- RootNamespace="tachyon.tbb1d"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb""$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\ia32\vc9\lib";"$(DXSDK_DIR)\lib\x86""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- EnableIntrinsicFunctions="true"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- ProgramDataBaseFileName="$(IntDir)\$(InputName).pdb"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""$(TBB22_INSTALL_DIR)\intel64\vc9\lib";"$(DXSDK_DIR)\lib\x64""
- GenerateDebugInformation="true"
- SubSystem="2"
- LinkTimeCodeGeneration="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- <ProjectReference
- ReferencedProjectIdentifier="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- CopyLocal="false"
- CopyLocalDependencies="false"
- CopyLocalSatelliteAssemblies="false"
- />
- </References>
- <Files>
- <File
- RelativePath="..\src\trace.tbb1d.cpp"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_for/tachyon/vc9/tachyon.vcproj b/examples/parallel_for/tachyon/vc9/tachyon.vcproj
deleted file mode 100644
index 249b8ce..0000000
--- a/examples/parallel_for/tachyon/vc9/tachyon.vcproj
+++ /dev/null
@@ -1,1039 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tachyon.common"
- ProjectGUID="{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
- RootNamespace="tachyon.common"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="2"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="..\..\..\common\gui\dxcheck.bat"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- FavorSizeOrSpeed="1"
- OmitFramePointers="true"
- WholeProgramOptimization="true"
- PreprocessorDefinitions="DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="2"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\src\api.cpp"
- >
- </File>
- <File
- RelativePath="..\src\apigeom.cpp"
- >
- </File>
- <File
- RelativePath="..\src\apitrigeom.cpp"
- >
- </File>
- <File
- RelativePath="..\src\bndbox.cpp"
- >
- </File>
- <File
- RelativePath="..\src\box.cpp"
- >
- </File>
- <File
- RelativePath="..\src\camera.cpp"
- >
- </File>
- <File
- RelativePath="..\src\coordsys.cpp"
- >
- </File>
- <File
- RelativePath="..\src\cylinder.cpp"
- >
- </File>
- <File
- RelativePath="..\src\extvol.cpp"
- >
- </File>
- <File
- RelativePath="..\src\getargs.cpp"
- >
- </File>
- <File
- RelativePath="..\src\global.cpp"
- >
- </File>
- <File
- RelativePath="..\src\grid.cpp"
- >
- </File>
- <File
- RelativePath="..\src\imageio.cpp"
- >
- </File>
- <File
- RelativePath="..\src\imap.cpp"
- >
- </File>
- <File
- RelativePath="..\src\intersect.cpp"
- >
- </File>
- <File
- RelativePath="..\src\jpeg.cpp"
- >
- </File>
- <File
- RelativePath="..\src\light.cpp"
- >
- </File>
- <File
- RelativePath="..\src\objbound.cpp"
- >
- </File>
- <File
- RelativePath="..\src\parse.cpp"
- >
- </File>
- <File
- RelativePath="..\src\plane.cpp"
- >
- </File>
- <File
- RelativePath="..\src\ppm.cpp"
- >
- </File>
- <File
- RelativePath="..\src\pthread.cpp"
- >
- </File>
- <File
- RelativePath="..\src\quadric.cpp"
- >
- </File>
- <File
- RelativePath="..\src\render.cpp"
- >
- </File>
- <File
- RelativePath="..\src\ring.cpp"
- >
- </File>
- <File
- RelativePath="..\src\shade.cpp"
- >
- </File>
- <File
- RelativePath="..\src\sphere.cpp"
- >
- </File>
- <File
- RelativePath="..\src\texture.cpp"
- >
- </File>
- <File
- RelativePath="..\src\tgafile.cpp"
- >
- </File>
- <File
- RelativePath="..\src\trace_rest.cpp"
- >
- </File>
- <File
- RelativePath="..\src\triangle.cpp"
- >
- </File>
- <File
- RelativePath="..\src\ui.cpp"
- >
- </File>
- <File
- RelativePath="..\src\util.cpp"
- >
- </File>
- <File
- RelativePath="..\src\vector.cpp"
- >
- </File>
- <File
- RelativePath="..\src\video.cpp"
- >
- </File>
- <File
- RelativePath="..\src\vol.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\src\api.h"
- >
- </File>
- <File
- RelativePath="..\src\apitrigeom.h"
- >
- </File>
- <File
- RelativePath="..\src\bndbox.h"
- >
- </File>
- <File
- RelativePath="..\src\box.h"
- >
- </File>
- <File
- RelativePath="..\src\camera.h"
- >
- </File>
- <File
- RelativePath="..\src\coordsys.h"
- >
- </File>
- <File
- RelativePath="..\src\cylinder.h"
- >
- </File>
- <File
- RelativePath="..\src\extvol.h"
- >
- </File>
- <File
- RelativePath="..\src\getargs.h"
- >
- </File>
- <File
- RelativePath="..\src\global.h"
- >
- </File>
- <File
- RelativePath="..\src\grid.h"
- >
- </File>
- <File
- RelativePath="..\src\imageio.h"
- >
- </File>
- <File
- RelativePath="..\src\imap.h"
- >
- </File>
- <File
- RelativePath="..\src\intersect.h"
- >
- </File>
- <File
- RelativePath="..\src\jpeg.h"
- >
- </File>
- <File
- RelativePath="..\src\light.h"
- >
- </File>
- <File
- RelativePath="..\src\machine.h"
- >
- </File>
- <File
- RelativePath="..\src\macros.h"
- >
- </File>
- <File
- RelativePath="..\src\objbound.h"
- >
- </File>
- <File
- RelativePath="..\src\parse.h"
- >
- </File>
- <File
- RelativePath="..\src\plane.h"
- >
- </File>
- <File
- RelativePath="..\src\ppm.h"
- >
- </File>
- <File
- RelativePath="..\src\pthread.h"
- >
- </File>
- <File
- RelativePath="..\src\quadric.h"
- >
- </File>
- <File
- RelativePath="..\src\render.h"
- >
- </File>
- <File
- RelativePath="..\vc7.1\resource.h"
- >
- </File>
- <File
- RelativePath="..\src\ring.h"
- >
- </File>
- <File
- RelativePath="..\src\shade.h"
- >
- </File>
- <File
- RelativePath="..\src\sphere.h"
- >
- </File>
- <File
- RelativePath="..\src\texture.h"
- >
- </File>
- <File
- RelativePath="..\src\tgafile.h"
- >
- </File>
- <File
- RelativePath="..\src\trace.h"
- >
- </File>
- <File
- RelativePath="..\src\triangle.h"
- >
- </File>
- <File
- RelativePath="..\src\types.h"
- >
- </File>
- <File
- RelativePath="..\src\ui.h"
- >
- </File>
- <File
- RelativePath="..\src\util.h"
- >
- </File>
- <File
- RelativePath="..\src\vector.h"
- >
- </File>
- <File
- RelativePath="..\src\video.h"
- >
- </File>
- <File
- RelativePath="..\src\vol.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath="..\vc7.1\gui.ico"
- >
- </File>
- <File
- RelativePath="..\vc7.1\gui.rc"
- >
- </File>
- <File
- RelativePath="..\vc7.1\small.ico"
- >
- </File>
- </Filter>
- <Filter
- Name="Video Layer"
- >
- <File
- RelativePath="..\..\..\common\gui\ddvideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(DXSDK_DIR)\include"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\gdivideo.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;_DEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="_WINDOWS;NDEBUG;$(NOINHERIT)"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Release|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="DD Debug|x64"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\..\common\gui\video.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\gui\winvideo.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/Makefile b/examples/parallel_reduce/convex_hull/Makefile
index fa32a79..5a13928 100644
--- a/examples/parallel_reduce/convex_hull/Makefile
+++ b/examples/parallel_reduce/convex_hull/Makefile
@@ -29,7 +29,9 @@ PROG=convex_hull_bench
ARGS=
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/parallel_reduce/convex_hull/Makefile.windows b/examples/parallel_reduce/convex_hull/Makefile.windows
index 3d75fef..1ee01d1 100644
--- a/examples/parallel_reduce/convex_hull/Makefile.windows
+++ b/examples/parallel_reduce/convex_hull/Makefile.windows
@@ -28,19 +28,26 @@
PROG=convex_hull_bench
ARGS=
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) convex_hull_sample.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:convex_hull_sample.exe
$(CXX) convex_hull_bench.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:convex_hull_bench.exe
-debug:
+debug: compiler_check
$(CXX) convex_hull_sample.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:convex_hull_sample.exe
$(CXX) convex_hull_bench.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:convex_hull_bench.exe
clean:
@cmd.exe /C del convex_hull*.exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
index 359910a..aeaf7f0 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
@@ -100,6 +100,8 @@ public:
: points(points_), exType(exType_), extrXPoint(points[0]) {}
FindXExtremum(const FindXExtremum& fxex, tbb::split)
+ // Can run in parallel with fxex.operator()() or fxex.join().
+ // The data race reported by tools is harmless.
: points(fxex.points), exType(fxex.exType), extrXPoint(fxex.extrXPoint) {}
void operator()(const range_t& range) {
diff --git a/examples/parallel_reduce/convex_hull/index.html b/examples/parallel_reduce/convex_hull/index.html
index d3ee284..946c2e1 100644
--- a/examples/parallel_reduce/convex_hull/index.html
+++ b/examples/parallel_reduce/convex_hull/index.html
@@ -18,12 +18,8 @@ Parallel version of convex hull algorithm (quick hull).
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.icproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.icproj
new file mode 100644
index 0000000..6667cee
--- /dev/null
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="convex_hull_benchmark"
+ ProjectGUID="{347CD752-84DD-4E7C-9DB3-90B740C03E8E}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+ VCNestedProjectFileName="convex_hull_benchmark.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc8/convex_hull_benchmark.vcproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
similarity index 81%
rename from examples/parallel_reduce/convex_hull/vc8/convex_hull_benchmark.vcproj
rename to examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
index 9ae029b..3f43cd2 100644
--- a/examples/parallel_reduce/convex_hull/vc8/convex_hull_benchmark.vcproj
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
@@ -1,366 +1,366 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="convex_hull_benchmark"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
- RootNamespace="convex_hull_benchmark"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\convex_hull_bench.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header files"
- >
- <File
- RelativePath="..\convex_hull.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="convex_hull_benchmark"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+ RootNamespace="convex_hull_benchmark"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\convex_hull_bench.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header files"
+ >
+ <File
+ RelativePath="..\convex_hull.h"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc8/convex_hull.sln b/examples/parallel_reduce/convex_hull/msvs/convex_hull_cl.sln
similarity index 98%
copy from examples/parallel_reduce/convex_hull/vc8/convex_hull.sln
copy to examples/parallel_reduce/convex_hull/msvs/convex_hull_cl.sln
index e567081..8dbd651 100644
--- a/examples/parallel_reduce/convex_hull/vc8/convex_hull.sln
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_cl.sln
@@ -1,35 +1,35 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_benchmark", "convex_hull_benchmark.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_sample", "convex_hull_sample.vcproj", "{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
-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
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.ActiveCfg = Debug|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.Build.0 = Debug|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.ActiveCfg = Debug|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.Build.0 = Debug|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.ActiveCfg = Release|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.Build.0 = Release|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.ActiveCfg = Release|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_benchmark", "convex_hull_benchmark.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_sample", "convex_hull_sample.vcproj", "{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
+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
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.Build.0 = Debug|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.ActiveCfg = Debug|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.Build.0 = Debug|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.ActiveCfg = Release|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.Build.0 = Release|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.ActiveCfg = Release|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_reduce/convex_hull/vc8/convex_hull.sln b/examples/parallel_reduce/convex_hull/msvs/convex_hull_icl.sln
similarity index 52%
rename from examples/parallel_reduce/convex_hull/vc8/convex_hull.sln
rename to examples/parallel_reduce/convex_hull/msvs/convex_hull_icl.sln
index e567081..7d1545f 100644
--- a/examples/parallel_reduce/convex_hull/vc8/convex_hull.sln
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_icl.sln
@@ -1,35 +1,51 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_benchmark", "convex_hull_benchmark.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_sample", "convex_hull_sample.vcproj", "{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
-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
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.ActiveCfg = Debug|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.Build.0 = Debug|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.ActiveCfg = Debug|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.Build.0 = Debug|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.ActiveCfg = Release|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.Build.0 = Release|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.ActiveCfg = Release|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "convex_hull_benchmark", "convex_hull_benchmark.icproj", "{347CD752-84DD-4E7C-9DB3-90B740C03E8E}"
+EndProject
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "convex_hull_sample", "convex_hull_sample.icproj", "{B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}"
+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
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Debug|Win32.Build.0 = Debug|Win32
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Debug|x64.ActiveCfg = Debug|x64
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Debug|x64.Build.0 = Debug|x64
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Release|Win32.ActiveCfg = Release|Win32
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Release|Win32.Build.0 = Release|Win32
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Release|x64.ActiveCfg = Release|x64
+ {347CD752-84DD-4E7C-9DB3-90B740C03E8E}.Release|x64.Build.0 = Release|x64
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Debug|Win32.Build.0 = Debug|Win32
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Debug|x64.ActiveCfg = Debug|x64
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Debug|x64.Build.0 = Debug|x64
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Release|Win32.ActiveCfg = Release|Win32
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Release|Win32.Build.0 = Release|Win32
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.Release|x64.ActiveCfg = Release|x64
+ {B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}.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
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.Build.0 = Release|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.ActiveCfg = Release|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.Build.0 = Release|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.ActiveCfg = Release|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.Build.0 = Debug|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.ActiveCfg = Debug|x64
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.Build.0 = Debug|Win32
+ {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.icproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.icproj
new file mode 100644
index 0000000..b6926c0
--- /dev/null
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="convex_hull_sample"
+ ProjectGUID="{B83E81E3-9EB0-4C22-B6CF-F2329A496EDA}"
+ VCNestedProjectGUID="{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
+ VCNestedProjectFileName="convex_hull_sample.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc8/convex_hull_sample.vcproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
similarity index 81%
rename from examples/parallel_reduce/convex_hull/vc8/convex_hull_sample.vcproj
rename to examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
index df911b4..160cece 100644
--- a/examples/parallel_reduce/convex_hull/vc8/convex_hull_sample.vcproj
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
@@ -1,364 +1,364 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="convex_hull_sample"
- ProjectGUID="{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
- RootNamespace="convex_hull_sample"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\convex_hull_sample.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\convex_hull.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="convex_hull_sample"
+ ProjectGUID="{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
+ RootNamespace="convex_hull_sample"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\convex_hull_sample.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\convex_hull.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull.sln b/examples/parallel_reduce/convex_hull/vc7.1/convex_hull.sln
deleted file mode 100644
index 429292e..0000000
--- a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull.sln
+++ /dev/null
@@ -1,32 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_bench", "convex_hull_bench.vcproj", "{6DF21C04-95F4-4FF0-89F3-3688888E10D5}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_sample", "convex_hull_sample.vcproj", "{B4A47D64-981B-4167-AE3D-CDAA8E18D2B3}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {6DF21C04-95F4-4FF0-89F3-3688888E10D5}.Debug.ActiveCfg = Debug|Win32
- {6DF21C04-95F4-4FF0-89F3-3688888E10D5}.Debug.Build.0 = Debug|Win32
- {6DF21C04-95F4-4FF0-89F3-3688888E10D5}.Release.ActiveCfg = Release|Win32
- {6DF21C04-95F4-4FF0-89F3-3688888E10D5}.Release.Build.0 = Release|Win32
- {B4A47D64-981B-4167-AE3D-CDAA8E18D2B3}.Debug.ActiveCfg = Debug|Win32
- {B4A47D64-981B-4167-AE3D-CDAA8E18D2B3}.Debug.Build.0 = Debug|Win32
- {B4A47D64-981B-4167-AE3D-CDAA8E18D2B3}.Release.ActiveCfg = Release|Win32
- {B4A47D64-981B-4167-AE3D-CDAA8E18D2B3}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionItems) = postSolution
- ..\index.html = ..\index.html
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull.suo b/examples/parallel_reduce/convex_hull/vc7.1/convex_hull.suo
deleted file mode 100644
index 601009e..0000000
Binary files a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull.suo and /dev/null differ
diff --git a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull_bench.vcproj b/examples/parallel_reduce/convex_hull/vc7.1/convex_hull_bench.vcproj
deleted file mode 100644
index c9f8f34..0000000
--- a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull_bench.vcproj
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="convex_hull_bench"
- ProjectGUID="{6DF21C04-95F4-4FF0-89F3-3688888E10D5}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\convex_hull_bench.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath="..\convex_hull.h">
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull_sample.vcproj b/examples/parallel_reduce/convex_hull/vc7.1/convex_hull_sample.vcproj
deleted file mode 100644
index 6206b05..0000000
--- a/examples/parallel_reduce/convex_hull/vc7.1/convex_hull_sample.vcproj
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="convex_hull_sample"
- ProjectGUID="{B4A47D64-981B-4167-AE3D-CDAA8E18D2B3}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\convex_hull_sample.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File
- RelativePath="..\convex_hull.h">
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc8/convex_hull.suo b/examples/parallel_reduce/convex_hull/vc8/convex_hull.suo
deleted file mode 100644
index 2e4ad4c..0000000
Binary files a/examples/parallel_reduce/convex_hull/vc8/convex_hull.suo and /dev/null differ
diff --git a/examples/parallel_reduce/convex_hull/vc9/convex_hull.suo b/examples/parallel_reduce/convex_hull/vc9/convex_hull.suo
deleted file mode 100644
index 018a5f2..0000000
Binary files a/examples/parallel_reduce/convex_hull/vc9/convex_hull.suo and /dev/null differ
diff --git a/examples/parallel_reduce/convex_hull/vc9/convex_hull_benchmark.vcproj b/examples/parallel_reduce/convex_hull/vc9/convex_hull_benchmark.vcproj
deleted file mode 100644
index 9b8127c..0000000
--- a/examples/parallel_reduce/convex_hull/vc9/convex_hull_benchmark.vcproj
+++ /dev/null
@@ -1,363 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="convex_hull_benchmark"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
- RootNamespace="convex_hull_benchmark"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\convex_hull_bench.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header files"
- >
- <File
- RelativePath="..\convex_hull.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/vc9/convex_hull_sample.vcproj b/examples/parallel_reduce/convex_hull/vc9/convex_hull_sample.vcproj
deleted file mode 100644
index d0494d7..0000000
--- a/examples/parallel_reduce/convex_hull/vc9/convex_hull_sample.vcproj
+++ /dev/null
@@ -1,361 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="convex_hull_sample"
- ProjectGUID="{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
- RootNamespace="convex_hull_sample"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy /Y "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\convex_hull_sample.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\convex_hull.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_reduce/primes/Makefile b/examples/parallel_reduce/primes/Makefile
index 3d295d6..be9ff9a 100644
--- a/examples/parallel_reduce/primes/Makefile
+++ b/examples/parallel_reduce/primes/Makefile
@@ -29,7 +29,9 @@ PROG=primes
ARGS=100000000 0:4
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/parallel_reduce/primes/Makefile.windows b/examples/parallel_reduce/primes/Makefile.windows
index d5766fc..396325e 100644
--- a/examples/parallel_reduce/primes/Makefile.windows
+++ b/examples/parallel_reduce/primes/Makefile.windows
@@ -30,17 +30,24 @@
PROG=Primes
ARGS=100000000 0:4
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug: compiler_check
$(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/parallel_reduce/primes/index.html b/examples/parallel_reduce/primes/index.html
index 42c42e5..16ed353 100644
--- a/examples/parallel_reduce/primes/index.html
+++ b/examples/parallel_reduce/primes/index.html
@@ -14,12 +14,8 @@ Parallel version of the Sieve of Eratosthenes.
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/parallel_reduce/primes/msvs/primes.icproj b/examples/parallel_reduce/primes/msvs/primes.icproj
new file mode 100644
index 0000000..744dcbe
--- /dev/null
+++ b/examples/parallel_reduce/primes/msvs/primes.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="primes"
+ ProjectGUID="{D731702C-B704-468D-9497-A75EE0521C89}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+ VCNestedProjectFileName="primes.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/primes/vc8/primes.vcproj b/examples/parallel_reduce/primes/msvs/primes.vcproj
similarity index 81%
copy from examples/parallel_reduce/primes/vc8/primes.vcproj
copy to examples/parallel_reduce/primes/msvs/primes.vcproj
index c183a09..af4378b 100644
--- a/examples/parallel_reduce/primes/vc8/primes.vcproj
+++ b/examples/parallel_reduce/primes/msvs/primes.vcproj
@@ -1,356 +1,356 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="primes"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
- RootNamespace="primes"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\primes.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="primes"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+ RootNamespace="primes"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\primes.cpp"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/primes/vc8/primes.sln b/examples/parallel_reduce/primes/msvs/primes_cl.sln
similarity index 97%
rename from examples/parallel_reduce/primes/vc8/primes.sln
rename to examples/parallel_reduce/primes/msvs/primes_cl.sln
index 089aa4f..9e30985 100644
--- a/examples/parallel_reduce/primes/vc8/primes.sln
+++ b/examples/parallel_reduce/primes/msvs/primes_cl.sln
@@ -1,25 +1,25 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "primes", "primes.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
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "primes", "primes.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/parallel_reduce/convex_hull/vc9/convex_hull.sln b/examples/parallel_reduce/primes/msvs/primes_icl.sln
similarity index 54%
rename from examples/parallel_reduce/convex_hull/vc9/convex_hull.sln
rename to examples/parallel_reduce/primes/msvs/primes_icl.sln
index 86067a1..cde13dc 100644
--- a/examples/parallel_reduce/convex_hull/vc9/convex_hull.sln
+++ b/examples/parallel_reduce/primes/msvs/primes_icl.sln
@@ -1,35 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_benchmark", "convex_hull_benchmark.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull_sample", "convex_hull_sample.vcproj", "{5F897A77-EBD9-4462-94D4-06E2ADE47F3B}"
-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
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.ActiveCfg = Debug|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|Win32.Build.0 = Debug|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.ActiveCfg = Debug|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Debug|x64.Build.0 = Debug|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.ActiveCfg = Release|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|Win32.Build.0 = Release|Win32
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.ActiveCfg = Release|x64
- {5F897A77-EBD9-4462-94D4-06E2ADE47F3B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "primes", "primes.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/parallel_reduce/primes/vc7.1/primes.sln b/examples/parallel_reduce/primes/vc7.1/primes.sln
deleted file mode 100644
index 0e51661..0000000
--- a/examples/parallel_reduce/primes/vc7.1/primes.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "primes", "primes.vcproj", "{519446A2-AF27-429B-A5DF-625B8F034024}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {519446A2-AF27-429B-A5DF-625B8F034024}.Debug.ActiveCfg = Debug|Win32
- {519446A2-AF27-429B-A5DF-625B8F034024}.Debug.Build.0 = Debug|Win32
- {519446A2-AF27-429B-A5DF-625B8F034024}.Release.ActiveCfg = Release|Win32
- {519446A2-AF27-429B-A5DF-625B8F034024}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_reduce/primes/vc7.1/primes.suo b/examples/parallel_reduce/primes/vc7.1/primes.suo
deleted file mode 100644
index 2e62696..0000000
Binary files a/examples/parallel_reduce/primes/vc7.1/primes.suo and /dev/null differ
diff --git a/examples/parallel_reduce/primes/vc7.1/primes.vcproj b/examples/parallel_reduce/primes/vc7.1/primes.vcproj
deleted file mode 100644
index ba8b9a2..0000000
--- a/examples/parallel_reduce/primes/vc7.1/primes.vcproj
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="primes"
- ProjectGUID="{519446A2-AF27-429B-A5DF-625B8F034024}"
- RootNamespace="primes"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\primes.cpp">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_reduce/primes/vc8/primes.suo b/examples/parallel_reduce/primes/vc8/primes.suo
deleted file mode 100644
index f3a244e..0000000
Binary files a/examples/parallel_reduce/primes/vc8/primes.suo and /dev/null differ
diff --git a/examples/parallel_reduce/primes/vc9/primes.sln b/examples/parallel_reduce/primes/vc9/primes.sln
deleted file mode 100644
index 420543b..0000000
--- a/examples/parallel_reduce/primes/vc9/primes.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "primes", "primes.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/parallel_reduce/primes/vc9/primes.suo b/examples/parallel_reduce/primes/vc9/primes.suo
deleted file mode 100644
index 2d61b3d..0000000
Binary files a/examples/parallel_reduce/primes/vc9/primes.suo and /dev/null differ
diff --git a/examples/parallel_reduce/primes/vc9/primes.vcproj b/examples/parallel_reduce/primes/vc9/primes.vcproj
deleted file mode 100644
index d0224ca..0000000
--- a/examples/parallel_reduce/primes/vc9/primes.vcproj
+++ /dev/null
@@ -1,353 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="primes"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
- RootNamespace="primes"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\primes.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_while/index.html b/examples/parallel_while/index.html
deleted file mode 100644
index c47ee8d..0000000
--- a/examples/parallel_while/index.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<HTML>
-<BODY>
-
-<H2>Overview</H2>
-This directory has examples of the template <code>parallel_while</code>.
-
-<H2>Directories</H2>
-<DL>
-<DT><A HREF="parallel_preorder/index.html">parallel_preorder</A>
-<DD>Parallel preorder traversal of a graph.
-</DL>
-
-<HR>
-<A HREF="../index.html">Up to parent directory</A>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. 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.
-</BODY>
-</HTML>
-
diff --git a/examples/parallel_while/parallel_preorder/Graph.cpp b/examples/parallel_while/parallel_preorder/Graph.cpp
deleted file mode 100644
index d664ec5..0000000
--- a/examples/parallel_while/parallel_preorder/Graph.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- Copyright 2005-2010 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 <cstdlib>
-#include "Graph.h"
-
-using namespace std;
-
-void Graph::create_random_dag( size_t number_of_nodes ) {
- my_vertex_set.resize(number_of_nodes);
- for( size_t k=0; k<number_of_nodes; ++k ) {
- Cell& c = my_vertex_set[k];
- int op = int((rand()>>8)%5u);
- if( op>int(k) ) op = int(k);
- switch( op ) {
- default:
- c.op = OP_VALUE;
- c.value = Cell::value_type((float)k);
- break;
- case 1:
- c.op = OP_NEGATE;
- break;
- case 2:
- c.op = OP_SUB;
- break;
- case 3:
- c.op = OP_ADD;
- break;
- case 4:
- c.op = OP_MUL;
- break;
- }
- for( int j=0; j<ArityOfOp[c.op]; ++j ) {
- Cell& input = my_vertex_set[rand()%k];
- c.input[j] = &input;
- }
- }
-}
-
-void Graph::print() {
- for( size_t k=0; k<my_vertex_set.size(); ++k ) {
- printf("Cell %d:",int(k));
- for( size_t j=0; j<my_vertex_set[k].successor.size(); ++j )
- printf(" %d",int(my_vertex_set[k].successor[j] - &my_vertex_set[0]));
- printf("\n");
- }
-}
-
-void Graph::get_root_set( vector<Cell*>& root_set ) {
- for( size_t k=0; k<my_vertex_set.size(); ++k ) {
- my_vertex_set[k].successor.clear();
- }
- root_set.clear();
- for( size_t k=0; k<my_vertex_set.size(); ++k ) {
- Cell& c = my_vertex_set[k];
- c.ref_count = ArityOfOp[c.op];
- for( int j=0; j<ArityOfOp[c.op]; ++j ) {
- c.input[j]->successor.push_back(&c);
- }
- if( ArityOfOp[c.op]==0 )
- root_set.push_back(&my_vertex_set[k]);
- }
-}
-
-void Cell::update() {
- switch( op ) {
- case OP_VALUE:
- break;
- case OP_NEGATE:
- value = -(input[0]->value);
- break;
- case OP_ADD:
- value = input[0]->value + input[1]->value;
- break;
- case OP_SUB:
- value = input[0]->value - input[1]->value;
- break;
- case OP_MUL:
- value = input[0]->value * input[1]->value;
- break;
- }
-}
-
diff --git a/examples/parallel_while/parallel_preorder/Makefile b/examples/parallel_while/parallel_preorder/Makefile
deleted file mode 100644
index e6bf48d..0000000
--- a/examples/parallel_while/parallel_preorder/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2005-2010 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.
-
-# GNU Makefile that builds and runs example.
-PROG=parallel_preorder
-ARGS=1:4
-
-# The C++ compiler
-#CXX=g++
-
-all: release test
-
-release: *.cpp
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
-
-debug: *.cpp
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
-
-clean:
- rm -f $(PROG) *.o *.d
-
-test:
- ./$(PROG) $(ARGS)
diff --git a/examples/parallel_while/parallel_preorder/Matrix.h b/examples/parallel_while/parallel_preorder/Matrix.h
deleted file mode 100644
index b4d91a7..0000000
--- a/examples/parallel_while/parallel_preorder/Matrix.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- Copyright 2005-2010 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.
-*/
-
-class Matrix {
- static const int n = 10;
- float array[n][n];
-public:
- Matrix() {}
- Matrix( float z ) {
- for( int i=0; i<n; ++i )
- for( int j=0; j<n; ++j )
- array[i][j] = i==j ? z : 0;
- }
- friend Matrix operator-( const Matrix& x ) {
- Matrix result;
- for( int i=0; i<n; ++i )
- for( int j=0; j<n; ++j )
- result.array[i][j] = -x.array[i][j];
- return result;
- }
- friend Matrix operator+( const Matrix& x, const Matrix& y ) {
- Matrix result;
- for( int i=0; i<n; ++i )
- for( int j=0; j<n; ++j )
- result.array[i][j] = x.array[i][j] + y.array[i][j];
- return result;
- }
- friend Matrix operator-( const Matrix& x, const Matrix& y ) {
- Matrix result;
- for( int i=0; i<n; ++i )
- for( int j=0; j<n; ++j )
- result.array[i][j] = x.array[i][j] - y.array[i][j];
- return result;
- }
- friend Matrix operator*( const Matrix& x, const Matrix& y ) {
- Matrix result(0);
- for( int i=0; i<n; ++i )
- for( int k=0; k<n; ++k )
- for( int j=0; j<n; ++j )
- result.array[i][j] += x.array[i][k] * y.array[k][j];
- return result;
- }
-};
diff --git a/examples/parallel_while/parallel_preorder/index.html b/examples/parallel_while/parallel_preorder/index.html
deleted file mode 100644
index 86f0152..0000000
--- a/examples/parallel_while/parallel_preorder/index.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<HTML>
-<BODY>
-
-<H2>Overview</H2>
-Example that uses parallel_while to do parallel preorder traversal of a sparse graph.
-<P>
-Each vertex in the graph is called a "cell".
-Each cell has a value.
-The value is a matrix.
-Some of the cells have operators
-that compute the cell's value, using other cell's values as input.
-A cell that uses the value of cell x is called a successor of x.
-</P><P>
-The algorithm works as follows.
-<OL>
-<LI> Compute the set of cells that have no inputs. This set is called <TT>root_set</TT>.
-<LI> Each cell has an associated field <TT>ref_count</TT> that is an atomic integer.
- Initialize <TT>ref_count</TT> to the number of inputs for the Cell.
-<LI> Update each cell in <TT>root_set</TT>, by applying a <TT>parallel_while</TT> to a stream
- that iterates over <TT>root_set</TT>
-<LI> After updating a cell, for each of its successors
-<OL>
-<LI> Atomically decrement the successor's <TT>ref_count</TT>
-<LI> If the count became zero, add the cell to the set of cells to be updated,
- by calling <TT>parallel_while::add</TT>.
-</OL>
-</OL>
-</P><P>
-The times printed are for the traversal and update,
-and do not include time for computing the root_set.
-</P>
-<B>NOTE: </B>It is important to understand that this example is unlikely to show speedup
-if the cell values are changed to type "float". The reason is twofold.
-<UL>
-<LI> The smaller value type causes each Cell to be significantly smaller than a cache line,
- which leads to false sharing conflicts.
-<LI> The time to update the cells becomes very small, and consequently the overhead of
- parallel_while swamps the useful work.
-</UL>
-
-<H2>Files</H2>
-<DL>
-<DT><A HREF="parallel_preorder.cpp">parallel_preorder.cpp</A>
-<DD>Source code for example.
-<DT><A HREF="Graph.cpp">Graph.cpp</A>
-<DD>Source code for example.
-<DT><A HREF="Graph.h">Graph.h</A>
-<DD>Source code for example.
-<DT><A HREF="Matrix.h">Matrix.h</A>
-<DD>Source code for example.
-<DT><A HREF="Makefile">Makefile</A>
-<DD>Makefile for building example.
-</DL>
-
-<H2>Directories</H2>
-<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
-<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
-<DT><A HREF="xcode">xcode</A>
-<DD>Contains Xcode* IDE 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>.
-
-<H2>Usage</H2>
-<DL>
-<DT><TT>parallel_preorder [<I>M</I>[:<I>N</I>] [<I>Rounds</I> [<I>'pause'</I>]]]</TT>
-<DD><I>M</I> and <I>N</I> are a range of numbers of threads to be used.
-<DD><I>Rounds</I> is the number of rounds the example runs internally. Default value
- is 50; reduce it to shorten example run time.
-<DD>If 'pause' is specified, the application will wait for a user to hit return before it exits.
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
-<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 rounds, e.g., <TT>parallel_preorder 4 5</TT>.
-</DL>
-
-<HR>
-<A HREF="../index.html">Up to parent directory</A>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. 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.
-</BODY>
-</HTML>
-
diff --git a/examples/parallel_while/parallel_preorder/parallel_preorder.cpp b/examples/parallel_while/parallel_preorder/parallel_preorder.cpp
deleted file mode 100644
index df84654..0000000
--- a/examples/parallel_while/parallel_preorder/parallel_preorder.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- Copyright 2005-2010 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.
-*/
-
-/* Example program that shows how to use parallel_while to do parallel preorder
- traversal of a directed acyclic graph. */
-
-#include "tbb/parallel_while.h"
-#include "tbb/atomic.h"
-#include <vector>
-#include <algorithm>
-#include <cstring>
-#include <cstdio>
-#include "Graph.h"
-
-using namespace std;
-
-//! Number of trials. Can be changed from command line
-int ntrial = 50;
-
-class Body {
- tbb::parallel_while<Body>& my_while;
-public:
- Body( tbb::parallel_while<Body>& w ) : my_while(w) {};
-
- //------------------------------------------------------------------------
- // Following signatures required by parallel_while
- //------------------------------------------------------------------------
- typedef Cell* argument_type;
- void operator()( Cell* c ) const {
- c->update();
- // Restore ref_count in preparation for subsequent traversal.
- c->ref_count = ArityOfOp[c->op];
- for( size_t k=0; k<c->successor.size(); ++k ) {
- Cell* successor = c->successor[k];
- if( 0 == --(successor->ref_count) ) {
- my_while.add( successor );
- }
- }
- }
-};
-
-class Stream {
- size_t k;
- const vector<Cell*>& my_roots;
-public:
- Stream( const vector<Cell*>& root_set ) : my_roots(root_set), k(0) {}
- bool pop_if_present( Cell*& item ) {
- bool result = k<my_roots.size();
- if( result )
- item = my_roots[k++];
- return result;
- }
-};
-
-void ParallelPreorderTraversal( const vector<Cell*>& root_set ) {
- tbb::parallel_while<Body> w;
- Stream s(root_set);
- w.run(s,Body(w));
-}
-
-//------------------------------------------------------------------------
-// Test driver
-//------------------------------------------------------------------------
-
-#include <cctype>
-#include "tbb/task_scheduler_init.h"
-#include "tbb/tick_count.h"
-
-//! A closed range of int.
-struct IntRange {
- int low;
- int high;
- void set_from_string( const char* s );
- IntRange( int low_, int high_ ) : low(low_), high(high_) {}
-};
-
-void IntRange::set_from_string( const char* s ) {
- char* end;
- high = low = strtol(s,&end,0);
- switch( *end ) {
- case ':':
- high = strtol(end+1,0,0);
- break;
- case '\0':
- break;
- default:
- printf("unexpected character = %c\n",*end);
- }
-}
-
-//! Number of threads to use.
-static IntRange NThread(1,4);
-
-//! If true, then at end wait for user to hit return
-static bool PauseFlag = false;
-
-//! Displays usage message
-void Usage(char * argv0) {
- fprintf(stderr, "Usage: %s [nthread [ntrials ['pause']]]\n", argv0);
- fprintf(stderr, "where nthread is a non-negative integer, or range of the form low:high [%d:%d]\n", NThread.low, NThread.high);
- fprintf(stderr, "ntrials is a positive integer. Default value is 50, reduce it (e.g. to 5) to shorten example run time\n");
- fprintf(stderr, "The application waits for user to hit return if 'pause' is specified\n");
-}
-
-//! Parse the command line.
-static void ParseCommandLine( int argc, char* argv[] ) {
- int i = 1;
- if( i<argc && !isdigit(argv[i][0]) ) {
- // Command line is garbled.
- Usage(argv[0]);
- exit(1);
- }
- if( i<argc )
- NThread.set_from_string(argv[i++]);
- if( i<argc && !isdigit(argv[i][0]) ) {
- // Command line is garbled.
- Usage(argv[0]);
- exit(1);
- }
- if (i<argc) {
- ntrial = strtol(argv[i++], 0, 0);
- }
- if (ntrial == 0) {
- // Command line is garbled.
- Usage(argv[0]);
- exit(1);
- }
- if (i<argc && strcmp( argv[i], "pause" )==0 ) {
- PauseFlag = true;
- }
-}
-
-int main( int argc, char* argv[] ) {
- ParseCommandLine(argc,argv);
-
- // Start scheduler with given number of threads.
- for( int p=NThread.low; p<=NThread.high; ++p ) {
- tbb::task_scheduler_init init(p);
- srand(2);
- tbb::tick_count::interval_t interval;
- size_t total_root_set_size = 0;
- for( int trial=0; trial<ntrial; ++trial ) {
- Graph g;
- g.create_random_dag(1000);
- vector<Cell*> root_set;
- g.get_root_set(root_set);
- total_root_set_size += root_set.size();
-
- tbb::tick_count t0 = tbb::tick_count::now();
- for( int i=0; i<10; ++i ) {
- ParallelPreorderTraversal(root_set);
- }
- tbb::tick_count t1 = tbb::tick_count::now();
-
- interval += t1-t0;
- }
- printf("%g seconds using %d threads (average of %g nodes in root_set)\n",interval.seconds(),p,(double)total_root_set_size/ntrial);
- }
-
- if (PauseFlag) {
- printf ("Press return key to exit");
- char c;
- int n = scanf("%c", &c);
- if( n!=1 ) {
- fprintf(stderr,"Fatal error: unexpected end of input\n");
- exit(1);
- }
- }
-
- return 0;
-}
diff --git a/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.sln b/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.sln
deleted file mode 100644
index 1cda54a..0000000
--- a/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{519446A2-AF27-429B-A5DF-625B8F034021}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {519446A2-AF27-429B-A5DF-625B8F034021}.Debug.ActiveCfg = Debug|Win32
- {519446A2-AF27-429B-A5DF-625B8F034021}.Debug.Build.0 = Debug|Win32
- {519446A2-AF27-429B-A5DF-625B8F034021}.Release.ActiveCfg = Release|Win32
- {519446A2-AF27-429B-A5DF-625B8F034021}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.suo b/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.suo
deleted file mode 100644
index ffa0587..0000000
Binary files a/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.suo and /dev/null differ
diff --git a/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.vcproj b/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.vcproj
deleted file mode 100644
index 5b7c292..0000000
--- a/examples/parallel_while/parallel_preorder/vc7.1/parallel_preorder.vcproj
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="parallel_preorder"
- ProjectGUID="{519446A2-AF27-429B-A5DF-625B8F034021}"
- RootNamespace="parallel_preorder"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\Graph.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">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.suo b/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.suo
deleted file mode 100644
index 5395b93..0000000
Binary files a/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.suo and /dev/null differ
diff --git a/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.vcproj b/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.vcproj
deleted file mode 100644
index 057930b..0000000
--- a/examples/parallel_while/parallel_preorder/vc8/parallel_preorder.vcproj
+++ /dev/null
@@ -1,374 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="parallel_preorder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
- RootNamespace="parallel_preorder"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\Graph.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"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.sln b/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.sln
deleted file mode 100644
index 178fea0..0000000
--- a/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parallel_preorder", "parallel_preorder.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252B}"
-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-068F511A252B}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252B}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.suo b/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.suo
deleted file mode 100644
index 14402b5..0000000
Binary files a/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.suo and /dev/null differ
diff --git a/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.vcproj b/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.vcproj
deleted file mode 100644
index d9e48f5..0000000
--- a/examples/parallel_while/parallel_preorder/vc9/parallel_preorder.vcproj
+++ /dev/null
@@ -1,371 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="parallel_preorder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
- RootNamespace="parallel_preorder"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\Graph.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"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/parallel_while/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj b/examples/parallel_while/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
deleted file mode 100644
index d82d821..0000000
--- a/examples/parallel_while/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,314 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 42;
- objects = {
-
-/* Begin PBXBuildFile section */
- 05593AA80B8F55D500DE73AB /* Graph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 05593AA40B8F55D500DE73AB /* Graph.cpp */; };
- 05593AAB0B8F55D500DE73AB /* parallel_preorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 05593AA70B8F55D500DE73AB /* parallel_preorder.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 */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 8DD76F690486A84900D96B5E /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 12;
- dstPath = "";
- dstSubfolderSpec = 16;
- files = (
- A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 05593AA40B8F55D500DE73AB /* Graph.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Graph.cpp; path = ../Graph.cpp; sourceTree = SOURCE_ROOT; };
- 05593AA50B8F55D500DE73AB /* Graph.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Graph.h; path = ../Graph.h; sourceTree = SOURCE_ROOT; };
- 05593AA60B8F55D500DE73AB /* Matrix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Matrix.h; path = ../Matrix.h; sourceTree = SOURCE_ROOT; };
- 05593AA70B8F55D500DE73AB /* parallel_preorder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = parallel_preorder.cpp; path = ../parallel_preorder.cpp; sourceTree = SOURCE_ROOT; };
- 8DD76F6C0486A84900D96B5E /* parallel_preorder */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = parallel_preorder; sourceTree = BUILT_PRODUCTS_DIR; };
- A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = /Library/Frameworks/TBB.framework/Libraries/libtbb.dylib; sourceTree = "<absolute>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 8DD76F660486A84900D96B5E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* parallel_preorder */ = {
- isa = PBXGroup;
- children = (
- 08FB7795FE84155DC02AAC07 /* Source */,
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
- 1AB674ADFE9D54B511CA2CBB /* Products */,
- );
- name = parallel_preorder;
- sourceTree = "<group>";
- };
- 08FB7795FE84155DC02AAC07 /* Source */ = {
- isa = PBXGroup;
- children = (
- 05593AA70B8F55D500DE73AB /* parallel_preorder.cpp */,
- 05593AA40B8F55D500DE73AB /* Graph.cpp */,
- 05593AA50B8F55D500DE73AB /* Graph.h */,
- 05593AA60B8F55D500DE73AB /* Matrix.h */,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 1AB674ADFE9D54B511CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 8DD76F6C0486A84900D96B5E /* parallel_preorder */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- A1F593B30B8F06F900073279 /* libtbb.dylib */,
- );
- name = "External Frameworks and Libraries";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* parallel_preorder */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "parallel_preorder" */;
- buildPhases = (
- 8DD76F640486A84900D96B5E /* Sources */,
- 8DD76F660486A84900D96B5E /* Frameworks */,
- 8DD76F690486A84900D96B5E /* CopyFiles */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = parallel_preorder;
- productInstallPath = "$(HOME)/bin";
- productName = parallel_preorder;
- productReference = 8DD76F6C0486A84900D96B5E /* parallel_preorder */;
- productType = "com.apple.product-type.tool";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 08FB7793FE84155DC02AAC07 /* Project object */ = {
- isa = PBXProject;
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "parallel_preorder" */;
- compatibilityVersion = "Xcode 2.4";
- hasScannedForEncodings = 1;
- mainGroup = 08FB7794FE84155DC02AAC07 /* parallel_preorder */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 8DD76F620486A84900D96B5E /* parallel_preorder */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
- 8DD76F640486A84900D96B5E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 05593AA80B8F55D500DE73AB /* Graph.cpp in Sources */,
- 05593AAB0B8F55D500DE73AB /* parallel_preorder.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
- 1DEB923208733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = parallel_preorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 1DEB923308733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = parallel_preorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 1DEB923608733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug;
- };
- 1DEB923708733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release;
- };
- A1F593C60B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = parallel_preorder;
- ZERO_LINK = NO;
- };
- name = Debug64;
- };
- A1F593C70B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = parallel_preorder;
- ZERO_LINK = NO;
- };
- name = Release64;
- };
- A1F593C80B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug64;
- };
- A1F593C90B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release64;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "parallel_preorder" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923208733DC60010E9CD /* Debug */,
- A1F593C60B8F0E6E00073279 /* Debug64 */,
- 1DEB923308733DC60010E9CD /* Release */,
- A1F593C70B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "parallel_preorder" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923608733DC60010E9CD /* Debug */,
- A1F593C80B8F0E6E00073279 /* Debug64 */,
- 1DEB923708733DC60010E9CD /* Release */,
- A1F593C90B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
-}
diff --git a/examples/pipeline/index.html b/examples/pipeline/index.html
index 9bbdd99..45d3735 100644
--- a/examples/pipeline/index.html
+++ b/examples/pipeline/index.html
@@ -6,8 +6,6 @@ This directory has examples of the template <code>pipeline</code>.
<H2>Directories</H2>
<DL>
-<DT><A HREF="text_filter/index.html">text_filter</A>
-<DD>A simple text filter that capitalizes words in a text.
<DT><A HREF="square/index.html">square</A>
<DD>Another simple string transformation example that squares numbers read from a file.
</DL>
diff --git a/examples/pipeline/square/Makefile b/examples/pipeline/square/Makefile
index 6271f72..dc361c3 100644
--- a/examples/pipeline/square/Makefile
+++ b/examples/pipeline/square/Makefile
@@ -30,17 +30,19 @@ ARGS=input.txt output.txt
GEN=gen_input
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
SQUARE = square.cpp
all: release test
-release: $(SQUARE)
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
+release: $(SQUARE) input.txt
+ $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb $(LIBS)
-debug: $(SQUARE)
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+debug: $(SQUARE) input.txt
+ $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb_debug $(LIBS)
clean:
$(RM) $(PROG) $(GEN) *.o *.d input.txt output.txt
diff --git a/examples/pipeline/square/Makefile.windows b/examples/pipeline/square/Makefile.windows
index 84d6f59..58c0b27 100644
--- a/examples/pipeline/square/Makefile.windows
+++ b/examples/pipeline/square/Makefile.windows
@@ -30,16 +30,20 @@
PROG=square
ARGS=input.txt output.txt
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS) /D _CRT_SECURE_NO_DEPRECATE
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
SQUARE = square.cpp
all: release test
-release:
+release: compiler_check
$(CXX) $(SQUARE) /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug: compiler_check
$(CXX) $(SQUARE) /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe input.txt output.txt *.obj *.?db *.manifest gen_input.exe
@@ -49,3 +53,6 @@ input.txt: gen_input.exe
gen_input.exe > input.txt
test: input.txt
$(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/pipeline/square/index.html b/examples/pipeline/square/index.html
index b64d566..2280f9a 100644
--- a/examples/pipeline/square/index.html
+++ b/examples/pipeline/square/index.html
@@ -17,12 +17,8 @@ containing decimal integers in text format, and changes each to its square.
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/pipeline/square/msvs/gen_input.icproj b/examples/pipeline/square/msvs/gen_input.icproj
new file mode 100644
index 0000000..50048b7
--- /dev/null
+++ b/examples/pipeline/square/msvs/gen_input.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="gen_input"
+ ProjectGUID="{18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}"
+ VCNestedProjectGUID="{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
+ VCNestedProjectFileName="gen_input.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/pipeline/square/vc8/gen_input.vcproj b/examples/pipeline/square/msvs/gen_input.vcproj
similarity index 95%
rename from examples/pipeline/square/vc8/gen_input.vcproj
rename to examples/pipeline/square/msvs/gen_input.vcproj
index a066160..9a0af57 100644
--- a/examples/pipeline/square/vc8/gen_input.vcproj
+++ b/examples/pipeline/square/msvs/gen_input.vcproj
@@ -1,354 +1,354 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="gen_input"
- ProjectGUID="{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
- RootNamespace="gen_input"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\gen_input.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="gen_input"
+ ProjectGUID="{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
+ RootNamespace="gen_input"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\gen_input.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/pipeline/square/msvs/square.icproj b/examples/pipeline/square/msvs/square.icproj
new file mode 100644
index 0000000..a957bf5
--- /dev/null
+++ b/examples/pipeline/square/msvs/square.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1252"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="square"
+ ProjectGUID="{7462FB4A-C9BE-40D4-A568-5D08F507EEB1}"
+ VCNestedProjectGUID="{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
+ VCNestedProjectFileName="square.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/pipeline/square/vc8/square.vcproj b/examples/pipeline/square/msvs/square.vcproj
similarity index 83%
rename from examples/pipeline/square/vc8/square.vcproj
rename to examples/pipeline/square/msvs/square.vcproj
index ea98ffe..1311ee6 100644
--- a/examples/pipeline/square/vc8/square.vcproj
+++ b/examples/pipeline/square/msvs/square.vcproj
@@ -1,380 +1,380 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="square"
- ProjectGUID="{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
- RootNamespace="square"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\square.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="square"
+ ProjectGUID="{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
+ RootNamespace="square"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Constructing input.txt"
+ CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
+ AdditionalDependencies="gen_input.exe"
+ Outputs="input.txt"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Constructing input.txt"
+ CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
+ AdditionalDependencies="gen_input.exe"
+ Outputs="input.txt"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Constructing input.txt"
+ CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
+ AdditionalDependencies="gen_input.exe"
+ Outputs="input.txt"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Constructing input.txt"
+ CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
+ AdditionalDependencies="gen_input.exe"
+ Outputs="input.txt"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\square.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/pipeline/square/vc8/square.vcproj.user b/examples/pipeline/square/msvs/square.vcproj.user
similarity index 94%
rename from examples/pipeline/square/vc8/square.vcproj.user
rename to examples/pipeline/square/msvs/square.vcproj.user
index e7c2b92..22c54af 100644
--- a/examples/pipeline/square/vc8/square.vcproj.user
+++ b/examples/pipeline/square/msvs/square.vcproj.user
@@ -1,37 +1,37 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioUserFile
- ProjectType="Visual C++"
- Version="8.00"
- ShowAllFiles="false"
- >
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- </Configurations>
-</VisualStudioUserFile>
+<?xml version="1.0" encoding="windows-1252"?>
+<VisualStudioUserFile
+ ProjectType="Visual C++"
+ Version="8.00"
+ ShowAllFiles="false"
+ >
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ >
+ <DebugSettings
+ WorkingDirectory="$(OutDir)"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ >
+ <DebugSettings
+ WorkingDirectory="$(OutDir)"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ >
+ <DebugSettings
+ WorkingDirectory="$(OutDir)"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ >
+ <DebugSettings
+ WorkingDirectory="$(OutDir)"
+ />
+ </Configuration>
+ </Configurations>
+</VisualStudioUserFile>
diff --git a/examples/pipeline/square/vc8/square.sln b/examples/pipeline/square/msvs/square_cl.sln
similarity index 98%
rename from examples/pipeline/square/vc8/square.sln
rename to examples/pipeline/square/msvs/square_cl.sln
index d9ce229..056f4f2 100644
--- a/examples/pipeline/square/vc8/square.sln
+++ b/examples/pipeline/square/msvs/square_cl.sln
@@ -1,38 +1,38 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "square", "square.vcproj", "{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
- ProjectSection(ProjectDependencies) = postProject
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7} = {25A46A49-406F-4681-8AC9-5FE46F38E5A7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_input", "gen_input.vcproj", "{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.ActiveCfg = Debug|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.Build.0 = Debug|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.ActiveCfg = Debug|x64
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.Build.0 = Debug|x64
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.ActiveCfg = Release|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.Build.0 = Release|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.ActiveCfg = Release|x64
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.Build.0 = Release|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.ActiveCfg = Debug|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.Build.0 = Debug|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.ActiveCfg = Debug|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.Build.0 = Debug|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.ActiveCfg = Release|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.Build.0 = Release|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.ActiveCfg = Release|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "square", "square.vcproj", "{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
+ ProjectSection(ProjectDependencies) = postProject
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7} = {25A46A49-406F-4681-8AC9-5FE46F38E5A7}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_input", "gen_input.vcproj", "{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.Build.0 = Debug|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.ActiveCfg = Debug|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.Build.0 = Debug|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.ActiveCfg = Release|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.Build.0 = Release|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.ActiveCfg = Release|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.Build.0 = Release|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.Build.0 = Debug|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.ActiveCfg = Debug|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.Build.0 = Debug|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.ActiveCfg = Release|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.Build.0 = Release|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.ActiveCfg = Release|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/pipeline/square/vc9/square.sln b/examples/pipeline/square/msvs/square_icl.sln
similarity index 50%
rename from examples/pipeline/square/vc9/square.sln
rename to examples/pipeline/square/msvs/square_icl.sln
index 6e44ca3..f122357 100644
--- a/examples/pipeline/square/vc9/square.sln
+++ b/examples/pipeline/square/msvs/square_icl.sln
@@ -1,38 +1,54 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "square", "square.vcproj", "{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
- ProjectSection(ProjectDependencies) = postProject
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7} = {25A46A49-406F-4681-8AC9-5FE46F38E5A7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_input", "gen_input.vcproj", "{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.ActiveCfg = Debug|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.Build.0 = Debug|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.ActiveCfg = Debug|x64
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.Build.0 = Debug|x64
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.ActiveCfg = Release|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.Build.0 = Release|Win32
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.ActiveCfg = Release|x64
- {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.Build.0 = Release|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.ActiveCfg = Debug|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.Build.0 = Debug|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.ActiveCfg = Debug|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.Build.0 = Debug|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.ActiveCfg = Release|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.Build.0 = Release|Win32
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.ActiveCfg = Release|x64
- {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "square", "square.icproj", "{7462FB4A-C9BE-40D4-A568-5D08F507EEB1}"
+ ProjectSection(ProjectDependencies) = postProject
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA} = {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}
+ EndProjectSection
+EndProject
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "gen_input", "gen_input.icproj", "{18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}"
+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
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Debug|Win32.Build.0 = Debug|Win32
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Debug|x64.ActiveCfg = Debug|x64
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Debug|x64.Build.0 = Debug|x64
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Release|Win32.ActiveCfg = Release|Win32
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Release|Win32.Build.0 = Release|Win32
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Release|x64.ActiveCfg = Release|x64
+ {7462FB4A-C9BE-40D4-A568-5D08F507EEB1}.Release|x64.Build.0 = Release|x64
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Debug|Win32.Build.0 = Debug|Win32
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Debug|x64.ActiveCfg = Debug|x64
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Debug|x64.Build.0 = Debug|x64
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Release|Win32.ActiveCfg = Release|Win32
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Release|Win32.Build.0 = Release|Win32
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Release|x64.ActiveCfg = Release|x64
+ {18ECAB6C-2630-4F8F-BEF2-3DBDEF7355AA}.Release|x64.Build.0 = Release|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.Build.0 = Release|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|x64.ActiveCfg = Release|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.Build.0 = Release|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Release|Win32.ActiveCfg = Release|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.Build.0 = Debug|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|x64.ActiveCfg = Debug|x64
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.Build.0 = Debug|Win32
+ {A21C0AEE-ADDC-45F0-A668-58FF10351D23}.Debug|Win32.ActiveCfg = Debug|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.Build.0 = Release|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|x64.ActiveCfg = Release|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.Build.0 = Release|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Release|Win32.ActiveCfg = Release|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.Build.0 = Debug|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|x64.ActiveCfg = Debug|x64
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.Build.0 = Debug|Win32
+ {25A46A49-406F-4681-8AC9-5FE46F38E5A7}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/pipeline/square/square.cpp b/examples/pipeline/square/square.cpp
index 458a861..65cf2d2 100644
--- a/examples/pipeline/square/square.cpp
+++ b/examples/pipeline/square/square.cpp
@@ -45,9 +45,9 @@ using namespace std;
/** Instances *must* be allocated/freed using methods herein, because the C++ declaration
represents only the header of a much larger object in memory. */
class TextSlice {
- //! Pointer to one past last character in slice
+ //! Pointer to one past last character in sequence
char* logical_end;
- //! Pionter to one past last available byte in slice.
+ //! Pointer to one past last available byte in sequence.
char* physical_end;
public:
//! Allocate a TextSlice object that can hold up to max_size characters.
@@ -60,7 +60,7 @@ public:
}
//! Free a TextSlice object
void free() {
- tbb::tbb_allocator<char>().deallocate((char*)this,size());
+ tbb::tbb_allocator<char>().deallocate((char*)this,sizeof(TextSlice)+(physical_end-begin())+1);
}
//! Pointer to beginning of sequence
char* begin() {return (char*)(this+1);}
@@ -68,14 +68,14 @@ public:
char* end() {return logical_end;}
//! Length of sequence
size_t size() const {return logical_end-(char*)(this+1);}
- //! Maximum number of characters that can be appended to sequkence
+ //! Maximum number of characters that can be appended to sequence
size_t avail() const {return physical_end-logical_end;}
//! Append sequence [first,last) to this sequence.
void append( char* first, char* last ) {
memcpy( logical_end, first, last-first );
logical_end += last-first;
}
- //! Set end to given value.
+ //! Set end() to given value.
void set_end( char* p ) {logical_end=p;}
};
@@ -140,11 +140,11 @@ MyTransformFilter::MyTransformFilter() :
/*override*/void* MyTransformFilter::operator()( void* item ) {
TextSlice& input = *static_cast<TextSlice*>(item);
- // Add terminating NULL so that strtol works right even if number is at end of the input.
+ // Add terminating null so that strtol works right even if number is at end of the input.
*input.end() = '\0';
char* p = input.begin();
- TextSlice& output = *TextSlice::allocate( 2*MAX_CHAR_PER_INPUT_SLICE );
- char* q = output.begin();
+ TextSlice& out = *TextSlice::allocate( 2*MAX_CHAR_PER_INPUT_SLICE );
+ char* q = out.begin();
for(;;) {
while( p<input.end() && !isdigit(*p) )
*q++ = *p++;
@@ -158,9 +158,9 @@ MyTransformFilter::MyTransformFilter() :
sprintf(q,"%ld",y);
q = strchr(q,0);
}
- output.set_end(q);
+ out.set_end(q);
input.free();
- return &output;
+ return &out;
}
//! Filter that writes each buffer to a file.
@@ -178,13 +178,13 @@ MyOutputFilter::MyOutputFilter( FILE* output_file ) :
}
void* MyOutputFilter::operator()( void* item ) {
- TextSlice& output = *static_cast<TextSlice*>(item);
- size_t n = fwrite( output.begin(), 1, output.size(), my_output_file );
- if( n!=output.size() ) {
- fprintf(stderr,"Can't write into %s file\n", OutputFileName);
+ 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);
exit(1);
}
- output.free();
+ out.free();
return NULL;
}
diff --git a/examples/pipeline/square/vc7.1/gen_input.vcproj b/examples/pipeline/square/vc7.1/gen_input.vcproj
deleted file mode 100644
index 32faff4..0000000
--- a/examples/pipeline/square/vc7.1/gen_input.vcproj
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="gen_input"
- ProjectGUID="{9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="5"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/gen_input.exe"
- LinkIncremental="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/gen_input.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="4"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/gen_input.exe"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\gen_input.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/square/vc7.1/square.sln b/examples/pipeline/square/vc7.1/square.sln
deleted file mode 100644
index ddfee6a..0000000
--- a/examples/pipeline/square/vc7.1/square.sln
+++ /dev/null
@@ -1,30 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "square", "square.vcproj", "{4A021AFA-E254-4BCE-918D-377DF1C0BEEF}"
- ProjectSection(ProjectDependencies) = postProject
- {9B2DC020-BBF7-463B-AD0B-0D4ACF49100B} = {9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_input", "gen_input.vcproj", "{9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Debug.ActiveCfg = Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Debug.Build.0 = Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Release.ActiveCfg = Release|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Release.Build.0 = Release|Win32
- {9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}.Debug.ActiveCfg = Debug|Win32
- {9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}.Debug.Build.0 = Debug|Win32
- {9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}.Release.ActiveCfg = Release|Win32
- {9B2DC020-BBF7-463B-AD0B-0D4ACF49100B}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/pipeline/square/vc7.1/square.vcproj b/examples/pipeline/square/vc7.1/square.vcproj
deleted file mode 100644
index c816f1b..0000000
--- a/examples/pipeline/square/vc7.1/square.vcproj
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="square"
- ProjectGUID="{4A021AFA-E254-4BCE-918D-377DF1C0BEEF}"
- RootNamespace="square"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >input.txt
copy input.txt $(OutDir)"
- AdditionalDependencies="gen_input.exe"
- Outputs=""$(OutDir)\input.txt""/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >input.txt
copy input.txt $(OutDir)"
- Outputs=""$(OutDir)\input.txt""/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\square.cpp">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/square/vc9/gen_input.vcproj b/examples/pipeline/square/vc9/gen_input.vcproj
deleted file mode 100644
index a9f3d1d..0000000
--- a/examples/pipeline/square/vc9/gen_input.vcproj
+++ /dev/null
@@ -1,347 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="gen_input"
- ProjectGUID="{25A46A49-406F-4681-8AC9-5FE46F38E5A7}"
- RootNamespace="gen_input"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\gen_input.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/square/vc9/square.vcproj b/examples/pipeline/square/vc9/square.vcproj
deleted file mode 100644
index cd318b5..0000000
--- a/examples/pipeline/square/vc9/square.vcproj
+++ /dev/null
@@ -1,375 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="square"
- ProjectGUID="{A21C0AEE-ADDC-45F0-A668-58FF10351D23}"
- RootNamespace="square"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="$(OutDir)\gen_input >$(OutDir)\input.txt"
- AdditionalDependencies="gen_input.exe"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\square.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/square/vc9/square.vcproj.user b/examples/pipeline/square/vc9/square.vcproj.user
deleted file mode 100644
index e7c2b92..0000000
--- a/examples/pipeline/square/vc9/square.vcproj.user
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="windows-1252"?>
-<VisualStudioUserFile
- ProjectType="Visual C++"
- Version="8.00"
- ShowAllFiles="false"
- >
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- >
- <DebugSettings
- WorkingDirectory="$(OutDir)"
- />
- </Configuration>
- </Configurations>
-</VisualStudioUserFile>
diff --git a/examples/pipeline/text_filter/Makefile b/examples/pipeline/text_filter/Makefile
deleted file mode 100644
index c1a0573..0000000
--- a/examples/pipeline/text_filter/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2005-2010 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.
-
-# GNU Makefile that builds and runs example.
-PROG=text_filter
-ARGS=input.txt output.txt
-
-# The C++ compiler
-#CXX=g++
-
-all: release test
-
-release: *.cpp
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
-
-debug: *.cpp
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
-
-clean:
- $(RM) $(PROG) *.o *.d input.txt output.txt
-
-test:
- @echo Constructing input.txt
- @cat index.html > input.txt
- @-csh -c "repeat 500 cat index.html >> input.txt" 2>/dev/null
- ./$(PROG) $(ARGS)
diff --git a/examples/pipeline/text_filter/Makefile.windows b/examples/pipeline/text_filter/Makefile.windows
deleted file mode 100644
index 3be94ab..0000000
--- a/examples/pipeline/text_filter/Makefile.windows
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2005-2010 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.
-
-# Common Makefile that builds and runs example.
-
-# Just specify your program basename
-PROG=Text_Filter
-ARGS=input.txt output.txt
-
-# The C++ compiler options
-CXX = cl.exe
-MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
-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
-clean:
- @cmd.exe /C del $(PROG).exe input.txt output.txt *.obj *.?db *.manifest
-input.txt:
- @echo Constructing input.txt
- @cmd.exe /C "@type index.html >input.txt"
- @-cmd.exe /C "for /L %%a in (1,1,500) do @type index.html >> input.txt"
-test: input.txt
- $(PROG) $(ARGS)
diff --git a/examples/pipeline/text_filter/index.html b/examples/pipeline/text_filter/index.html
deleted file mode 100644
index b416060..0000000
--- a/examples/pipeline/text_filter/index.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<HTML>
-<BODY>
-
-<H2>Overview</H2>
-Text filter that demonstrates class pipeline.
-The TBB tutorial explains this example in detail.
-
-<H2>Files</H2>
-<DL>
-<DT><A HREF="text_filter.cpp">text_filter.cpp</A>
-<DD>Source code for example.
-<DT><A HREF="Makefile">Makefile</A>
-<DD>Makefile for building example.
-</DL>
-
-<H2>Directories</H2>
-<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
-<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
-<DT><A HREF="xcode">xcode</A>
-<DD>Contains Xcode* IDE 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>text_filter <I>inputfile</I> <I>outputfile</I> <I>N</I></TT>
-<DD>Run the example on the named <I>inputfile</I> and produce the named <I>outputfile</I>.
- <I>N</I> is the number of threads to be used.
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
-<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 (e.g., by concatenating all the index.html
- files in the examples/ directory tree).
- <BR>Run it with this <I>inputfile</I> and the desired number of threads,
- e.g., <TT>text_filter <I>inputfile</I> <I>outputfile</I> 4</TT>.
-</DL>
-
-<HR>
-<A HREF="../index.html">Up to parent directory</A>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. 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.
-</BODY>
-</HTML>
-
diff --git a/examples/pipeline/text_filter/text_filter.cpp b/examples/pipeline/text_filter/text_filter.cpp
deleted file mode 100644
index 09797da..0000000
--- a/examples/pipeline/text_filter/text_filter.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- Copyright 2005-2010 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.
-*/
-
-//
-// Example program that reads a file of text and changes the first letter
-// of each word to upper case.
-//
-#include "tbb/pipeline.h"
-#include "tbb/tick_count.h"
-#include "tbb/task_scheduler_init.h"
-#include <cstring>
-#include <cstdlib>
-#include <cstdio>
-#include <cctype>
-
-using namespace std;
-
-//! Buffer that holds block of characters and last character of previous buffer.
-class MyBuffer {
- static const size_t buffer_size = 10000;
- char* my_end;
- //! storage[0] holds the last character of the previous buffer.
- char storage[1+buffer_size];
-public:
- //! Pointer to first character in the buffer
- char* begin() {return storage+1;}
- const char* begin() const {return storage+1;}
- //! Pointer to one past last character in the buffer
- char* end() const {return my_end;}
- //! Set end of buffer.
- void set_end( char* new_ptr ) {my_end=new_ptr;}
- //! Number of bytes a buffer can hold
- size_t max_size() const {return buffer_size;}
- //! Number of bytes appended to buffer.
- size_t size() const {return my_end-begin();}
-};
-
-static const char* InputFileName = "input.txt";
-static const char* OutputFileName = "output.txt";
-
-class MyInputFilter: public tbb::filter {
-public:
- static const size_t n_buffer = 8;
- MyInputFilter( FILE* input_file_ );
-private:
- FILE* input_file;
- size_t next_buffer;
- char last_char_of_previous_buffer;
- MyBuffer buffer[n_buffer];
- /*override*/ void* operator()(void*);
-};
-
-MyInputFilter::MyInputFilter( FILE* input_file_ ) :
- filter(serial_in_order),
- next_buffer(0),
- input_file(input_file_),
- last_char_of_previous_buffer(' ')
-{
-}
-
-void* MyInputFilter::operator()(void*) {
- MyBuffer& b = buffer[next_buffer];
- next_buffer = (next_buffer+1) % n_buffer;
- size_t n = fread( b.begin(), 1, b.max_size(), input_file );
- if( !n ) {
- // end of file
- return NULL;
- } else {
- b.begin()[-1] = last_char_of_previous_buffer;
- last_char_of_previous_buffer = b.begin()[n-1];
- b.set_end( b.begin()+n );
- return &b;
- }
-}
-
-//! Filter that changes the first letter of each word from lower case to upper case.
-class MyTransformFilter: public tbb::filter {
-public:
- MyTransformFilter();
- /*override*/void* operator()( void* item );
-};
-
-MyTransformFilter::MyTransformFilter() :
- tbb::filter(parallel)
-{}
-
-/*override*/void* MyTransformFilter::operator()( void* item ) {
- MyBuffer& b = *static_cast<MyBuffer*>(item);
- int prev_char_is_space = b.begin()[-1]==' ';
- for( char* s=b.begin(); s!=b.end(); ++s ) {
- if( prev_char_is_space && islower((unsigned char)*s) )
- *s = toupper(*s);
- prev_char_is_space = isspace((unsigned char)*s);
- }
- return &b;
-}
-
-//! Filter that writes each buffer to a file.
-class MyOutputFilter: public tbb::filter {
- FILE* my_output_file;
-public:
- MyOutputFilter( FILE* output_file );
- /*override*/void* operator()( void* item );
-};
-
-MyOutputFilter::MyOutputFilter( FILE* output_file ) :
- tbb::filter(serial_in_order),
- my_output_file(output_file)
-{
-}
-
-void* MyOutputFilter::operator()( void* item ) {
- MyBuffer& b = *static_cast<MyBuffer*>(item);
- int n = (int) fwrite( b.begin(), 1, b.size(), my_output_file );
- if( n<=0 ) {
- fprintf(stderr,"Can't write into %s file\n", OutputFileName);
- exit(1);
- }
- return NULL;
-}
-
-static int NThread = tbb::task_scheduler_init::automatic;
-static bool is_number_of_threads_set = false;
-
-void Usage()
-{
- fprintf( stderr, "Usage:\ttext_filter [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;
-}
-
-int run_pipeline( int nthreads )
-{
- FILE* input_file = fopen(InputFileName,"r");
- if( !input_file ) {
- perror( InputFileName );
- Usage();
- return 0;
- }
- FILE* output_file = fopen(OutputFileName,"w");
- if( !output_file ) {
- perror( OutputFileName );
- return 0;
- }
-
- // Create the pipeline
- tbb::pipeline pipeline;
-
- // Create file-reading writing stage and add it to the pipeline
- MyInputFilter input_filter( input_file );
- pipeline.add_filter( input_filter );
-
- // Create capitalization stage and add it to the pipeline
- MyTransformFilter transform_filter;
- pipeline.add_filter( transform_filter );
-
- // Create file-writing stage and add it to the pipeline
- MyOutputFilter output_filter( output_file );
- pipeline.add_filter( output_filter );
-
- // Run the pipeline
- tbb::tick_count t0 = tbb::tick_count::now();
- pipeline.run( MyInputFilter::n_buffer );
- tbb::tick_count t1 = tbb::tick_count::now();
-
- 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("single thread run time = %g\n", (t1-t0).seconds());
- } else {
- printf("parallel run 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 single-thread and fully subscribed parallel versions
- { // single-threaded 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 (0))
- return 1;
- }
- }
- return 0;
-}
diff --git a/examples/pipeline/text_filter/vc7.1/text_filter.sln b/examples/pipeline/text_filter/vc7.1/text_filter.sln
deleted file mode 100644
index 1ca790a..0000000
--- a/examples/pipeline/text_filter/vc7.1/text_filter.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text_filter", "text_filter.vcproj", "{4A021AFA-E254-4BCE-918D-377DF1C0BEEF}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Debug.ActiveCfg = Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Debug.Build.0 = Debug|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Release.ActiveCfg = Release|Win32
- {4A021AFA-E254-4BCE-918D-377DF1C0BEEF}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/pipeline/text_filter/vc7.1/text_filter.suo b/examples/pipeline/text_filter/vc7.1/text_filter.suo
deleted file mode 100644
index 022ecbc..0000000
Binary files a/examples/pipeline/text_filter/vc7.1/text_filter.suo and /dev/null differ
diff --git a/examples/pipeline/text_filter/vc7.1/text_filter.vcproj b/examples/pipeline/text_filter/vc7.1/text_filter.vcproj
deleted file mode 100644
index 6a44177..0000000
--- a/examples/pipeline/text_filter/vc7.1/text_filter.vcproj
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="text_filter"
- ProjectGUID="{4A021AFA-E254-4BCE-918D-377DF1C0BEEF}"
- RootNamespace="text_filter"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs=""$(OutDir)\input.txt""/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs=""$(OutDir)\input.txt""/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\text_filter.cpp">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/text_filter/vc8/text_filter.sln b/examples/pipeline/text_filter/vc8/text_filter.sln
deleted file mode 100644
index 735b680..0000000
--- a/examples/pipeline/text_filter/vc8/text_filter.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text_filter", "text_filter.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411D}"
-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-39A03250411D}.Debug|Win32.ActiveCfg = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug|Win32.Build.0 = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug|x64.ActiveCfg = Debug|x64
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug|x64.Build.0 = Debug|x64
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|Win32.ActiveCfg = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|Win32.Build.0 = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|x64.ActiveCfg = Release|x64
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/examples/pipeline/text_filter/vc8/text_filter.suo b/examples/pipeline/text_filter/vc8/text_filter.suo
deleted file mode 100644
index c5ebac8..0000000
Binary files a/examples/pipeline/text_filter/vc8/text_filter.suo and /dev/null differ
diff --git a/examples/pipeline/text_filter/vc8/text_filter.vcproj b/examples/pipeline/text_filter/vc8/text_filter.vcproj
deleted file mode 100644
index b021e71..0000000
--- a/examples/pipeline/text_filter/vc8/text_filter.vcproj
+++ /dev/null
@@ -1,368 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="text_filter"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411D}"
- RootNamespace="text_filter"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\text_filter.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/text_filter/vc9/text_filter.sln b/examples/pipeline/text_filter/vc9/text_filter.sln
deleted file mode 100644
index 52cd61c..0000000
--- a/examples/pipeline/text_filter/vc9/text_filter.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text_filter", "text_filter.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411D}"
-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-39A03250411D}.Debug|Win32.ActiveCfg = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug|Win32.Build.0 = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug|x64.ActiveCfg = Debug|x64
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug|x64.Build.0 = Debug|x64
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|Win32.ActiveCfg = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|Win32.Build.0 = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|x64.ActiveCfg = Release|x64
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/examples/pipeline/text_filter/vc9/text_filter.suo b/examples/pipeline/text_filter/vc9/text_filter.suo
deleted file mode 100644
index b84c9a7..0000000
Binary files a/examples/pipeline/text_filter/vc9/text_filter.suo and /dev/null differ
diff --git a/examples/pipeline/text_filter/vc9/text_filter.vcproj b/examples/pipeline/text_filter/vc9/text_filter.vcproj
deleted file mode 100644
index 4d9f192..0000000
--- a/examples/pipeline/text_filter/vc9/text_filter.vcproj
+++ /dev/null
@@ -1,365 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="text_filter"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411D}"
- RootNamespace="text_filter"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- Description="Constructing input.txt"
- CommandLine="type ..\index.html >input.txt
for /L %%a in (1,1,500) do type ..\index.html >> input.txt"
- Outputs="input.txt"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\text_filter.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/pipeline/text_filter/xcode/text_filter.xcodeproj/project.pbxproj b/examples/pipeline/text_filter/xcode/text_filter.xcodeproj/project.pbxproj
deleted file mode 100644
index 20728ca..0000000
--- a/examples/pipeline/text_filter/xcode/text_filter.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,324 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 42;
- objects = {
-
-/* Begin PBXBuildFile section */
- A1F593A60B8F042A00073279 /* text_filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* text_filter.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 */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 8DD76F690486A84900D96B5E /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 12;
- dstPath = "";
- dstSubfolderSpec = 16;
- files = (
- A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 8DD76F6C0486A84900D96B5E /* text_filter */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = text_filter; sourceTree = BUILT_PRODUCTS_DIR; };
- A1F593A50B8F042A00073279 /* text_filter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = text_filter.cpp; path = ../text_filter.cpp; sourceTree = SOURCE_ROOT; };
- A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = /Library/Frameworks/TBB.framework/Libraries/libtbb.dylib; sourceTree = "<absolute>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 8DD76F660486A84900D96B5E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* text_filter */ = {
- isa = PBXGroup;
- children = (
- 08FB7795FE84155DC02AAC07 /* Source */,
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
- 1AB674ADFE9D54B511CA2CBB /* Products */,
- );
- name = text_filter;
- sourceTree = "<group>";
- };
- 08FB7795FE84155DC02AAC07 /* Source */ = {
- isa = PBXGroup;
- children = (
- A1F593A50B8F042A00073279 /* text_filter.cpp */,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 1AB674ADFE9D54B511CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 8DD76F6C0486A84900D96B5E /* text_filter */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
- isa = PBXGroup;
- children = (
- A1F593B30B8F06F900073279 /* libtbb.dylib */,
- );
- name = "External Frameworks and Libraries";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* text_filter */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "text_filter" */;
- buildPhases = (
- 8DD76F640486A84900D96B5E /* Sources */,
- 8DD76F660486A84900D96B5E /* Frameworks */,
- 8DD76F690486A84900D96B5E /* CopyFiles */,
- A1F594850B8F293800073279 /* ShellScript */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = text_filter;
- productInstallPath = "$(HOME)/bin";
- productName = text_filter;
- productReference = 8DD76F6C0486A84900D96B5E /* text_filter */;
- productType = "com.apple.product-type.tool";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 08FB7793FE84155DC02AAC07 /* Project object */ = {
- isa = PBXProject;
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "text_filter" */;
- compatibilityVersion = "Xcode 2.4";
- hasScannedForEncodings = 1;
- mainGroup = 08FB7794FE84155DC02AAC07 /* text_filter */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 8DD76F620486A84900D96B5E /* text_filter */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXShellScriptBuildPhase section */
- A1F594850B8F293800073279 /* ShellScript */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- outputPaths = (
- "$(TARGET_BUILD_DIR)/input.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "cat ../../index.html >$TARGET_BUILD_DIR/input.txt; for ((a=1; a <= 500 ; a++)); do cat ../../index.html >>$TARGET_BUILD_DIR/input.txt; done";
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 8DD76F640486A84900D96B5E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A1F593A60B8F042A00073279 /* text_filter.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
- 1DEB923208733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = text_filter;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 1DEB923308733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = text_filter;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 1DEB923608733DC60010E9CD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug;
- };
- 1DEB923708733DC60010E9CD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release;
- };
- A1F593C60B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = text_filter;
- ZERO_LINK = NO;
- };
- name = Debug64;
- };
- A1F593C70B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
- INSTALL_PATH = "$(HOME)/bin";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
- );
- LIBRARY_SEARCH_PATHS_QUOTED_1 = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/TBB.framework/Libraries\"";
- PRODUCT_NAME = text_filter;
- ZERO_LINK = NO;
- };
- name = Release64;
- };
- A1F593C80B8F0E6E00073279 /* Debug64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Debug64;
- };
- A1F593C90B8F0E6E00073279 /* Release64 */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = i386;
- GCC_ENABLE_CPP_RTTI = YES;
- GCC_MODEL_TUNING = "";
- GCC_VERSION = 4.0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- OTHER_CPLUSPLUSFLAGS = (
- "$(OTHER_CFLAGS)",
- "-m64",
- );
- OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
- PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- SYMROOT = "/tmp/tbb-$(USER)";
- };
- name = Release64;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "text_filter" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923208733DC60010E9CD /* Debug */,
- A1F593C60B8F0E6E00073279 /* Debug64 */,
- 1DEB923308733DC60010E9CD /* Release */,
- A1F593C70B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "text_filter" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1DEB923608733DC60010E9CD /* Debug */,
- A1F593C80B8F0E6E00073279 /* Debug64 */,
- 1DEB923708733DC60010E9CD /* Release */,
- A1F593C90B8F0E6E00073279 /* Release64 */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
-}
diff --git a/examples/task/tree_sum/Makefile b/examples/task/tree_sum/Makefile
index f7561cb..395e2eb 100644
--- a/examples/task/tree_sum/Makefile
+++ b/examples/task/tree_sum/Makefile
@@ -29,7 +29,9 @@ PROG=tree_sum
ARGS=
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/task/tree_sum/Makefile.windows b/examples/task/tree_sum/Makefile.windows
index 7757f80..b925faf 100644
--- a/examples/task/tree_sum/Makefile.windows
+++ b/examples/task/tree_sum/Makefile.windows
@@ -30,18 +30,25 @@
PROG=Tree_sum
ARGS=
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbbmalloc.lib tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug: compiler_check
$(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbbmalloc_debug.lib tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
$(PROG) -stdmalloc $(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/index.html b/examples/task/tree_sum/index.html
index c6f6d41..1f211b5 100644
--- a/examples/task/tree_sum/index.html
+++ b/examples/task/tree_sum/index.html
@@ -35,12 +35,8 @@ In addition, the scalable_allocator performs better for multi-threaded allocatio
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/task/tree_sum/msvs/tree_sum.icproj b/examples/task/tree_sum/msvs/tree_sum.icproj
new file mode 100644
index 0000000..9d4834c
--- /dev/null
+++ b/examples/task/tree_sum/msvs/tree_sum.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="tree_sum"
+ ProjectGUID="{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+ VCNestedProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ VCNestedProjectFileName="tree_sum.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/task/tree_sum/vc8/tree_sum.vcproj b/examples/task/tree_sum/msvs/tree_sum.vcproj
similarity index 76%
rename from examples/task/tree_sum/vc8/tree_sum.vcproj
rename to examples/task/tree_sum/msvs/tree_sum.vcproj
index 85f23de..4f85ec3 100644
--- a/examples/task/tree_sum/vc8/tree_sum.vcproj
+++ b/examples/task/tree_sum/msvs/tree_sum.vcproj
@@ -1,372 +1,372 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="tree_sum"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
- RootNamespace="tree_sum"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\common.h"
- >
- </File>
- <File
- RelativePath="..\main.cpp"
- >
- </File>
- <File
- RelativePath="..\OptimizedParallelSumTree.cpp"
- >
- </File>
- <File
- RelativePath="..\SerialSumTree.cpp"
- >
- </File>
- <File
- RelativePath="..\SimpleParallelSumTree.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="tree_sum"
+ ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ RootNamespace="tree_sum"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\common.h"
+ >
+ </File>
+ <File
+ RelativePath="..\main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\OptimizedParallelSumTree.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\SerialSumTree.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\SimpleParallelSumTree.cpp"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/task/tree_sum/vc8/tree_sum.sln b/examples/task/tree_sum/msvs/tree_sum_cl.sln
similarity index 97%
copy from examples/task/tree_sum/vc8/tree_sum.sln
copy to examples/task/tree_sum/msvs/tree_sum_cl.sln
index d417699..66c92d9 100644
--- a/examples/task/tree_sum/vc8/tree_sum.sln
+++ b/examples/task/tree_sum/msvs/tree_sum_cl.sln
@@ -1,25 +1,25 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_sum", "tree_sum.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
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_sum", "tree_sum.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/task/tree_sum/vc8/tree_sum.sln b/examples/task/tree_sum/msvs/tree_sum_icl.sln
similarity index 58%
copy from examples/task/tree_sum/vc8/tree_sum.sln
copy to examples/task/tree_sum/msvs/tree_sum_icl.sln
index d417699..7d25cdc 100644
--- a/examples/task/tree_sum/vc8/tree_sum.sln
+++ b/examples/task/tree_sum/msvs/tree_sum_icl.sln
@@ -1,25 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_sum", "tree_sum.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
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tree_sum", "tree_sum.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/task/tree_sum/vc7.1/tree_sum.sln b/examples/task/tree_sum/vc7.1/tree_sum.sln
deleted file mode 100644
index 2c1d774..0000000
--- a/examples/task/tree_sum/vc7.1/tree_sum.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_sum", "tree_sum.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411D}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug.ActiveCfg = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Debug.Build.0 = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release.ActiveCfg = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411D}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/task/tree_sum/vc7.1/tree_sum.suo b/examples/task/tree_sum/vc7.1/tree_sum.suo
deleted file mode 100644
index 60eb2f2..0000000
Binary files a/examples/task/tree_sum/vc7.1/tree_sum.suo and /dev/null differ
diff --git a/examples/task/tree_sum/vc7.1/tree_sum.vcproj b/examples/task/tree_sum/vc7.1/tree_sum.vcproj
deleted file mode 100644
index c2e575a..0000000
--- a/examples/task/tree_sum/vc7.1/tree_sum.vcproj
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="tree_sum"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411D}"
- RootNamespace="tree_sum"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbbmalloc.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\main.cpp">
- </File>
- <File
- RelativePath="..\OptimizedParallelSumTree.cpp">
- </File>
- <File
- RelativePath="..\SerialSumTree.cpp">
- </File>
- <File
- RelativePath="..\SimpleParallelSumTree.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="">
- <File
- RelativePath="..\common.h">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/task/tree_sum/vc8/tree_sum.suo b/examples/task/tree_sum/vc8/tree_sum.suo
deleted file mode 100644
index d03bcea..0000000
Binary files a/examples/task/tree_sum/vc8/tree_sum.suo and /dev/null differ
diff --git a/examples/task/tree_sum/vc9/tree_sum.suo b/examples/task/tree_sum/vc9/tree_sum.suo
deleted file mode 100644
index 2daf57a..0000000
Binary files a/examples/task/tree_sum/vc9/tree_sum.suo and /dev/null differ
diff --git a/examples/task/tree_sum/vc9/tree_sum.vcproj b/examples/task/tree_sum/vc9/tree_sum.vcproj
deleted file mode 100644
index d2549df..0000000
--- a/examples/task/tree_sum/vc9/tree_sum.vcproj
+++ /dev/null
@@ -1,369 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tree_sum"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
- RootNamespace="tree_sum"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)" && copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbbmalloc.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\common.h"
- >
- </File>
- <File
- RelativePath="..\main.cpp"
- >
- </File>
- <File
- RelativePath="..\OptimizedParallelSumTree.cpp"
- >
- </File>
- <File
- RelativePath="..\SerialSumTree.cpp"
- >
- </File>
- <File
- RelativePath="..\SimpleParallelSumTree.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/task_group/index.html b/examples/task_group/index.html
new file mode 100644
index 0000000..0765067
--- /dev/null
+++ b/examples/task_group/index.html
@@ -0,0 +1,24 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+This directory has examples of how to use task_groups.
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="sudoku/index.html">Sudoku</A>
+<DD>Compute all solutions for a Sudoku board.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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.
+</BODY>
+</HTML>
diff --git a/examples/parallel_reduce/primes/Makefile b/examples/task_group/sudoku/Makefile
similarity index 88%
copy from examples/parallel_reduce/primes/Makefile
copy to examples/task_group/sudoku/Makefile
index 3d295d6..ed50f3a 100644
--- a/examples/parallel_reduce/primes/Makefile
+++ b/examples/task_group/sudoku/Makefile
@@ -25,19 +25,21 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
-PROG=primes
-ARGS=100000000 0:4
+PROG=sudoku
+ARGS=input1 4 0 -p
# The C++ compiler
-#CXX=g++
+ifeq ($(CXX),icc)
+CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
+endif # icc
all: release test
release: *.cpp
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
+ $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) $(CXX0XFLAGS)
debug: *.cpp
- $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+ $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) $(CXX0XFLAGS)
clean:
$(RM) $(PROG) *.o *.d
diff --git a/examples/parallel_while/parallel_preorder/Makefile.windows b/examples/task_group/sudoku/Makefile.windows
similarity index 88%
rename from examples/parallel_while/parallel_preorder/Makefile.windows
rename to examples/task_group/sudoku/Makefile.windows
index e7371bf..1406a79 100644
--- a/examples/parallel_while/parallel_preorder/Makefile.windows
+++ b/examples/task_group/sudoku/Makefile.windows
@@ -27,11 +27,15 @@
# Common Makefile that builds and runs example.
# Just specify your program basename
-PROG=Parallel_Preorder
-ARGS=1:4
+PROG=sudoku
+ARGS=input1 4 2 -p
+
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
@@ -44,3 +48,5 @@ 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"
diff --git a/examples/task_group/sudoku/index.html b/examples/task_group/sudoku/index.html
new file mode 100644
index 0000000..2ab25dc
--- /dev/null
+++ b/examples/task_group/sudoku/index.html
@@ -0,0 +1,66 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+This directory contains a simple example that finds all solutions to a
+Sudoku board. It uses a straightforward state-space search algorithm
+that exhibits OR-parallelism. It can be optionally run until it
+obtains just the first solution. The point of the example is to teach
+how to use the task_group interface.
+
+<H2>Files</H2>
+<DL>
+<DT><A HREF="sudoku.cpp">sudoku.cpp</A>
+<DD>Driver.
+<DT><A HREF="input1">input1</A>
+<DD>Sample input file with modest number of solutions.
+
+<DT><A HREF="input2">input2</A>
+<DD>Sample input file with small number of solutions.
+
+<DT><A HREF="input3">input3</A>
+<DD>Sample input file with larger number of solutions.
+
+<DT><A HREF="input4">input4</A>
+<DD>Sample input file with very large number of solutions.
+
+<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.
+</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>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:
+<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>.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. 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.
+</BODY>
+</HTML>
diff --git a/examples/task_group/sudoku/input1 b/examples/task_group/sudoku/input1
new file mode 100644
index 0000000..6591752
--- /dev/null
+++ b/examples/task_group/sudoku/input1
@@ -0,0 +1,19 @@
+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
+
+
+
+
+
+
+
+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
diff --git a/examples/task_group/sudoku/input2 b/examples/task_group/sudoku/input2
new file mode 100644
index 0000000..4951425
--- /dev/null
+++ b/examples/task_group/sudoku/input2
@@ -0,0 +1,18 @@
+2 0 1 0 0 0 0 8 0 0 8 0 2 1 9 6 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 3 0 1 0 0 5 0 0 0 8 0 0 0 6
+
+
+
+
+
+
+2 0 1 0 0 0 0 8 0
+0 8 0 2 1 9 6 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 3 0 1 0 0
+5 0 0 0 8 0 0 0 6
diff --git a/examples/task_group/sudoku/input3 b/examples/task_group/sudoku/input3
new file mode 100644
index 0000000..e6cbb09
--- /dev/null
+++ b/examples/task_group/sudoku/input3
@@ -0,0 +1,19 @@
+1 0 0 9 0 0 0 8 0 0 0 0 2 0 0 0 0 0 0 0 5 0 0 0 7 0 0 0 5 2 6 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
+
+
+
+
+
+
+
+1 0 0 9 0 0 0 8 0
+0 0 0 2 0 0 0 0 0
+0 0 5 0 0 0 7 0 0
+
+0 5 2 6 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
diff --git a/examples/task_group/sudoku/input4 b/examples/task_group/sudoku/input4
new file mode 100644
index 0000000..9436cd7
--- /dev/null
+++ b/examples/task_group/sudoku/input4
@@ -0,0 +1,19 @@
+1 0 0 9 0 0 0 8 0 0 0 0 2 0 0 0 0 0 0 0 5 0 0 0 7 0 0 0 0 2 6 0 0 0 0 0 0 0 0 0 0 5 0 0 7 4 0 0 0 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
+
+
+
+
+
+
+
+1 0 0 9 0 0 0 8 0
+0 0 0 2 0 0 0 0 0
+0 0 5 0 0 0 7 0 0
+
+0 0 2 6 0 0 0 0 0
+0 0 0 0 0 5 0 0 7
+4 0 0 0 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
diff --git a/examples/task_group/sudoku/msvs/sudoku.icproj b/examples/task_group/sudoku/msvs/sudoku.icproj
new file mode 100644
index 0000000..d95f8b2
--- /dev/null
+++ b/examples/task_group/sudoku/msvs/sudoku.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="sudoku"
+ ProjectGUID="{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+ VCNestedProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ VCNestedProjectFileName="sudoku.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/primes/vc8/primes.vcproj b/examples/task_group/sudoku/msvs/sudoku.vcproj
similarity index 79%
rename from examples/parallel_reduce/primes/vc8/primes.vcproj
rename to examples/task_group/sudoku/msvs/sudoku.vcproj
index c183a09..ac1edcb 100644
--- a/examples/parallel_reduce/primes/vc8/primes.vcproj
+++ b/examples/task_group/sudoku/msvs/sudoku.vcproj
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="windows-1251"?>
+<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
- Name="primes"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
- RootNamespace="primes"
+ Name="sudoku"
+ ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ RootNamespace="sudoku"
Keyword="Win32Proj"
>
<Platforms>
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -61,9 +61,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -139,9 +139,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="17"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -216,9 +216,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -295,9 +295,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -342,7 +342,7 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
- RelativePath="..\primes.cpp"
+ RelativePath="..\sudoku.cpp"
>
</File>
</Filter>
diff --git a/examples/task/tree_sum/vc9/tree_sum.sln b/examples/task_group/sudoku/msvs/sudoku_cl.sln
similarity index 82%
rename from examples/task/tree_sum/vc9/tree_sum.sln
rename to examples/task_group/sudoku/msvs/sudoku_cl.sln
index 6a573d9..8b5504a 100644
--- a/examples/task/tree_sum/vc9/tree_sum.sln
+++ b/examples/task_group/sudoku/msvs/sudoku_cl.sln
@@ -1,6 +1,6 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_sum", "tree_sum.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}"
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sudoku", "sudoku.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/examples/task/tree_sum/vc8/tree_sum.sln b/examples/task_group/sudoku/msvs/sudoku_icl.sln
similarity index 58%
rename from examples/task/tree_sum/vc8/tree_sum.sln
rename to examples/task_group/sudoku/msvs/sudoku_icl.sln
index d417699..70d124d 100644
--- a/examples/task/tree_sum/vc8/tree_sum.sln
+++ b/examples/task_group/sudoku/msvs/sudoku_icl.sln
@@ -1,25 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_sum", "tree_sum.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
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "sudoku", "sudoku.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/task_group/sudoku/sudoku.cpp b/examples/task_group/sudoku/sudoku.cpp
new file mode 100644
index 0000000..0949e36
--- /dev/null
+++ b/examples/task_group/sudoku/sudoku.cpp
@@ -0,0 +1,284 @@
+/*
+ Copyright 2005-2010 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 <cstdlib>
+#include "tbb/atomic.h"
+#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/task_group.h"
+
+#pragma warning(disable: 4996)
+
+#define __TBB_LAMBDAS_PRESENT ( _MSC_VER >= 1600 && !__INTEL_COMPILER || __INTEL_COMPILER > 1100 && _TBB_CPP0X )
+
+const unsigned BOARD_SIZE=81;
+const unsigned BOARD_DIM=9;
+
+using namespace tbb;
+using namespace std;
+
+atomic<unsigned> nSols;
+unsigned NThreads, NSolutions;
+bool Verbose=false;
+unsigned short init_values[BOARD_SIZE];
+task_group *g;
+
+typedef struct {
+ unsigned short solved_element;
+ unsigned potential_set;
+} board_element;
+
+void read_board(char *filename) {
+ FILE *fp;
+ int input;
+ fp = fopen(filename, "r");
+ for (unsigned i=0; i<BOARD_SIZE; ++i) {
+ if (fscanf(fp, "%d", &input))
+ init_values[i] = input;
+ else {
+ fprintf(stderr, "sudoku: Error in input file at entry %d, assuming 0.\n", i);
+ init_values[i] = 0;
+ }
+ }
+ fclose(fp);
+}
+
+void print_board(board_element *b) {
+ for (unsigned row=0; row<BOARD_DIM; ++row) {
+ for (unsigned col=0; col<BOARD_DIM; ++col) {
+ printf(" %d", b[row*BOARD_DIM+col].solved_element);
+ if (col==2 || col==5) printf(" |");
+ }
+ printf("\n");
+ if (row==2 || row==5) printf(" ---------------------\n");
+ }
+}
+
+void print_potential_board(board_element *b) {
+ for (unsigned row=0; row<BOARD_DIM; ++row) {
+ for (unsigned col=0; col<BOARD_DIM; ++col) {
+ if (b[row*BOARD_DIM+col].solved_element)
+ printf(" %4d ", b[row*BOARD_DIM+col].solved_element);
+ else
+ printf(" [%4d]", b[row*BOARD_DIM+col].potential_set);
+ if (col==2 || col==5) printf(" |");
+ }
+ printf("\n");
+ if (row==2 || row==5)
+ printf(" ------------------------------------------------------------------\n");
+ }
+}
+
+void init_board(board_element *b) {
+ for (unsigned i=0; i<BOARD_SIZE; ++i)
+ b[i].solved_element = b[i].potential_set = 0;
+}
+
+void init_board(board_element *b, unsigned short arr[81]) {
+ for (unsigned i=0; i<BOARD_SIZE; ++i) {
+ b[i].solved_element = arr[i];
+ b[i].potential_set = 0;
+ }
+}
+
+void init_potentials(board_element *b) {
+ for (unsigned i=0; i<BOARD_SIZE; ++i)
+ b[i].potential_set = 0;
+}
+
+void copy_board(board_element *src, board_element *dst) {
+ for (unsigned i=0; i<BOARD_SIZE; ++i)
+ dst[i].solved_element = src[i].solved_element;
+}
+
+bool fixed_board(board_element *b) {
+ for (int i=BOARD_SIZE-1; i>=0; --i)
+ if (b[i].solved_element==0) return false;
+ return true;
+}
+
+bool in_row(board_element *b, unsigned row, unsigned col, unsigned short p) {
+ for (unsigned c=0; c<BOARD_DIM; ++c)
+ if (c!=col && b[row*BOARD_DIM+c].solved_element==p) return true;
+ return false;
+}
+
+bool in_col(board_element *b, unsigned row, unsigned col, unsigned short p) {
+ for (unsigned r=0; r<BOARD_DIM; ++r)
+ if (r!=row && b[r*BOARD_DIM+col].solved_element==p) return true;
+ return false;
+}
+
+bool in_block(board_element *b, unsigned row, unsigned col, unsigned short p) {
+ unsigned b_row = row/3 * 3, b_col = col/3 * 3;
+ for (unsigned i=b_row; i<b_row+3; ++i)
+ for (unsigned j=b_col; j<b_col+3; ++j)
+ if (!(i==row && j==col) && b[i*BOARD_DIM+j].solved_element==p) return true;
+ return false;
+}
+
+void calculate_potentials(board_element *b) {
+ for (unsigned i=0; i<BOARD_SIZE; ++i) {
+ b[i].potential_set = 0;
+ if (!b[i].solved_element) { // element is not yet fixed
+ unsigned row = i/BOARD_DIM, col = i%BOARD_DIM;
+ for (unsigned potential=1; potential<=BOARD_DIM; ++potential) {
+ if (!in_row(b, row, col, potential) && !in_col(b, row, col, potential)
+ && !in_block(b, row, col, potential))
+ b[i].potential_set |= 1<<(potential-1);
+ }
+ }
+ }
+}
+
+bool valid_board(board_element *b) {
+ bool success=true;
+ for (unsigned i=0; i<BOARD_SIZE; ++i) {
+ if (success && b[i].solved_element) { // element is fixed
+ unsigned row = i/BOARD_DIM, col = i%BOARD_DIM;
+ if (in_row(b, row, col, b[i].solved_element) || in_col(b, row, col, b[i].solved_element) || in_block(b, row, col, b[i].solved_element))
+ success = false;
+ }
+ }
+ return success;
+}
+
+bool examine_potentials(board_element *b, bool *progress) {
+ bool singletons = false;
+ for (unsigned i=0; i<BOARD_SIZE; ++i) {
+ if (b[i].solved_element==0 && b[i].potential_set==0) // empty set
+ return false;
+ switch (b[i].potential_set) {
+ case 1: { b[i].solved_element = 1; singletons=true; break; }
+ case 2: { b[i].solved_element = 2; singletons=true; break; }
+ case 4: { b[i].solved_element = 3; singletons=true; break; }
+ case 8: { b[i].solved_element = 4; singletons=true; break; }
+ case 16: { b[i].solved_element = 5; singletons=true; break; }
+ case 32: { b[i].solved_element = 6; singletons=true; break; }
+ case 64: { b[i].solved_element = 7; singletons=true; break; }
+ case 128: { b[i].solved_element = 8; singletons=true; break; }
+ case 256: { b[i].solved_element = 9; singletons=true; break; }
+ }
+ }
+ *progress = singletons;
+ return valid_board(b);
+}
+
+#if !__TBB_LAMBDAS_PRESENT
+void partial_solve(board_element *b, unsigned first_potential_set);
+
+class PartialSolveBoard {
+ board_element *b;
+ unsigned first_potential_set;
+public:
+ PartialSolveBoard(board_element *_b, unsigned fps) :
+ b(_b), first_potential_set(fps) {}
+ void operator() () const {
+ partial_solve(b, first_potential_set);
+ }
+};
+#endif
+
+void partial_solve(board_element *b, unsigned first_potential_set) {
+ if (fixed_board(b)) {
+ if (NSolutions == 1)
+ g->cancel();
+ if (++nSols==1 && Verbose) {
+ print_board(b);
+ }
+ free(b);
+ return;
+ }
+ calculate_potentials(b);
+ bool progress=true;
+ bool success = examine_potentials(b, &progress);
+ if (success && progress) {
+ partial_solve(b, first_potential_set);
+ } else if (success && !progress) {
+ board_element *new_board;
+ while (b[first_potential_set].solved_element!=0) ++first_potential_set;
+ for (unsigned short potential=1; potential<=BOARD_DIM; ++potential) {
+ if (1<<(potential-1) & b[first_potential_set].potential_set) {
+ new_board = (board_element *)malloc(BOARD_SIZE*sizeof(board_element));
+ copy_board(b, new_board);
+ new_board[first_potential_set].solved_element = potential;
+#if __TBB_LAMBDAS_PRESENT
+ g->run( [=]{ partial_solve(new_board, first_potential_set); } );
+#else
+ g->run(PartialSolveBoard(new_board, first_potential_set));
+#endif
+ }
+ }
+ free(b);
+ }
+ else {
+ free(b);
+ }
+}
+
+void ParseCommandLine(int argc, char *argv[]) {
+ if (argc < 4) {
+ fprintf(stderr,
+ "Usage: sudoku <inputfilename> <nthreads> <nSolutions> [-p]\n"
+ " nSolutions=1 stops after finding first solution\n"
+ " and any other value finds all solutions; \n"
+ " -p prints the first solution.\n");
+ exit(1);
+ }
+ else {
+ sscanf(argv[2], "%d", &NThreads);
+ sscanf(argv[3], "%d", &NSolutions);
+ }
+ if (argc==5) Verbose = true;
+}
+
+int main(int argc, char *argv[]) {
+ board_element *start_board;
+ start_board = (board_element *)malloc(BOARD_SIZE*sizeof(board_element));
+ NThreads = 1;
+ nSols = 0;
+ ParseCommandLine(argc, argv);
+ read_board(argv[1]);
+ 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();
+ delete g;
+
+ if (NSolutions == 1) {
+ printf("Sudoku: Time to find first solution on %d threads: %6.6f seconds.\n", NThreads, (t1 - t0).seconds());
+ }
+ 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/test_all/fibonacci/Makefile b/examples/test_all/fibonacci/Makefile
index b439374..526b2b9 100644
--- a/examples/test_all/fibonacci/Makefile
+++ b/examples/test_all/fibonacci/Makefile
@@ -29,7 +29,9 @@ PROG=fibonacci
ARGS=
# The C++ compiler
-#CXX=g++
+ifneq (,$(shell which icc 2>/dev/null))
+CXX=icc
+endif # icc
all: release test
diff --git a/examples/test_all/fibonacci/Makefile.windows b/examples/test_all/fibonacci/Makefile.windows
index 2f869fc..f79c429 100644
--- a/examples/test_all/fibonacci/Makefile.windows
+++ b/examples/test_all/fibonacci/Makefile.windows
@@ -30,17 +30,24 @@
PROG=Fibonacci
ARGS=
+# Trying to find if icl.exe is set
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX = $(CXX2:-=cl.exe)
+
# The C++ compiler options
-CXX = cl.exe
MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
+release: compiler_check
$(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
+debug: compiler_check
$(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+compiler_check:
+ @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+ @cmd.exe /C del compiler_test
diff --git a/examples/test_all/fibonacci/index.html b/examples/test_all/fibonacci/index.html
index df3f689..3e1e2ac 100644
--- a/examples/test_all/fibonacci/index.html
+++ b/examples/test_all/fibonacci/index.html
@@ -17,12 +17,8 @@ show any speedup on multiprocessors.
<H2>Directories</H2>
<DL>
-<DT><A HREF="vc7.1">vc7.1</A>
-<DD>Contains Microsoft* Visual Studio* .NET 2003 workspace for building and running the example.
-<DT><A HREF="vc8">vc8</A>
+<DT><A HREF="msvs">msvs</A>
<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
-<DT><A HREF="vc9">vc9</A>
-<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example.
<DT><A HREF="xcode">xcode</A>
<DD>Contains Xcode* IDE workspace for building and running the example.
</DL>
diff --git a/examples/test_all/fibonacci/msvs/fibonacci.icproj b/examples/test_all/fibonacci/msvs/fibonacci.icproj
new file mode 100644
index 0000000..1f5e5b4
--- /dev/null
+++ b/examples/test_all/fibonacci/msvs/fibonacci.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="fibonacci"
+ ProjectGUID="{123FDABA-4A55-4E79-AE28-58E90AA8256E}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252E}"
+ VCNestedProjectFileName="fibonacci.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/test_all/fibonacci/vc8/fibonacci.vcproj b/examples/test_all/fibonacci/msvs/fibonacci.vcproj
similarity index 81%
rename from examples/test_all/fibonacci/vc8/fibonacci.vcproj
rename to examples/test_all/fibonacci/msvs/fibonacci.vcproj
index d46a39f..b9955ca 100644
--- a/examples/test_all/fibonacci/vc8/fibonacci.vcproj
+++ b/examples/test_all/fibonacci/msvs/fibonacci.vcproj
@@ -1,356 +1,356 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="fibonacci"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252E}"
- RootNamespace="fibonacci"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc8\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc8\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\Fibonacci.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="fibonacci"
+ ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252E}"
+ RootNamespace="fibonacci"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\Fibonacci.cpp"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/test_all/fibonacci/vc8/fibonacci.sln b/examples/test_all/fibonacci/msvs/fibonacci_cl.sln
similarity index 97%
rename from examples/test_all/fibonacci/vc8/fibonacci.sln
rename to examples/test_all/fibonacci/msvs/fibonacci_cl.sln
index b2cb826..60dafea 100644
--- a/examples/test_all/fibonacci/vc8/fibonacci.sln
+++ b/examples/test_all/fibonacci/msvs/fibonacci_cl.sln
@@ -1,25 +1,25 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fibonacci", "fibonacci.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252E}"
-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-068F511A252E}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fibonacci", "fibonacci.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252E}"
+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-068F511A252E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/test_all/fibonacci/vc9/fibonacci.sln b/examples/test_all/fibonacci/msvs/fibonacci_icl.sln
similarity index 54%
rename from examples/test_all/fibonacci/vc9/fibonacci.sln
rename to examples/test_all/fibonacci/msvs/fibonacci_icl.sln
index 46a07de..70c5369 100644
--- a/examples/test_all/fibonacci/vc9/fibonacci.sln
+++ b/examples/test_all/fibonacci/msvs/fibonacci_icl.sln
@@ -1,25 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fibonacci", "fibonacci.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252E}"
-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-068F511A252E}.Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "fibonacci", "fibonacci.icproj", "{123FDABA-4A55-4E79-AE28-58E90AA8256E}"
+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
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Debug|Win32.Build.0 = Debug|Win32
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Debug|x64.ActiveCfg = Debug|x64
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Debug|x64.Build.0 = Debug|x64
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Release|Win32.ActiveCfg = Release|Win32
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Release|Win32.Build.0 = Release|Win32
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Release|x64.ActiveCfg = Release|x64
+ {123FDABA-4A55-4E79-AE28-58E90AA8256E}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/test_all/fibonacci/vc7.1/fibonacci.sln b/examples/test_all/fibonacci/vc7.1/fibonacci.sln
deleted file mode 100644
index 7fc4219..0000000
--- a/examples/test_all/fibonacci/vc7.1/fibonacci.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Fibonacci", "Fibonacci.vcproj", "{D3A5A89E-2165-45AD-97D4-1AB22D852826}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {D3A5A89E-2165-45AD-97D4-1AB22D852826}.Debug.ActiveCfg = Debug|Win32
- {D3A5A89E-2165-45AD-97D4-1AB22D852826}.Debug.Build.0 = Debug|Win32
- {D3A5A89E-2165-45AD-97D4-1AB22D852826}.Release.ActiveCfg = Release|Win32
- {D3A5A89E-2165-45AD-97D4-1AB22D852826}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/examples/test_all/fibonacci/vc7.1/fibonacci.suo b/examples/test_all/fibonacci/vc7.1/fibonacci.suo
deleted file mode 100644
index 74b19c3..0000000
Binary files a/examples/test_all/fibonacci/vc7.1/fibonacci.suo and /dev/null differ
diff --git a/examples/test_all/fibonacci/vc7.1/fibonacci.vcproj b/examples/test_all/fibonacci/vc7.1/fibonacci.vcproj
deleted file mode 100644
index 7504126..0000000
--- a/examples/test_all/fibonacci/vc7.1/fibonacci.vcproj
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="fibonacci"
- ProjectGUID="{D3A5A89E-2165-45AD-97D4-1AB22D852826}"
- RootNamespace="fibonacci"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb_debug.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc7.1\lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc7.1\bin\tbb.pdb" "$(OutDir)""/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx">
- <File
- RelativePath="..\fibonacci.cpp">
- </File>
- </Filter>
- <File
- RelativePath="..\index.html">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/examples/test_all/fibonacci/vc8/fibonacci.suo b/examples/test_all/fibonacci/vc8/fibonacci.suo
deleted file mode 100644
index dd720db..0000000
Binary files a/examples/test_all/fibonacci/vc8/fibonacci.suo and /dev/null differ
diff --git a/examples/test_all/fibonacci/vc9/fibonacci.suo b/examples/test_all/fibonacci/vc9/fibonacci.suo
deleted file mode 100644
index c80da6b..0000000
Binary files a/examples/test_all/fibonacci/vc9/fibonacci.suo and /dev/null differ
diff --git a/examples/test_all/fibonacci/vc9/fibonacci.vcproj b/examples/test_all/fibonacci/vc9/fibonacci.vcproj
deleted file mode 100644
index 941c14f..0000000
--- a/examples/test_all/fibonacci/vc9/fibonacci.vcproj
+++ /dev/null
@@ -1,353 +0,0 @@
-<?xml version="1.0" encoding="windows-1251"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="fibonacci"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252E}"
- RootNamespace="fibonacci"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\ia32\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\ia32\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb_debug.pdb" "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB22_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB22_INSTALL_DIR)\intel64\vc9\lib"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.dll" "$(OutDir)"
 copy "$(TBB22_INSTALL_DIR)\intel64\vc9\bin\tbb.pdb" "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\Fibonacci.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/include/tbb/_concurrent_queue_internal.h b/include/tbb/_concurrent_queue_internal.h
index 5abb8d8..a7bbbb8 100644
--- a/include/tbb/_concurrent_queue_internal.h
+++ b/include/tbb/_concurrent_queue_internal.h
@@ -35,9 +35,21 @@
#include "spin_mutex.h"
#include "cache_aligned_allocator.h"
#include "tbb_exception.h"
-#include <iterator>
#include <new>
+#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 <iterator>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+
namespace tbb {
#if !__TBB_TEMPLATE_FRIENDS_BROKEN
@@ -147,16 +159,12 @@ class micro_queue : no_copy {
~destroyer() {my_value.~T();}
};
- T& get_ref( page& page, size_t index ) {
- return static_cast<T*>(static_cast<void*>(&page+1))[index];
- }
-
void copy_item( page& dst, size_t index, const void* src ) {
new( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
}
void copy_item( page& dst, size_t dindex, const page& src, size_t sindex ) {
- new( &get_ref(dst,dindex) ) T( static_cast<const T*>(static_cast<const void*>(&src+1))[sindex] );
+ new( &get_ref(dst,dindex) ) T( get_ref(const_cast<page&>(src),sindex) );
}
void assign_and_destroy_item( void* dst, page& src, size_t index ) {
@@ -170,6 +178,19 @@ class micro_queue : no_copy {
public:
friend class micro_queue_pop_finalizer<T>;
+ struct padded_page: page {
+ //! Not defined anywhere - exists to quiet warnings.
+ padded_page();
+ //! Not defined anywhere - exists to quiet warnings.
+ void operator=( const padded_page& );
+ //! Must be last field.
+ T last;
+ };
+
+ static T& get_ref( page& p, size_t index ) {
+ return (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
+ }
+
atomic<page*> head_page;
atomic<ticket> head_counter;
@@ -196,7 +217,7 @@ void micro_queue<T>::spin_wait_until_my_turn( atomic<ticket>& counter, ticket k,
backoff.pause();
if( counter&1 ) {
++rb.n_invalid_entries;
- throw_bad_last_alloc_exception_v4();
+ throw_exception( eid_bad_last_alloc );
}
} while( counter!=k ) ;
}
@@ -207,10 +228,10 @@ void micro_queue<T>::push( const void* item, ticket k, concurrent_queue_base_v3<
page* p = NULL;
size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
if( !index ) {
- try {
+ __TBB_TRY {
concurrent_queue_page_allocator& pa = base;
p = pa.allocate_page();
- } catch (...) {
+ } __TBB_CATCH (...) {
++base.my_rep->n_invalid_entries;
invalidate_page_and_rethrow( k );
}
@@ -232,15 +253,15 @@ void micro_queue<T>::push( const void* item, ticket k, concurrent_queue_base_v3<
p = tail_page;
}
- try {
+ __TBB_TRY {
copy_item( *p, index, item );
// If no exception was thrown, mark item as present.
p->mask |= uintptr_t(1)<<index;
tail_counter += concurrent_queue_rep_base::n_queue;
- } catch (...) {
+ } __TBB_CATCH (...) {
++base.my_rep->n_invalid_entries;
tail_counter += concurrent_queue_rep_base::n_queue;
- throw;
+ __TBB_RETHROW();
}
}
@@ -274,7 +295,7 @@ micro_queue<T>& micro_queue<T>::assign( const micro_queue<T>& src, concurrent_qu
const page* srcp = src.head_page;
if( is_valid_page(srcp) ) {
ticket g_index = head_counter;
- try {
+ __TBB_TRY {
size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;
@@ -296,7 +317,7 @@ micro_queue<T>& micro_queue<T>::assign( const micro_queue<T>& src, concurrent_qu
cur_page = cur_page->next;
}
tail_page = cur_page;
- } catch (...) {
+ } __TBB_CATCH (...) {
invalidate_page_and_rethrow( g_index );
}
} else {
@@ -319,7 +340,7 @@ void micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
head_page = invalid_page;
tail_page = invalid_page;
}
- throw;
+ __TBB_RETHROW();
}
template<typename T>
@@ -410,15 +431,17 @@ protected:
typedef typename concurrent_queue_rep<T>::page page;
private:
+ typedef typename micro_queue<T>::padded_page padded_page;
+
/* override */ virtual page *allocate_page() {
concurrent_queue_rep<T>& r = *my_rep;
- size_t n = sizeof(page) + r.items_per_page*r.item_size;
+ size_t n = sizeof(padded_page) + (r.items_per_page-1)*sizeof(T);
return reinterpret_cast<page*>(allocate_block ( n ));
}
/* override */ virtual void deallocate_page( concurrent_queue_rep_base::page *p ) {
concurrent_queue_rep<T>& r = *my_rep;
- size_t n = sizeof(page) + r.items_per_page*r.item_size;
+ size_t n = sizeof(padded_page) + (r.items_per_page-1)*sizeof(T);
deallocate_block( reinterpret_cast<void*>(p), n );
}
@@ -429,7 +452,7 @@ private:
virtual void deallocate_block( void *p, size_t n ) = 0;
protected:
- concurrent_queue_base_v3( size_t item_size ) ;
+ concurrent_queue_base_v3();
/* override */ virtual ~concurrent_queue_base_v3() {
#if __TBB_USE_ASSERT
@@ -471,7 +494,8 @@ protected:
};
template<typename T>
-concurrent_queue_base_v3<T>::concurrent_queue_base_v3( size_t item_size ) {
+concurrent_queue_base_v3<T>::concurrent_queue_base_v3() {
+ const size_t item_size = sizeof(T);
my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
__TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, "alignment error" );
__TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, "alignment error" );
@@ -574,6 +598,7 @@ template<typename Container, typename Value> class concurrent_queue_iterator;
template<typename T>
class concurrent_queue_iterator_rep: no_assign {
+ typedef typename micro_queue<T>::padded_page padded_page;
public:
ticket head_counter;
const concurrent_queue_base_v3<T>& my_queue;
@@ -587,11 +612,11 @@ public:
}
//! Set item to point to kth element. Return true if at end of queue or item is marked valid; false otherwise.
- bool get_item( void*& item, size_t k ) ;
+ bool get_item( T*& item, size_t k ) ;
};
template<typename T>
-bool concurrent_queue_iterator_rep<T>::get_item( void*& item, size_t k ) {
+bool concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
if( k==my_queue.my_rep->tail_counter ) {
item = NULL;
return true;
@@ -599,16 +624,16 @@ bool concurrent_queue_iterator_rep<T>::get_item( void*& item, size_t k ) {
typename concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
__TBB_ASSERT(p,NULL);
size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
- item = static_cast<unsigned char*>(static_cast<void*>(p+1)) + my_queue.my_rep->item_size*i;
+ item = µ_queue<T>::get_ref(*p,i);
return (p->mask & uintptr_t(1)<<i)!=0;
}
}
-//! Type-independent portion of concurrent_queue_iterator.
+//! Constness-independent portion of concurrent_queue_iterator.
/** @ingroup containers */
template<typename Value>
class concurrent_queue_iterator_base_v3 : no_assign {
- //! Concurrentconcurrent_queue over which we are iterating.
+ //! Represents concurrent_queue over which we are iterating.
/** NULL if one past last element in queue. */
concurrent_queue_iterator_rep<Value>* my_rep;
@@ -619,9 +644,8 @@ class concurrent_queue_iterator_base_v3 : no_assign {
friend bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );
protected:
//! Pointer to current item
- mutable void* my_item;
+ Value* my_item;
-public:
//! Default constructor
concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
#if __GNUC__==4&&__GNUC_MINOR__==3
@@ -631,14 +655,14 @@ public:
}
//! Copy constructor
- concurrent_queue_iterator_base_v3( const concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
+ concurrent_queue_iterator_base_v3( const concurrent_queue_iterator_base_v3& i )
+ : no_assign(), my_rep(NULL), my_item(NULL) {
assign(i);
}
//! Construct iterator pointing to head of queue.
concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3<Value>& queue ) ;
-protected:
//! Assignment
void assign( const concurrent_queue_iterator_base_v3<Value>& other ) ;
@@ -681,7 +705,7 @@ void concurrent_queue_iterator_base_v3<Value>::advance() {
size_t k = my_rep->head_counter;
const concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
#if TBB_USE_ASSERT
- void* tmp;
+ Value* tmp;
my_rep->get_item(tmp,k);
__TBB_ASSERT( my_item==tmp, NULL );
#endif /* TBB_USE_ASSERT */
@@ -695,23 +719,18 @@ void concurrent_queue_iterator_base_v3<Value>::advance() {
if( !my_rep->get_item(my_item, k) ) advance();
}
-template<typename T>
-static inline const concurrent_queue_base_v3<const T>& add_constness( const concurrent_queue_base_v3<T>& q )
-{
- return *reinterpret_cast<const concurrent_queue_base_v3<const T> *>(&q) ;
-}
-
-template<typename T>
-static inline const concurrent_queue_iterator_base_v3<const T>& add_constness( const concurrent_queue_iterator_base_v3<T>& q )
-{
- return *reinterpret_cast<const concurrent_queue_iterator_base_v3<const T> *>(&q) ;
-}
+//! Similar to C++0x std::remove_cv
+/** "tbb_" prefix added to avoid overload confusion with C++0x implementations. */
+template<typename T> struct tbb_remove_cv {typedef T type;};
+template<typename T> struct tbb_remove_cv<const T> {typedef T type;};
+template<typename T> struct tbb_remove_cv<volatile T> {typedef T type;};
+template<typename T> struct tbb_remove_cv<const volatile T> {typedef T type;};
//! Meets requirements of a forward iterator for STL.
/** Value is either the T or const T type of the container.
@ingroup containers */
template<typename Container, typename Value>
-class concurrent_queue_iterator: public concurrent_queue_iterator_base_v3<Value>,
+class concurrent_queue_iterator: public concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>,
public std::iterator<std::forward_iterator_tag,Value> {
#if !__TBB_TEMPLATE_FRIENDS_BROKEN
template<typename T, class A>
@@ -721,30 +740,16 @@ public: // workaround for MSVC
#endif
//! Construct iterator pointing to head of queue.
concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :
- concurrent_queue_iterator_base_v3<Value>(queue)
- {
- }
-
- template<typename T>
- concurrent_queue_iterator( const concurrent_queue_base_v3<T>& other ) :
- concurrent_queue_iterator_base_v3<Value>(add_constness(other))
+ concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)
{
}
public:
concurrent_queue_iterator() {}
- //! Copy constructor
- concurrent_queue_iterator( const concurrent_queue_iterator<Container,Value>& other ) :
- concurrent_queue_iterator_base_v3<Value>(other)
- {
- }
-
- template<typename T>
- concurrent_queue_iterator( const concurrent_queue_iterator<Container,T>& other ) :
- concurrent_queue_iterator_base_v3<Value>(add_constness(other))
- {
- }
+ concurrent_queue_iterator( const concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
+ concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)
+ {}
//! Iterator assignment
concurrent_queue_iterator& operator=( const concurrent_queue_iterator& other ) {
@@ -826,6 +831,19 @@ protected:
//! Size of an item
size_t item_size;
+#if __TBB_GCC_3_3_PROTECTED_BROKEN
+public:
+#endif
+ template<typename T>
+ struct padded_page: page {
+ //! Not defined anywhere - exists to quiet warnings.
+ padded_page();
+ //! Not defined anywhere - exists to quiet warnings.
+ void operator=( const padded_page& );
+ //! Must be last field.
+ T last;
+ };
+
private:
virtual void copy_item( page& dst, size_t index, const void* src ) = 0;
virtual void assign_and_destroy_item( void* dst, page& src, size_t index ) = 0;
@@ -878,7 +896,7 @@ private:
//! Type-independent portion of concurrent_queue_iterator.
/** @ingroup containers */
class concurrent_queue_iterator_base_v3 {
- //! Concurrentconcurrent_queue over which we are iterating.
+ //! concurrent_queue over which we are iterating.
/** NULL if one past last element in queue. */
concurrent_queue_iterator_rep* my_rep;
@@ -887,9 +905,11 @@ class concurrent_queue_iterator_base_v3 {
template<typename C, typename T, typename U>
friend bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );
+
+ void initialize( const concurrent_queue_base_v3& queue, size_t offset_of_data );
protected:
//! Pointer to current item
- mutable void* my_item;
+ void* my_item;
//! Default constructor
concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
@@ -899,9 +919,13 @@ protected:
assign(i);
}
- //! Construct iterator pointing to head of queue.
+ //! Obsolete entry point for constructing iterator pointing to head of queue.
+ /** Does not work correctly for SSE types. */
__TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3& queue );
+ //! Construct iterator pointing to head of queue.
+ __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3& queue, size_t offset_of_data );
+
//! Assignment
void __TBB_EXPORTED_METHOD assign( const concurrent_queue_iterator_base_v3& i );
@@ -920,6 +944,7 @@ typedef concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
template<typename Container, typename Value>
class concurrent_queue_iterator: public concurrent_queue_iterator_base,
public std::iterator<std::forward_iterator_tag,Value> {
+
#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)
template<typename T, class A>
friend class ::tbb::concurrent_bounded_queue;
@@ -931,7 +956,7 @@ public: // workaround for MSVC
#endif
//! Construct iterator pointing to head of queue.
concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :
- concurrent_queue_iterator_base_v3(queue)
+ concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))
{
}
diff --git a/include/tbb/_concurrent_unordered_internal.h b/include/tbb/_concurrent_unordered_internal.h
new file mode 100644
index 0000000..66b0b97
--- /dev/null
+++ b/include/tbb/_concurrent_unordered_internal.h
@@ -0,0 +1,1440 @@
+/*
+ Copyright 2005-2010 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.
+*/
+
+/* 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
+
+#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
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
+#include <iterator>
+#include <utility> // Need std::pair
+#include <functional>
+#include <string> // For tbb_hasher
+#include <cstring> // Need std::memset
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+#include "tbb_machine.h"
+#include "tbb_exception.h"
+#include "tbb_allocator.h"
+
+namespace tbb {
+namespace interface5 {
+//! @cond INTERNAL
+namespace internal {
+
+template <typename T, typename Allocator>
+class split_ordered_list;
+template <typename Traits>
+class concurrent_unordered_base;
+
+// Forward list iterators (without skipping dummy elements)
+template<class Solist, typename Value>
+class flist_iterator : public std::iterator<std::forward_iterator_tag, Value>
+{
+ template <typename T, typename Allocator>
+ friend class split_ordered_list;
+ template <typename Traits>
+ friend class concurrent_unordered_base;
+ template<class M, typename V>
+ friend class flist_iterator;
+
+ typedef typename Solist::nodeptr_t nodeptr_t;
+public:
+ typedef typename Solist::value_type value_type;
+ typedef typename Solist::difference_type difference_type;
+ typedef typename Solist::pointer pointer;
+ typedef typename Solist::reference reference;
+
+ flist_iterator() : my_node_ptr(0) {}
+ flist_iterator( const flist_iterator<Solist, typename Solist::value_type> &other )
+ : my_node_ptr(other.my_node_ptr) {}
+
+ reference operator*() const { return my_node_ptr->my_element; }
+ pointer operator->() const { return &**this; }
+
+ flist_iterator& operator++() {
+ my_node_ptr = my_node_ptr->my_next;
+ return *this;
+ }
+
+ flist_iterator operator++(int) {
+ flist_iterator tmp = *this;
+ ++*this;
+ return tmp;
+ }
+
+protected:
+ flist_iterator(nodeptr_t pnode) : my_node_ptr(pnode) {}
+ nodeptr_t get_node_ptr() const { return my_node_ptr; }
+
+ nodeptr_t my_node_ptr;
+
+ template<typename M, typename T, typename U>
+ friend bool operator==( const flist_iterator<M,T> &i, const flist_iterator<M,U> &j );
+ template<typename M, typename T, typename U>
+ friend bool operator!=( const flist_iterator<M,T>& i, const flist_iterator<M,U>& j );
+};
+
+template<typename Solist, typename T, typename U>
+bool operator==( const flist_iterator<Solist,T> &i, const flist_iterator<Solist,U> &j ) {
+ return i.my_node_ptr == j.my_node_ptr;
+}
+template<typename Solist, typename T, typename U>
+bool operator!=( const flist_iterator<Solist,T>& i, const flist_iterator<Solist,U>& j ) {
+ return i.my_node_ptr != j.my_node_ptr;
+}
+
+// Split-order list iterators, needed to skip dummy elements
+template<class Solist, typename Value>
+class solist_iterator : public flist_iterator<Solist, Value>
+{
+ typedef flist_iterator<Solist, Value> base_type;
+ typedef typename Solist::nodeptr_t nodeptr_t;
+ using base_type::get_node_ptr;
+ template <typename T, typename Allocator>
+ friend class split_ordered_list;
+ template<class M, typename V>
+ friend class solist_iterator;
+ template<typename M, typename T, typename U>
+ friend bool operator==( const solist_iterator<M,T> &i, const solist_iterator<M,U> &j );
+ template<typename M, typename T, typename U>
+ friend bool operator!=( const solist_iterator<M,T>& i, const solist_iterator<M,U>& j );
+
+ const Solist *my_list_ptr;
+ solist_iterator(nodeptr_t pnode, const Solist *plist) : base_type(pnode), my_list_ptr(plist) {}
+
+public:
+ typedef typename Solist::value_type value_type;
+ typedef typename Solist::difference_type difference_type;
+ typedef typename Solist::pointer pointer;
+ typedef typename Solist::reference reference;
+
+ solist_iterator() {}
+ solist_iterator(const solist_iterator<Solist, typename Solist::value_type> &other )
+ : base_type(other), my_list_ptr(other.my_list_ptr) {}
+
+ reference operator*() const {
+ return this->base_type::operator*();
+ }
+
+ pointer operator->() const {
+ return (&**this);
+ }
+
+ solist_iterator& operator++() {
+ do ++(*(base_type *)this);
+ while (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
+
+ return (*this);
+ }
+
+ solist_iterator operator++(int) {
+ solist_iterator tmp = *this;
+ do ++*this;
+ while (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
+
+ return (tmp);
+ }
+};
+
+template<typename Solist, typename T, typename U>
+bool operator==( const solist_iterator<Solist,T> &i, const solist_iterator<Solist,U> &j ) {
+ return i.my_node_ptr == j.my_node_ptr && i.my_list_ptr == j.my_list_ptr;
+}
+template<typename Solist, typename T, typename U>
+bool operator!=( const solist_iterator<Solist,T>& i, const solist_iterator<Solist,U>& j ) {
+ return i.my_node_ptr != j.my_node_ptr || i.my_list_ptr != j.my_list_ptr;
+}
+
+// Forward type and class definitions
+typedef size_t sokey_t;
+
+// Forward list in which elements are sorted in a split-order
+template <typename T, typename Allocator>
+class split_ordered_list
+{
+public:
+ typedef split_ordered_list<T, Allocator> self_type;
+ typedef typename Allocator::template rebind<T>::other allocator_type;
+ struct node;
+ typedef node *nodeptr_t;
+
+ typedef typename allocator_type::size_type size_type;
+ typedef typename allocator_type::difference_type difference_type;
+ typedef typename allocator_type::pointer pointer;
+ typedef typename allocator_type::const_pointer const_pointer;
+ typedef typename allocator_type::reference reference;
+ typedef typename allocator_type::const_reference const_reference;
+ typedef typename allocator_type::value_type value_type;
+
+ typedef solist_iterator<self_type, const value_type> const_iterator;
+ typedef solist_iterator<self_type, value_type> iterator;
+ typedef flist_iterator<self_type, const value_type> raw_const_iterator;
+ typedef flist_iterator<self_type, value_type> raw_iterator;
+
+ // Node that holds the element in a split-ordered list
+ struct node : tbb::internal::no_assign
+ {
+ // Initialize the node with the given order key
+ void init(sokey_t order_key) {
+ my_order_key = order_key;
+ my_next = NULL;
+ }
+
+ // Return the order key (needed for hashing)
+ sokey_t get_order_key() const { // TODO: remove
+ return my_order_key;
+ }
+
+ // Inserts the new element in the list in an atomic fashion
+ nodeptr_t atomic_set_next(nodeptr_t new_node, nodeptr_t current_node)
+ {
+ // Try to change the next pointer on the current element to a new element, only if it still points to the cached next
+ nodeptr_t exchange_node = (nodeptr_t) __TBB_CompareAndSwapW((void *) &my_next, (uintptr_t)new_node, (uintptr_t)current_node);
+
+ if (exchange_node == current_node) // TODO: why this branch?
+ {
+ // Operation succeeded, return the new node
+ return new_node;
+ }
+ else
+ {
+ // Operation failed, return the "interfering" node
+ return exchange_node;
+ }
+ }
+
+ // Checks if this element in the list is a dummy, order enforcing node. Dummy nodes are used by buckets
+ // in the hash table to quickly index into the right subsection of the split-ordered list.
+ bool is_dummy() const {
+ return (my_order_key & 0x1) == 0;
+ }
+
+
+ nodeptr_t my_next; // Next element in the list
+ value_type my_element; // Element storage
+ sokey_t my_order_key; // Order key for this element
+ };
+
+ // Allocate a new node with the given order key and value
+ nodeptr_t create_node(sokey_t order_key, const T &value) {
+ nodeptr_t pnode = my_node_allocator.allocate(1);
+
+ __TBB_TRY {
+ new(static_cast<void*>(&pnode->my_element)) T(value);
+ pnode->init(order_key);
+ } __TBB_CATCH(...) {
+ my_node_allocator.deallocate(pnode, 1);
+ __TBB_RETHROW();
+ }
+
+ return (pnode);
+ }
+
+ // Allocate a new node with the given order key; used to allocate dummy nodes
+ nodeptr_t create_node(sokey_t order_key) {
+ nodeptr_t pnode = my_node_allocator.allocate(1);
+
+ __TBB_TRY {
+ new(static_cast<void*>(&pnode->my_element)) T();
+ pnode->init(order_key);
+ } __TBB_CATCH(...) {
+ my_node_allocator.deallocate(pnode, 1);
+ __TBB_RETHROW();
+ }
+
+ return (pnode);
+ }
+
+ split_ordered_list(allocator_type a = allocator_type())
+ : my_node_allocator(a), my_element_count(0)
+ {
+ // Immediately allocate a dummy node with order key of 0. This node
+ // will always be the head of the list.
+ my_head = create_node(0);
+ }
+
+ ~split_ordered_list()
+ {
+ // Clear the list
+ clear();
+
+ // Remove the head element which is not cleared by clear()
+ nodeptr_t pnode = my_head;
+ my_head = NULL;
+
+ __TBB_ASSERT(pnode != NULL && pnode->my_next == NULL, "Invalid head list node");
+
+ destroy_node(pnode);
+ }
+
+ // Common forward list functions
+
+ allocator_type get_allocator() const {
+ return (my_node_allocator);
+ }
+
+ void clear() {
+ nodeptr_t pnext;
+ nodeptr_t pnode = my_head;
+
+ __TBB_ASSERT(my_head != NULL, "Invalid head list node");
+ pnext = pnode->my_next;
+ pnode->my_next = NULL;
+ pnode = pnext;
+
+ while (pnode != NULL)
+ {
+ pnext = pnode->my_next;
+ destroy_node(pnode);
+ pnode = pnext;
+ }
+
+ my_element_count = 0;
+ }
+
+ // Returns a first non-dummy element in the SOL
+ iterator begin() {
+ return first_real_iterator(raw_begin());
+ }
+
+ // Returns a first non-dummy element in the SOL
+ const_iterator begin() const {
+ return first_real_iterator(raw_begin());
+ }
+
+ iterator end() {
+ return (iterator(0, this));
+ }
+
+ const_iterator end() const {
+ return (const_iterator(0, this));
+ }
+
+ const_iterator cbegin() const {
+ return (((const self_type *)this)->begin());
+ }
+
+ const_iterator cend() const {
+ return (((const self_type *)this)->end());
+ }
+
+ // Checks if the number of elements (non-dummy) is 0
+ bool empty() const {
+ return (my_element_count == 0);
+ }
+
+ // Returns the number of non-dummy elements in the list
+ size_type size() const {
+ return my_element_count;
+ }
+
+ // Returns the maximum size of the list, determined by the allocator
+ size_type max_size() const {
+ return my_node_allocator.max_size();
+ }
+
+ // Swaps 'this' list with the passed in one
+ void swap(self_type& other)
+ {
+ if (this == &other)
+ {
+ // Nothing to do
+ return;
+ }
+
+ std::swap(my_element_count, other.my_element_count);
+ std::swap(my_head, other.my_head);
+ }
+
+ // Split-order list functions
+
+ // Returns a first element in the SOL, which is always a dummy
+ raw_iterator raw_begin() {
+ return raw_iterator(my_head);
+ }
+
+ // Returns a first element in the SOL, which is always a dummy
+ raw_const_iterator raw_begin() const {
+ return raw_const_iterator(my_head);
+ }
+
+ raw_iterator raw_end() {
+ return raw_iterator(0);
+ }
+
+ raw_const_iterator raw_end() const {
+ return raw_const_iterator(0);
+ }
+
+ static sokey_t get_order_key(const raw_const_iterator& it) {
+ return it.get_node_ptr()->get_order_key();
+ }
+
+ static sokey_t get_safe_order_key(const raw_const_iterator& it) {
+ if( !it.get_node_ptr() ) return sokey_t(~0U);
+ return it.get_node_ptr()->get_order_key();
+ }
+
+ // Returns a public iterator version of the internal iterator. Public iterator must not
+ // be a dummy private iterator.
+ iterator get_iterator(raw_iterator it) {
+ __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), "Invalid user node (dummy)");
+ return iterator(it.get_node_ptr(), this);
+ }
+
+ // Returns a public iterator version of the internal iterator. Public iterator must not
+ // be a dummy private iterator.
+ const_iterator get_iterator(raw_const_iterator it) const {
+ __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), "Invalid user node (dummy)");
+ return const_iterator(it.get_node_ptr(), this);
+ }
+
+ // Returns a non-const version of the raw_iterator
+ raw_iterator get_iterator(raw_const_iterator it) {
+ return raw_iterator(it.get_node_ptr());
+ }
+
+ // Returns a non-const version of the iterator
+ static iterator get_iterator(const_iterator it) {
+ return iterator(it.my_node_ptr, it.my_list_ptr);
+ }
+
+ // Returns a public iterator version of a first non-dummy internal iterator at or after
+ // the passed in internal iterator.
+ iterator first_real_iterator(raw_iterator it)
+ {
+ // Skip all dummy, internal only iterators
+ while (it != raw_end() && it.get_node_ptr()->is_dummy())
+ ++it;
+
+ return iterator(it.get_node_ptr(), this);
+ }
+
+ // Returns a public iterator version of a first non-dummy internal iterator at or after
+ // the passed in internal iterator.
+ const_iterator first_real_iterator(raw_const_iterator it) const
+ {
+ // Skip all dummy, internal only iterators
+ while (it != raw_end() && it.get_node_ptr()->is_dummy())
+ ++it;
+
+ return const_iterator(it.get_node_ptr(), this);
+ }
+
+ // Erase an element using the allocator
+ void destroy_node(nodeptr_t pnode) {
+ my_node_allocator.destroy(pnode);
+ my_node_allocator.deallocate(pnode, 1);
+ }
+
+ // Try to insert a new element in the list. If insert fails, return the node that
+ // was inserted instead.
+ nodeptr_t try_insert(nodeptr_t previous, nodeptr_t new_node, nodeptr_t current_node) {
+ new_node->my_next = current_node;
+ return previous->atomic_set_next(new_node, current_node);
+ }
+
+ // Insert a new element between passed in iterators
+ std::pair<iterator, bool> try_insert(raw_iterator it, raw_iterator next, const value_type &value, sokey_t order_key, size_type *new_count)
+ {
+ nodeptr_t pnode = create_node(order_key, value);
+ nodeptr_t inserted_node = try_insert(it.get_node_ptr(), pnode, next.get_node_ptr());
+
+ if (inserted_node == pnode)
+ {
+ // If the insert succeeded, check that the order is correct and increment the element count
+ check_range();
+ *new_count = __TBB_FetchAndAddW((uintptr_t*)&my_element_count, uintptr_t(1));
+ return std::pair<iterator, bool>(iterator(pnode, this), true);
+ }
+ else
+ {
+ // If the insert failed (element already there), then delete the new one
+ destroy_node(pnode);
+ return std::pair<iterator, bool>(end(), false);
+ }
+ }
+
+ // Insert a new dummy element, starting search at a parent dummy element
+ raw_iterator insert_dummy(raw_iterator it, sokey_t order_key)
+ {
+ raw_iterator last = raw_end();
+ raw_iterator where = it;
+
+ __TBB_ASSERT(where != last, "Invalid head node");
+
+ ++where;
+
+ // Create a dummy element up front, even though it may be discarded (due to concurrent insertion)
+ nodeptr_t dummy_node = create_node(order_key);
+
+ for (;;)
+ {
+ __TBB_ASSERT(it != last, "Invalid head list node");
+
+ // If the head iterator is at the end of the list, or past the point where this dummy
+ // node needs to be inserted, then try to insert it.
+ if (where == last || get_order_key(where) > order_key)
+ {
+ __TBB_ASSERT(get_order_key(it) < order_key, "Invalid node order in the list");
+
+ // Try to insert it in the right place
+ nodeptr_t inserted_node = try_insert(it.get_node_ptr(), dummy_node, where.get_node_ptr());
+
+ if (inserted_node == dummy_node)
+ {
+ // Insertion succeeded, check the list for order violations
+ check_range();
+ return raw_iterator(dummy_node);
+ }
+ else
+ {
+ // Insertion failed: either dummy node was inserted by another thread, or
+ // a real element was inserted at exactly the same place as dummy node.
+ // Proceed with the search from the previous location where order key was
+ // known to be larger (note: this is legal only because there is no safe
+ // concurrent erase operation supported).
+ where = it;
+ ++where;
+ continue;
+ }
+ }
+ else if (get_order_key(where) == order_key)
+ {
+ // Another dummy node with the same value found, discard the new one.
+ destroy_node(dummy_node);
+ return where;
+ }
+
+ // Move the iterator forward
+ it = where;
+ ++where;
+ }
+
+ }
+
+ // This erase function can handle both real and dummy nodes
+ void erase_node(raw_iterator previous, raw_const_iterator& where)
+ {
+ nodeptr_t pnode = (where++).get_node_ptr();
+ nodeptr_t prevnode = previous.get_node_ptr();
+ __TBB_ASSERT(prevnode->my_next == pnode, "Erase must take consecutive iterators");
+ prevnode->my_next = pnode->my_next;
+
+ destroy_node(pnode);
+ }
+
+ // Erase the element (previous node needs to be passed because this is a forward only list)
+ iterator erase_node(raw_iterator previous, const_iterator where)
+ {
+ raw_const_iterator it = where;
+ erase_node(previous, it);
+ my_element_count--;
+
+ return get_iterator(first_real_iterator(it));
+ }
+
+ // Move all elements from the passed in split-ordered list to this one
+ void move_all(self_type& source)
+ {
+ raw_const_iterator first = source.raw_begin();
+ raw_const_iterator last = source.raw_end();
+
+ if (first == last)
+ return;
+
+ nodeptr_t previous_node = my_head;
+ raw_const_iterator begin_iterator = first++;
+
+ // Move all elements one by one, including dummy ones
+ for (raw_const_iterator it = first; it != last;)
+ {
+ nodeptr_t pnode = it.get_node_ptr();
+
+ nodeptr_t dummy_node = pnode->is_dummy() ? create_node(pnode->get_order_key()) : create_node(pnode->get_order_key(), pnode->my_element);
+ previous_node = try_insert(previous_node, dummy_node, NULL);
+ __TBB_ASSERT(previous_node != NULL, "Insertion must succeed");
+ raw_const_iterator where = it++;
+ source.erase_node(get_iterator(begin_iterator), where);
+ }
+ check_range();
+ }
+
+
+private:
+
+ // Check the list for order violations
+ void check_range()
+ {
+#if TBB_USE_ASSERT
+ for (raw_iterator it = raw_begin(); it != raw_end(); ++it)
+ {
+ raw_iterator next_iterator = it;
+ ++next_iterator;
+
+ __TBB_ASSERT(next_iterator == end() || next_iterator.get_node_ptr()->get_order_key() >= it.get_node_ptr()->get_order_key(), "!!! List order inconsistency !!!");
+ }
+#endif
+ }
+
+ typename allocator_type::template rebind<node>::other my_node_allocator; // allocator object for nodes
+ size_type my_element_count; // Total item count, not counting dummy nodes
+ nodeptr_t my_head; // pointer to head node
+};
+
+// Template class for hash compare
+template<typename Key, typename Hasher, typename Key_equality>
+class hash_compare
+{
+public:
+ hash_compare() {}
+
+ hash_compare(Hasher a_hasher) : my_hash_object(a_hasher) {}
+
+ hash_compare(Hasher a_hasher, Key_equality a_keyeq) : my_hash_object(a_hasher), my_key_compare_object(a_keyeq) {}
+
+ size_t operator()(const Key& key) const {
+ return ((size_t)my_hash_object(key));
+ }
+
+ bool operator()(const Key& key1, const Key& key2) const {
+ return (!my_key_compare_object(key1, key2));
+ }
+
+ Hasher my_hash_object; // The hash object
+ Key_equality my_key_compare_object; // The equality comparator object
+};
+
+#if _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it (for allow_multimapping)
+#endif
+
+template <typename Traits>
+class concurrent_unordered_base : public Traits
+{
+protected:
+ // Type definitions
+ typedef concurrent_unordered_base<Traits> self_type;
+ typedef typename Traits::value_type value_type;
+ typedef typename Traits::key_type key_type;
+ typedef typename Traits::hash_compare hash_compare;
+ typedef typename Traits::value_compare value_compare;
+ typedef typename Traits::allocator_type allocator_type;
+ typedef typename allocator_type::pointer pointer;
+ typedef typename allocator_type::const_pointer const_pointer;
+ typedef typename allocator_type::reference reference;
+ typedef typename allocator_type::const_reference const_reference;
+ typedef typename allocator_type::size_type size_type;
+ typedef typename allocator_type::difference_type difference_type;
+ typedef split_ordered_list<value_type, typename Traits::allocator_type> solist_t;
+ typedef typename solist_t::nodeptr_t nodeptr_t;
+ // Iterators that walk the entire split-order list, including dummy nodes
+ typedef typename solist_t::raw_iterator raw_iterator;
+ typedef typename solist_t::raw_const_iterator raw_const_iterator;
+ typedef typename solist_t::iterator iterator; // TODO: restore const iterator for unordered_sets
+ typedef typename solist_t::const_iterator const_iterator;
+ typedef iterator local_iterator;
+ typedef const_iterator const_local_iterator;
+ using Traits::my_hash_compare;
+ using Traits::get_key;
+ using Traits::allow_multimapping;
+
+private:
+ typedef std::pair<iterator, iterator> pairii_t;
+ typedef std::pair<const_iterator, const_iterator> paircc_t;
+
+ static size_type const pointers_per_table = sizeof(size_type) * 8; // One bucket segment per bit
+ static const size_type initial_bucket_number = 8; // Initial number of buckets
+ static const size_type initial_bucket_load = 4; // Initial maximum number of elements per bucket
+
+protected:
+ // Constructors/Destructors
+ concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,
+ const hash_compare& hc = hash_compare(), const allocator_type& a = allocator_type())
+ : Traits(hc), my_number_of_buckets(n_of_buckets), my_solist(a),
+ my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)
+ {
+ internal_init();
+ }
+
+ concurrent_unordered_base(const concurrent_unordered_base& right, const allocator_type& a)
+ : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
+ {
+ internal_copy(right);
+ }
+
+ concurrent_unordered_base(const concurrent_unordered_base& right)
+ : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
+ {
+ internal_init();
+ internal_copy(right);
+ }
+
+ concurrent_unordered_base& operator=(const concurrent_unordered_base& right) {
+ if (this != &right)
+ internal_copy(right);
+ return (*this);
+ }
+
+ ~concurrent_unordered_base() {
+ // Delete all node segments
+ internal_clear();
+ }
+
+public:
+ allocator_type get_allocator() const {
+ return my_solist.get_allocator();
+ }
+
+ // Size and capacity function
+ bool empty() const {
+ return my_solist.empty();
+ }
+
+ size_type size() const {
+ return my_solist.size();
+ }
+
+ size_type max_size() const {
+ return my_solist.max_size();
+ }
+
+ // Iterators
+ iterator begin() {
+ return my_solist.begin();
+ }
+
+ const_iterator begin() const {
+ return my_solist.begin();
+ }
+
+ iterator end() {
+ return my_solist.end();
+ }
+
+ const_iterator end() const {
+ return my_solist.end();
+ }
+
+ const_iterator cbegin() const {
+ return my_solist.cbegin();
+ }
+
+ const_iterator cend() const {
+ return my_solist.cend();
+ }
+
+ // Parallel traversal support
+ class const_range_type : tbb::internal::no_assign {
+ const concurrent_unordered_base &my_table;
+ raw_const_iterator my_begin_node;
+ raw_const_iterator my_end_node;
+ mutable raw_const_iterator my_midpoint_node;
+ public:
+ //! Type for size of a range
+ typedef typename concurrent_unordered_base::size_type size_type;
+ typedef typename concurrent_unordered_base::value_type value_type;
+ typedef typename concurrent_unordered_base::reference reference;
+ typedef typename concurrent_unordered_base::difference_type difference_type;
+ typedef typename concurrent_unordered_base::const_iterator iterator;
+
+ //! True if range is empty.
+ bool empty() const {return my_begin_node == my_end_node;}
+
+ //! True if range can be partitioned into two subranges.
+ bool is_divisible() const {
+ return my_midpoint_node != my_end_node;
+ }
+ //! Split range.
+ const_range_type( const_range_type &r, split ) :
+ my_table(r.my_table), my_end_node(r.my_end_node)
+ {
+ r.my_end_node = my_begin_node = r.my_midpoint_node;
+ __TBB_ASSERT( !empty(), "Splitting despite the range is not divisible" );
+ __TBB_ASSERT( !r.empty(), "Splitting despite the range is not divisible" );
+ set_midpoint();
+ r.set_midpoint();
+ }
+ //! Init range with container and grainsize specified
+ const_range_type( const concurrent_unordered_base &a_table ) :
+ my_table(a_table), my_begin_node(a_table.my_solist.begin()),
+ my_end_node(a_table.my_solist.end())
+ {
+ set_midpoint();
+ }
+ iterator begin() const { return my_table.my_solist.get_iterator(my_begin_node); }
+ iterator end() const { return my_table.my_solist.get_iterator(my_end_node); }
+ //! The grain size for this range.
+ size_type grainsize() const { return 1; }
+
+ //! Set my_midpoint_node to point approximately half way between my_begin_node and my_end_node.
+ void set_midpoint() const {
+ if( my_begin_node == my_end_node ) // not divisible
+ my_midpoint_node = my_end_node;
+ else {
+ sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
+ sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
+ size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
+ while ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
+ my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
+ if( my_midpoint_node == my_begin_node )
+ my_midpoint_node = my_end_node;
+#if TBB_USE_ASSERT
+ else {
+ sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
+ __TBB_ASSERT( begin_key < mid_key, "my_begin_node is after my_midpoint_node" );
+ __TBB_ASSERT( mid_key <= end_key, "my_midpoint_node is after my_end_node" );
+ }
+#endif // TBB_USE_ASSERT
+ }
+ }
+ };
+
+ class range_type : public const_range_type {
+ public:
+ typedef typename concurrent_unordered_base::iterator iterator;
+ //! Split range.
+ range_type( range_type &r, split ) : const_range_type( r, split() ) {}
+ //! Init range with container and grainsize specified
+ range_type( const concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
+
+ iterator begin() const { return solist_t::get_iterator( const_range_type::begin() ); }
+ iterator end() const { return solist_t::get_iterator( const_range_type::end() ); }
+ };
+
+ range_type range() {
+ return range_type( *this );
+ }
+
+ const_range_type range() const {
+ return const_range_type( *this );
+ }
+
+ // Modifiers
+ std::pair<iterator, bool> insert(const value_type& value) {
+ return internal_insert(value);
+ }
+
+ iterator insert(const_iterator, const value_type& value) {
+ // Ignore hint
+ return insert(value).first;
+ }
+
+ template<class Iterator>
+ void insert(Iterator first, Iterator last) {
+ for (Iterator it = first; it != last; ++it)
+ insert(*it);
+ }
+
+ iterator unsafe_erase(const_iterator where) {
+ return internal_erase(where);
+ }
+
+ iterator unsafe_erase(const_iterator first, const_iterator last) {
+ while (first != last)
+ unsafe_erase(first++);
+ return my_solist.get_iterator(first);
+ }
+
+ size_type unsafe_erase(const key_type& key) {
+ pairii_t where = equal_range(key);
+ size_type item_count = internal_distance(where.first, where.second);
+ unsafe_erase(where.first, where.second);
+ return item_count;
+ }
+
+ void swap(concurrent_unordered_base& right) {
+ if (this != &right) {
+ std::swap(my_hash_compare, right.my_hash_compare); // TODO: check what ADL meant here
+ my_solist.swap(right.my_solist);
+ internal_swap_buckets(right);
+ std::swap(my_number_of_buckets, right.my_number_of_buckets);
+ std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
+ }
+ }
+
+ // Observers
+ void clear() {
+ // Clear list
+ my_solist.clear();
+
+ // Clear buckets
+ internal_clear();
+ }
+
+ // Lookup
+ iterator find(const key_type& key) {
+ return internal_find(key);
+ }
+
+ const_iterator find(const key_type& key) const {
+ return const_cast<self_type*>(this)->internal_find(key);
+ }
+
+ size_type count(const key_type& key) const {
+ paircc_t answer = equal_range(key);
+ size_type item_count = internal_distance(answer.first, answer.second);
+ return item_count;
+ }
+
+ std::pair<iterator, iterator> equal_range(const key_type& key) {
+ return internal_equal_range(key);
+ }
+
+ std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
+ return internal_equal_range(key);
+ }
+
+ // Bucket interface - for debugging
+ size_type unsafe_bucket_count() const {
+ return my_number_of_buckets;
+ }
+
+ size_type unsafe_max_bucket_count() const {
+ return segment_size(pointers_per_table-1);
+ }
+
+ size_type unsafe_bucket_size(size_type bucket) {
+ size_type item_count = 0;
+ if (is_initialized(bucket)) {
+ raw_iterator it = get_bucket(bucket);
+ ++it;
+ for (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
+ ++item_count;
+ }
+ return item_count;
+ }
+
+ size_type unsafe_bucket(const key_type& key) const {
+ sokey_t order_key = (sokey_t) my_hash_compare(key);
+ size_type bucket = order_key % my_number_of_buckets;
+ return bucket;
+ }
+
+ // If the bucket is initialized, return a first non-dummy element in it
+ local_iterator unsafe_begin(size_type bucket) {
+ if (!is_initialized(bucket))
+ return end();
+
+ raw_iterator it = get_bucket(bucket);
+ return my_solist.first_real_iterator(it);
+ }
+
+ // If the bucket is initialized, return a first non-dummy element in it
+ const_local_iterator unsafe_begin(size_type bucket) const
+ {
+ if (!is_initialized(bucket))
+ return end();
+
+ raw_const_iterator it = get_bucket(bucket);
+ return my_solist.first_real_iterator(it);
+ }
+
+ // @REVIEW: Takes O(n)
+ // Returns the iterator after the last non-dummy element in the bucket
+ local_iterator unsafe_end(size_type bucket)
+ {
+ if (!is_initialized(bucket))
+ return end();
+
+ raw_iterator it = get_bucket(bucket);
+
+ // Find the end of the bucket, denoted by the dummy element
+ do ++it;
+ while(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+
+ // Return the first real element past the end of the bucket
+ return my_solist.first_real_iterator(it);
+ }
+
+ // @REVIEW: Takes O(n)
+ // Returns the iterator after the last non-dummy element in the bucket
+ const_local_iterator unsafe_end(size_type bucket) const
+ {
+ if (!is_initialized(bucket))
+ return end();
+
+ raw_const_iterator it = get_bucket(bucket);
+
+ // Find the end of the bucket, denoted by the dummy element
+ do ++it;
+ while(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+
+ // Return the first real element past the end of the bucket
+ return my_solist.first_real_iterator(it);
+ }
+
+ const_local_iterator unsafe_cbegin(size_type bucket) const {
+ return ((const self_type *) this)->begin();
+ }
+
+ const_local_iterator unsafe_cend(size_type bucket) const {
+ return ((const self_type *) this)->end();
+ }
+
+ // Hash policy
+ float load_factor() const {
+ return (float) size() / (float) unsafe_bucket_count();
+ }
+
+ float max_load_factor() const {
+ return my_maximum_bucket_size;
+ }
+
+ void max_load_factor(float newmax) {
+ if (newmax != newmax || newmax < 0)
+ tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
+ my_maximum_bucket_size = newmax;
+ }
+
+ // This function is a noop, because the underlying split-ordered list
+ // is already sorted, so an increase in the bucket number will be
+ // reflected next time this bucket is touched.
+ void rehash(size_type buckets) {
+ size_type current_buckets = my_number_of_buckets;
+
+ if (current_buckets > buckets)
+ return;
+ else if ( (buckets & (buckets-1)) != 0 )
+ tbb::internal::throw_exception(tbb::internal::eid_invalid_buckets_number);
+ my_number_of_buckets = buckets;
+ }
+
+private:
+
+ // Initialize the hash and keep the first bucket open
+ void internal_init() {
+ // Allocate an array of segment pointers
+ memset(my_buckets, 0, pointers_per_table * sizeof(void *));
+
+ // Insert the first element in the split-ordered list
+ raw_iterator dummy_node = my_solist.raw_begin();
+ set_bucket(0, dummy_node);
+ }
+
+ void internal_clear() {
+ for (size_type index = 0; index < pointers_per_table; ++index) {
+ if (my_buckets[index] != NULL) {
+ size_type sz = segment_size(index);
+ for (size_type index2 = 0; index2 < sz; ++index2)
+ my_allocator.destroy(&my_buckets[index][index2]);
+ my_allocator.deallocate(my_buckets[index], sz);
+ my_buckets[index] = 0;
+ }
+ }
+ }
+
+ void internal_copy(const self_type& right) {
+ clear();
+
+ my_maximum_bucket_size = right.my_maximum_bucket_size;
+ my_number_of_buckets = right.my_number_of_buckets;
+
+ __TBB_TRY {
+ insert(right.begin(), right.end());
+ my_hash_compare = right.my_hash_compare;
+ } __TBB_CATCH(...) {
+ my_solist.clear();
+ __TBB_RETHROW();
+ }
+ }
+
+ void internal_swap_buckets(concurrent_unordered_base& right)
+ {
+ // Swap all node segments
+ for (size_type index = 0; index < pointers_per_table; ++index)
+ {
+ raw_iterator * iterator_pointer = my_buckets[index];
+ my_buckets[index] = right.my_buckets[index];
+ right.my_buckets[index] = iterator_pointer;
+ }
+ }
+
+ // Hash APIs
+ size_type internal_distance(const_iterator first, const_iterator last) const
+ {
+ size_type num = 0;
+
+ for (const_iterator it = first; it != last; ++it)
+ ++num;
+
+ return num;
+ }
+
+ // Insert an element in the hash given its value
+ std::pair<iterator, bool> internal_insert(const value_type& value)
+ {
+ sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
+ size_type bucket = order_key % my_number_of_buckets;
+
+ // If bucket is empty, initialize it first
+ if (!is_initialized(bucket))
+ init_bucket(bucket);
+
+ size_type new_count;
+ order_key = split_order_key_regular(order_key);
+ raw_iterator it = get_bucket(bucket);
+ raw_iterator last = my_solist.raw_end();
+ raw_iterator where = it;
+
+ __TBB_ASSERT(where != last, "Invalid head node");
+
+ // First node is a dummy node
+ ++where;
+
+ for (;;)
+ {
+ if (where == last || solist_t::get_order_key(where) > order_key)
+ {
+ // Try to insert it in the right place
+ std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
+
+ if (result.second)
+ {
+ // Insertion succeeded, adjust the table size, if needed
+ adjust_table_size(new_count, my_number_of_buckets);
+ return result;
+ }
+ else
+ {
+ // Insertion failed: either the same node was inserted by another thread, or
+ // another element was inserted at exactly the same place as this node.
+ // Proceed with the search from the previous location where order key was
+ // known to be larger (note: this is legal only because there is no safe
+ // concurrent erase operation supported).
+ where = it;
+ ++where;
+ continue;
+ }
+ }
+ else if (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)
+ {
+ // Element already in the list, return it
+ return std::pair<iterator, bool>(my_solist.get_iterator(where), false);
+ }
+
+ // Move the iterator forward
+ it = where;
+ ++where;
+ }
+ }
+
+ // Find the element in the split-ordered list
+ iterator internal_find(const key_type& key)
+ {
+ sokey_t order_key = (sokey_t) my_hash_compare(key);
+ size_type bucket = order_key % my_number_of_buckets;
+
+ // If bucket is empty, initialize it first
+ if (!is_initialized(bucket))
+ init_bucket(bucket);
+
+ order_key = split_order_key_regular(order_key);
+ raw_iterator last = my_solist.raw_end();
+
+ for (raw_iterator it = get_bucket(bucket); it != last; ++it)
+ {
+ if (solist_t::get_order_key(it) > order_key)
+ {
+ // If the order key is smaller than the current order key, the element
+ // is not in the hash.
+ return end();
+ }
+ else if (solist_t::get_order_key(it) == order_key)
+ {
+ // The fact that order keys match does not mean that the element is found.
+ // Key function comparison has to be performed to check whether this is the
+ // right element. If not, keep searching while order key is the same.
+ if (!my_hash_compare(get_key(*it), key))
+ return my_solist.get_iterator(it);
+ }
+ }
+
+ return end();
+ }
+
+ // Erase an element from the list. This is not a concurrency safe function.
+ iterator internal_erase(const_iterator it)
+ {
+ key_type key = get_key(*it);
+ sokey_t order_key = (sokey_t) my_hash_compare(key);
+ size_type bucket = order_key % my_number_of_buckets;
+
+ // If bucket is empty, initialize it first
+ if (!is_initialized(bucket))
+ init_bucket(bucket);
+
+ order_key = split_order_key_regular(order_key);
+
+ raw_iterator previous = get_bucket(bucket);
+ raw_iterator last = my_solist.raw_end();
+ raw_iterator where = previous;
+
+ __TBB_ASSERT(where != last, "Invalid head node");
+
+ // First node is a dummy node
+ ++where;
+
+ for (;;) {
+ if (where == last)
+ return end();
+ else if (my_solist.get_iterator(where) == it)
+ return my_solist.erase_node(previous, it);
+
+ // Move the iterator forward
+ previous = where;
+ ++where;
+ }
+ }
+
+ // Return the [begin, end) pair of iterators with the same key values.
+ // This operation makes sense only if mapping is many-to-one.
+ pairii_t internal_equal_range(const key_type& key)
+ {
+ sokey_t order_key = (sokey_t) my_hash_compare(key);
+ size_type bucket = order_key % my_number_of_buckets;
+
+ // If bucket is empty, initialize it first
+ if (!is_initialized(bucket))
+ init_bucket(bucket);
+
+ order_key = split_order_key_regular(order_key);
+ raw_iterator end_it = my_solist.raw_end();
+
+ for (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
+ {
+ if (solist_t::get_order_key(it) > order_key)
+ {
+ // There is no element with the given key
+ return pairii_t(end(), end());
+ }
+ else if (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
+ {
+ iterator first = my_solist.get_iterator(it);
+ iterator last = first;
+
+ while( last != end() && !my_hash_compare(get_key(*last), key) )
+ ++last;
+ return pairii_t(first, last);
+ }
+ }
+
+ return pairii_t(end(), end());
+ }
+
+ // Return the [begin, end) pair of const iterators with the same key values.
+ // This operation makes sense only if mapping is many-to-one.
+ paircc_t internal_equal_range(const key_type& key) const
+ {
+ sokey_t order_key = (sokey_t) my_hash_compare(key);
+ size_type bucket = order_key % my_number_of_buckets;
+
+ // If bucket is empty, initialize it first
+ if (!is_initialized(bucket))
+ return paircc_t(end(), end());
+
+ order_key = split_order_key_regular(order_key);
+ raw_const_iterator end_it = my_solist.raw_end();
+
+ for (raw_const_iterator it = get_bucket(bucket); it != end_it; ++it)
+ {
+ if (solist_t::get_order_key(it) > order_key)
+ {
+ // There is no element with the given key
+ return paircc_t(end(), end());
+ }
+ else if (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
+ {
+ const_iterator first = my_solist.get_iterator(it);
+ const_iterator last = first;
+
+ while( last != end() && !my_hash_compare(get_key(*last), key ) )
+ ++last;
+ return paircc_t(first, last);
+ }
+ }
+
+ return paircc_t(end(), end());
+ }
+
+ // Bucket APIs
+ void init_bucket(size_type bucket)
+ {
+ // Bucket 0 has no parent. Initialize it and return.
+ if (bucket == 0) {
+ internal_init();
+ return;
+ }
+
+ size_type parent_bucket = get_parent(bucket);
+
+ // All parent_bucket buckets have to be initialized before this bucket is
+ if (!is_initialized(parent_bucket))
+ init_bucket(parent_bucket);
+
+ raw_iterator parent = get_bucket(parent_bucket);
+
+ // Create a dummy first node in this bucket
+ raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
+ set_bucket(bucket, dummy_node);
+ }
+
+ void adjust_table_size(size_type total_elements, size_type current_size)
+ {
+ // Grow the table by a factor of 2 if possible and needed
+ if ( ((float) total_elements / (float) current_size) > my_maximum_bucket_size )
+ {
+ // Double the size of the hash only if size has not changed inbetween loads
+ __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, 2 * current_size, current_size );
+ }
+ }
+
+ size_type get_parent(size_type bucket) const
+ {
+ // Unsets bucket's most significant turned-on bit
+ size_type msb = __TBB_Log2((uintptr_t)bucket);
+ return bucket & ~(size_type(1) << msb);
+ }
+
+
+ // Dynamic sized array (segments)
+ //! @return segment index of given index in the array
+ static size_type segment_index_of( size_type index ) {
+ return size_type( __TBB_Log2( index|1 ) );
+ }
+
+ //! @return the first array index of given segment
+ static size_type segment_base( size_type k ) {
+ return (size_type(1)<<k & ~size_type(1));
+ }
+
+ //! @return segment size
+ static size_type segment_size( size_type k ) {
+ return k? size_type(1)<<k : 2;
+ }
+
+ raw_iterator get_bucket(size_type bucket) const {
+ size_type segment = segment_index_of(bucket);
+ bucket -= segment_base(segment);
+ __TBB_ASSERT( my_buckets[segment], "bucket must be in an allocated segment" );
+ return my_buckets[segment][bucket];
+ }
+
+ void set_bucket(size_type bucket, raw_iterator dummy_head) {
+ size_type segment = segment_index_of(bucket);
+ bucket -= segment_base(segment);
+
+ if (my_buckets[segment] == NULL) {
+ size_type sz = segment_size(segment);
+ raw_iterator * new_segment = my_allocator.allocate(sz);
+ std::memset(new_segment, 0, sz*sizeof(raw_iterator));
+
+ if (__TBB_CompareAndSwapW((void *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
+ my_allocator.deallocate(new_segment, sz);
+ }
+
+ my_buckets[segment][bucket] = dummy_head;
+ }
+
+ bool is_initialized(size_type bucket) const {
+ size_type segment = segment_index_of(bucket);
+ bucket -= segment_base(segment);
+
+ if (my_buckets[segment] == NULL)
+ return false;
+
+ raw_iterator it = my_buckets[segment][bucket];
+ return (it.get_node_ptr() != NULL);
+ }
+
+ // Utilities for keys
+
+ // A regular order key has its original hash value reversed and the last bit set
+ sokey_t split_order_key_regular(sokey_t order_key) const {
+ return __TBB_ReverseBits(order_key) | 0x1;
+ }
+
+ // A dummy order key has its original hash value reversed and the last bit unset
+ sokey_t split_order_key_dummy(sokey_t order_key) const {
+ return __TBB_ReverseBits(order_key) & ~(0x1);
+ }
+
+ // Shared variables
+ size_type my_number_of_buckets; // Current table size
+ solist_t my_solist; // List where all the elements are kept
+ typename allocator_type::template rebind<raw_iterator>::other my_allocator; // Allocator object for segments
+ float my_maximum_bucket_size; // Maximum size of the bucket
+ raw_iterator *my_buckets[pointers_per_table]; // The segment table
+};
+#if _MSC_VER
+#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it
+#endif
+
+//! Hash multiplier
+static const size_t hash_multiplier = sizeof(size_t)==4? 2654435769U : 11400714819323198485ULL;
+} // namespace internal
+//! @endcond
+//! Hasher functions
+template<typename T>
+inline size_t tbb_hasher( const T& t ) {
+ return static_cast<size_t>( t ) * internal::hash_multiplier;
+}
+template<typename P>
+inline size_t tbb_hasher( P* ptr ) {
+ size_t const h = reinterpret_cast<size_t>( ptr );
+ return (h >> 3) ^ h;
+}
+template<typename E, typename S, typename A>
+inline size_t tbb_hasher( const std::basic_string<E,S,A>& s ) {
+ size_t h = 0;
+ for( const E* c = s.c_str(); *c; ++c )
+ h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
+ return h;
+}
+template<typename F, typename S>
+inline size_t tbb_hasher( const std::pair<F,S>& p ) {
+ return tbb_hasher(p.first) ^ tbb_hasher(p.second);
+}
+} // namespace interface5
+using interface5::tbb_hasher;
+} // namespace tbb
+#endif// __TBB_concurrent_unordered_internal_H
diff --git a/include/tbb/blocked_range.h b/include/tbb/blocked_range.h
index 8c01630..52c12cc 100644
--- a/include/tbb/blocked_range.h
+++ b/include/tbb/blocked_range.h
@@ -108,7 +108,7 @@ private:
Value my_begin;
size_type my_grainsize;
- //! Auxilary function used by forking constructor.
+ //! Auxiliary function used by forking constructor.
/** Using this function lets us not require that Value support assignment or default construction. */
static Value do_split( blocked_range& r ) {
__TBB_ASSERT( r.is_divisible(), "cannot split blocked_range that is not divisible" );
diff --git a/include/tbb/combinable.h b/include/tbb/combinable.h
index 093c5bb..5510595 100644
--- a/include/tbb/combinable.h
+++ b/include/tbb/combinable.h
@@ -29,8 +29,8 @@
#ifndef __TBB_combinable_H
#define __TBB_combinable_H
-#include "tbb/enumerable_thread_specific.h"
-#include "tbb/cache_aligned_allocator.h"
+#include "enumerable_thread_specific.h"
+#include "cache_aligned_allocator.h"
namespace tbb {
/** \name combinable
@@ -67,11 +67,13 @@ namespace tbb {
T& local(bool & exists) { return my_ets.local(exists); }
- template< typename FCombine>
- T combine(FCombine fcombine) { return my_ets.combine(fcombine); }
+ // combine_func_t has signature T(T,T) or T(const T&, const T&)
+ template <typename combine_func_t>
+ T combine(combine_func_t f_combine) { return my_ets.combine(f_combine); }
- template<typename FCombine>
- void combine_each(FCombine fcombine) { my_ets.combine_each(fcombine); }
+ // combine_func_t has signature void(T) or void(const T&)
+ template <typename combine_func_t>
+ void combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }
};
} // namespace tbb
diff --git a/include/tbb/compat/condition_variable b/include/tbb/compat/condition_variable
new file mode 100644
index 0000000..4f132d2
--- /dev/null
+++ b/include/tbb/compat/condition_variable
@@ -0,0 +1,459 @@
+/*
+ Copyright 2005-2010 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_condition_variable_H
+#define __TBB_condition_variable_H
+
+#if _WIN32||_WIN64
+#include <windows.h>
+
+namespace tbb {
+namespace interface5 {
+namespace internal {
+struct condition_variable_using_event
+{
+ //! Event for blocking waiting threads.
+ HANDLE event;
+ //! Protects invariants involving n_waiters, release_count, and epoch.
+ CRITICAL_SECTION mutex;
+ //! Number of threads waiting on this condition variable
+ int n_waiters;
+ //! Number of threads remaining that should no longer wait on this condition variable.
+ int release_count;
+ //! To keep threads from waking up prematurely with earlier signals.
+ unsigned epoch;
+};
+}}} // namespace tbb::interface5::internal
+
+#ifndef CONDITION_VARIABLE_INIT
+typedef void* CONDITION_VARIABLE;
+typedef CONDITION_VARIABLE* PCONDITION_VARIABLE;
+#endif
+
+#else /* if not _WIN32||_WIN64 */
+#include <pthread.h>
+#endif /* _WIN32||_WIN64 */
+
+#include "../tbb_stddef.h"
+#include "../mutex.h"
+#include "../tbb_thread.h"
+#include "../tbb_exception.h"
+#include "../tbb_profiling.h"
+
+namespace tbb {
+
+namespace interface5 {
+
+// C++0x standard working draft 30.4.3
+// Lock tag types
+struct defer_lock_t { }; //! do not acquire ownership of the mutex
+struct try_to_lock_t { }; //! try to acquire ownership of the mutex without blocking
+struct adopt_lock_t { }; //! assume the calling thread has already
+const defer_lock_t defer_lock = {};
+const try_to_lock_t try_to_lock = {};
+const adopt_lock_t adopt_lock = {};
+
+// C++0x standard working draft 30.4.3.1
+//! lock_guard
+template<typename M>
+class lock_guard : tbb::internal::no_copy {
+public:
+ //! mutex type
+ typedef M mutex_type;
+
+ //! Constructor
+ /** precondition: If mutex_type is not a recursive mutex, the calling thread
+ does not own the mutex m. */
+ explicit lock_guard(mutex_type& m) : pm(m) {m.lock();}
+
+ //! Adopt_lock constructor
+ /** precondition: the calling thread owns the mutex m. */
+ lock_guard(mutex_type& m, adopt_lock_t) : pm(m) {}
+
+ //! Destructor
+ ~lock_guard() { pm.unlock(); }
+private:
+ mutex_type& pm;
+};
+
+// C++0x standard working draft 30.4.3.2
+//! unique_lock
+template<typename M>
+class unique_lock : tbb::internal::no_copy {
+ friend class condition_variable;
+public:
+ typedef M mutex_type;
+
+ // 30.4.3.2.1 construct/copy/destroy
+ // NB: Without constructors that take an r-value reference to a unique_lock, the following constructor is of little use.
+ //! Constructor
+ /** postcondition: pm==0 && owns==false */
+ unique_lock() : pm(NULL), owns(false) {}
+
+ //! Constructor
+ /** precondition: if mutex_type is not a recursive mutex, the calling thread
+ does not own the mutex m. If the precondition is not met, a deadlock occurs.
+ postcondition: pm==&m and owns==true */
+ explicit unique_lock(mutex_type& m) : pm(&m) {m.lock(); owns=true;}
+
+ //! Defer_lock constructor
+ /** postcondition: pm==&m and owns==false */
+ unique_lock(mutex_type& m, defer_lock_t) : pm(&m), owns(false) {}
+
+ //! Try_to_lock constructor
+ /** precondition: if mutex_type is not a recursive mutex, the calling thread
+ does not own the mutex m. If the precondition is not met, a deadlock occurs.
+ postcondition: pm==&m and owns==res where res is the value returned by
+ the call to m.try_lock(). */
+ unique_lock(mutex_type& m, try_to_lock_t) : pm(&m) {owns = m.try_lock();}
+
+ //! Adopt_lock constructor
+ /** precondition: the calling thread owns the mutex. If it does not, mutex->unlock() would fail.
+ postcondition: pm==&m and owns==true */
+ unique_lock(mutex_type& m, adopt_lock_t) : pm(&m), owns(true) {}
+
+ //! Timed unique_lock acquisition.
+ /** To avoid requiring support for namespace chrono, this method deviates from the working draft in that
+ it uses tbb::tick_count::interval_t to specify the time duration. */
+ unique_lock(mutex_type& m, const tick_count::interval_t &i) : pm(&m) {owns = try_lock_for( i );}
+
+ //! Destructor
+ ~unique_lock() { if( owns ) pm->unlock(); }
+
+ // 30.4.3.2.2 locking
+ //! Lock the mutex and own it.
+ void lock() {
+ if( pm ) {
+ if( !owns ) {
+ pm->lock();
+ owns = true;
+ } else
+ throw_exception_v4( tbb::internal::eid_possible_deadlock );
+ } else
+ throw_exception_v4( tbb::internal::eid_operation_not_permitted );
+ __TBB_ASSERT( owns, NULL );
+ }
+
+ //! Try to lock the mutex.
+ /** If successful, note that this lock owns it. Otherwise, set it false. */
+ bool try_lock() {
+ if( pm ) {
+ if( !owns )
+ owns = pm->try_lock();
+ else
+ throw_exception_v4( tbb::internal::eid_possible_deadlock );
+ } else
+ throw_exception_v4( tbb::internal::eid_operation_not_permitted );
+ return owns;
+ }
+
+ //! Try to lock the mutex.
+ bool try_lock_for( const tick_count::interval_t &i );
+
+ //! Unlock the mutex
+ /** And note that this lock no longer owns it. */
+ void unlock() {
+ if( owns ) {
+ pm->unlock();
+ owns = false;
+ } else
+ throw_exception_v4( tbb::internal::eid_operation_not_permitted );
+ __TBB_ASSERT( !owns, NULL );
+ }
+
+ // 30.4.3.2.3 modifiers
+ //! Swap the two unique locks
+ void swap(unique_lock& u) {
+ mutex_type* t_pm = u.pm; u.pm = pm; pm = t_pm;
+ bool t_owns = u.owns; u.owns = owns; owns = t_owns;
+ }
+
+ //! Release control over the mutex.
+ mutex_type* release() {
+ mutex_type* o_pm = pm;
+ pm = NULL;
+ owns = false;
+ return o_pm;
+ }
+
+ // 30.4.3.2.4 observers
+ //! Does this lock own the mutex?
+ bool owns_lock() const { return owns; }
+
+ //! Does this lock own the mutex?
+ /*explicit*/ operator bool() const { return owns; }
+
+ //! Return the mutex that this lock currently has.
+ mutex_type* mutex() const { return pm; }
+
+private:
+ mutex_type* pm;
+ bool owns;
+};
+
+template<typename M>
+bool unique_lock<M>::try_lock_for( const tick_count::interval_t &i)
+{
+ const int unique_lock_tick = 100; /* microseconds; 0.1 milliseconds */
+ // the smallest wait-time is 0.1 milliseconds.
+ bool res = pm->try_lock();
+ int duration_in_micro;
+ if( !res && (duration_in_micro=int(i.seconds()*1e6))>unique_lock_tick ) {
+ tick_count::interval_t i_100( double(unique_lock_tick)/1e6 /* seconds */); // 100 microseconds = 0.1*10E-3
+ do {
+ this_tbb_thread::sleep(i_100); // sleep for 100 micro seconds
+ duration_in_micro -= unique_lock_tick;
+ res = pm->try_lock();
+ } while( !res && duration_in_micro>unique_lock_tick );
+ }
+ return (owns=res);
+}
+
+//! Swap the two unique locks that have the mutexes of same type
+template<typename M>
+void swap(unique_lock<M>& x, unique_lock<M>& y) { x.swap( y ); }
+
+namespace internal {
+
+#if _WIN32||_WIN64
+union condvar_impl_t {
+ condition_variable_using_event cv_event;
+ CONDITION_VARIABLE cv_native;
+};
+
+void __TBB_EXPORTED_FUNC internal_initialize_condition_variable( condvar_impl_t& cv );
+void __TBB_EXPORTED_FUNC internal_destroy_condition_variable( condvar_impl_t& cv );
+void __TBB_EXPORTED_FUNC internal_condition_variable_notify_one( condvar_impl_t& cv );
+void __TBB_EXPORTED_FUNC internal_condition_variable_notify_all( condvar_impl_t& cv );
+bool __TBB_EXPORTED_FUNC internal_condition_variable_wait( condvar_impl_t& cv, mutex* mtx, const tick_count::interval_t* i = NULL );
+#else /* if !(_WIN32||_WIN64), i.e., POSIX threads */
+typedef pthread_cond_t condvar_impl_t;
+#endif
+
+} // namespace internal
+
+//! cv_status
+/** C++0x standard working draft 30.5 */
+enum cv_status { no_timeout, timeout };
+
+//! condition variable
+/** C++0x standard working draft 30.5.1
+ @ingroup synchronization */
+class condition_variable : tbb::internal::no_copy {
+public:
+ //! Constructor
+ condition_variable() {
+#if _WIN32||_WIN64
+ internal_initialize_condition_variable( my_cv );
+#else
+ pthread_cond_init( &my_cv, NULL );
+#endif
+ }
+
+ //! Destructor
+ ~condition_variable() {
+ //precondition: There shall be no thread blocked on *this.
+#if _WIN32||_WIN64
+ internal_destroy_condition_variable( my_cv );
+#else
+ pthread_cond_destroy( &my_cv );
+#endif
+ }
+
+ //! Notify one thread and wake it up
+ void notify_one() {
+#if _WIN32||_WIN64
+ internal_condition_variable_notify_one( my_cv );
+#else
+ pthread_cond_signal( &my_cv );
+#endif
+ }
+
+ //! Notify all threads
+ void notify_all() {
+#if _WIN32||_WIN64
+ internal_condition_variable_notify_all( my_cv );
+#else
+ pthread_cond_broadcast( &my_cv );
+#endif
+ }
+
+ //! Release the mutex associated with the lock and wait on this condition variable
+ void wait(unique_lock<mutex>& lock);
+
+ //! Wait on this condition variable while pred is false
+ template <class Predicate>
+ void wait(unique_lock<mutex>& lock, Predicate pred) {
+ while( !pred() )
+ wait( lock );
+ }
+
+ //! Timed version of wait()
+ cv_status wait_for(unique_lock<mutex>& lock, const tick_count::interval_t &i );
+
+ //! Timed version of the predicated wait
+ /** The loop terminates when pred() returns true or when the time duration specified by rel_time (i) has elapsed. */
+ template<typename Predicate>
+ bool wait_for(unique_lock<mutex>& lock, const tick_count::interval_t &i, Predicate pred)
+ {
+ while( !pred() ) {
+ cv_status st = wait_for( lock, i );
+ if( st==timeout )
+ return pred();
+ }
+ return true;
+ }
+
+ // C++0x standard working draft. 30.2.3
+ typedef internal::condvar_impl_t* native_handle_type;
+
+ native_handle_type native_handle() { return (native_handle_type) &my_cv; }
+
+private:
+ internal::condvar_impl_t my_cv;
+};
+
+
+#if _WIN32||_WIN64
+inline void condition_variable::wait( unique_lock<mutex>& lock )
+{
+ __TBB_ASSERT( lock.owns, NULL );
+ lock.owns = false;
+ if( !internal_condition_variable_wait( my_cv, lock.mutex() ) ) {
+ int ec = GetLastError();
+ // on Windows 7, SleepConditionVariableCS() may return ERROR_TIMEOUT while the doc says it returns WAIT_TIMEOUT
+ __TBB_ASSERT_EX( ec!=WAIT_TIMEOUT&&ec!=ERROR_TIMEOUT, NULL );
+ lock.owns = true;
+ throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+ }
+ lock.owns = true;
+}
+
+inline cv_status condition_variable::wait_for( unique_lock<mutex>& lock, const tick_count::interval_t& i )
+{
+ cv_status rc = no_timeout;
+ __TBB_ASSERT( lock.owns, NULL );
+ lock.owns = false;
+ // condvar_wait could be SleepConditionVariableCS (or SleepConditionVariableSRW) or our own pre-vista cond_var_wait()
+ if( !internal_condition_variable_wait( my_cv, lock.mutex(), &i ) ) {
+ int ec = GetLastError();
+ if( ec==WAIT_TIMEOUT || ec==ERROR_TIMEOUT )
+ rc = timeout;
+ else {
+ lock.owns = true;
+ throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+ }
+ }
+ lock.owns = true;
+ return rc;
+}
+#else
+#if __linux__
+#include <ctime>
+#else /* generic Unix */
+#include <sys/time.h>
+#include <errno.h>
+#endif
+
+inline void condition_variable::wait( unique_lock<mutex>& lock )
+{
+ __TBB_ASSERT( lock.owns, NULL );
+ lock.owns = false;
+ if( pthread_cond_wait( &my_cv, lock.mutex()->native_handle() ) ) {
+ lock.owns = true;
+ throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+ }
+ // upon successful return, the mutex has been locked and is owned by the calling thread.
+ lock.owns = true;
+}
+
+inline cv_status condition_variable::wait_for( unique_lock<mutex>& lock, const tick_count::interval_t& i )
+{
+#if __linux__
+ struct timespec req;
+ double sec = i.seconds();
+ clock_gettime( CLOCK_REALTIME, &req );
+ req.tv_sec += static_cast<long>(sec);
+ req.tv_nsec += static_cast<long>( (sec - static_cast<long>(sec))*1e9 );
+#else /* generic Unix */
+ struct timeval tv;
+ struct timespec req;
+ double sec = i.seconds();
+ int status = gettimeofday(&tv, NULL);
+ __TBB_ASSERT_EX( status==0, "gettimeofday failed" );
+ req.tv_sec = tv.tv_sec + static_cast<long>(sec);
+ req.tv_nsec = tv.tv_usec*1000 + static_cast<long>( (sec - static_cast<long>(sec))*1e9 );
+#endif /*(choice of OS) */
+
+ int ec;
+ cv_status rc = no_timeout;
+ __TBB_ASSERT( lock.owns, NULL );
+ lock.owns = false;
+ if( ( ec=pthread_cond_timedwait( &my_cv, lock.mutex()->native_handle(), &req ) ) ) {
+ if( ec==ETIMEDOUT )
+ rc = timeout;
+ else {
+ __TBB_ASSERT( lock.try_lock()==false, NULL );
+ lock.owns = true;
+ throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+ }
+ }
+ lock.owns = true;
+ return rc;
+}
+#endif /* !(_WIN32||_WIN64) */
+
+} // namespace interface5
+
+__TBB_DEFINE_PROFILING_SET_NAME(interface5::condition_variable)
+
+} // namespace tbb
+
+#if TBB_IMPLEMENT_CPP0X
+
+namespace std {
+
+using tbb::interface5::defer_lock_t;
+using tbb::interface5::try_to_lock_t;
+using tbb::interface5::adopt_lock_t;
+using tbb::interface5::defer_lock;
+using tbb::interface5::try_to_lock;
+using tbb::interface5::adopt_lock;
+using tbb::interface5::lock_guard;
+using tbb::interface5::unique_lock;
+using tbb::interface5::swap; /* this is for void std::swap(unique_lock<M>&,unique_lock<M>&) */
+using tbb::interface5::condition_variable;
+using tbb::interface5::cv_status;
+using tbb::interface5::timeout;
+using tbb::interface5::no_timeout;
+
+} // namespace std
+
+#endif /* TBB_IMPLEMENT_CPP0X */
+
+#endif /* __TBB_condition_variable_H */
diff --git a/include/tbb/compat/ppl.h b/include/tbb/compat/ppl.h
index 5c18f29..f524abf 100644
--- a/include/tbb/compat/ppl.h
+++ b/include/tbb/compat/ppl.h
@@ -33,8 +33,10 @@
#include "../parallel_invoke.h"
#include "../parallel_for_each.h"
#include "../parallel_for.h"
-#include "../critical_section.h"
#include "../tbb_exception.h"
+#include "../critical_section.h"
+#include "../reader_writer_lock.h"
+#include "../combinable.h"
namespace Concurrency {
@@ -56,6 +58,8 @@ namespace Concurrency {
using tbb::strict_ppl::parallel_for;
using tbb::parallel_for_each;
using tbb::critical_section;
+ using tbb::reader_writer_lock;
+ using tbb::combinable;
using tbb::improper_lock;
diff --git a/src/tbb/itt_notify_proxy.c b/include/tbb/compat/thread
similarity index 71%
copy from src/tbb/itt_notify_proxy.c
copy to include/tbb/compat/thread
index 7fdedfa..e4d3b32 100644
--- a/src/tbb/itt_notify_proxy.c
+++ b/include/tbb/compat/thread
@@ -26,30 +26,29 @@
the GNU General Public License.
*/
-#include "tbb/tbb_config.h"
+#ifndef __TBB_thread_H
+#define __TBB_thread_H
-/* This declaration in particular shuts up "empty translation unit" warning */
-extern int __TBB_load_ittnotify();
+#include "../tbb_thread.h"
-#if __TBB_NEW_ITT_NOTIFY
-#if DO_ITT_NOTIFY
+#if TBB_IMPLEMENT_CPP0X
-#if _WIN32||_WIN64
- #ifndef UNICODE
- #define UNICODE
- #endif
-#endif /* WIN */
+namespace std {
-extern void ITT_DoOneTimeInitialization();
+typedef tbb::tbb_thread thread;
-#define ITT_SIMPLE_INIT 1
-#define __itt_init_lib_name ITT_DoOneTimeInitialization
+namespace this_thread {
+ using tbb::this_tbb_thread::get_id;
+ using tbb::this_tbb_thread::yield;
-#include "tools_api/ittnotify_static.c"
+ inline void sleep_for(const tbb::tick_count::interval_t& rel_time) {
+ tbb::internal::thread_sleep_v3( rel_time );
+ }
-int __TBB_load_ittnotify() {
- return __itt_init_lib();
}
-#endif /* DO_ITT_NOTIFY */
-#endif /* __TBB_NEW_ITT_NOTIFY */
+}
+
+#endif /* TBB_IMPLEMENT_CPP0X */
+
+#endif /* __TBB_thread_H */
diff --git a/include/tbb/concurrent_hash_map.h b/include/tbb/concurrent_hash_map.h
index d21588e..117d0c7 100644
--- a/include/tbb/concurrent_hash_map.h
+++ b/include/tbb/concurrent_hash_map.h
@@ -29,18 +29,29 @@
#ifndef __TBB_concurrent_hash_map_H
#define __TBB_concurrent_hash_map_H
-#include <stdexcept>
+#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
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
#include <iterator>
#include <utility> // Need std::pair
#include <cstring> // Need std::memset
-#include <string>
-#include "tbb_stddef.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "cache_aligned_allocator.h"
#include "tbb_allocator.h"
#include "spin_rw_mutex.h"
#include "atomic.h"
#include "aligned_space.h"
#include "tbb_exception.h"
+#include "_concurrent_unordered_internal.h" // Need tbb_hasher
#if TBB_USE_PERFORMANCE_WARNINGS
#include <typeinfo>
#endif
@@ -56,6 +67,7 @@ namespace internal {
//! Routine that loads pointer from location pointed to by src without causing ITT to report a race.
void* __TBB_EXPORTED_FUNC itt_load_pointer_v3( const void* src );
}
+//! @endcond
//! hash_compare that is default argument for concurrent_hash_map
template<typename Key>
@@ -69,6 +81,7 @@ namespace interface4 {
template<typename Key, typename T, typename HashCompare = tbb_hash_compare<Key>, typename A = tbb_allocator<std::pair<Key, T> > >
class concurrent_hash_map;
+ //! @cond INTERNAL
namespace internal {
@@ -263,7 +276,8 @@ namespace interface4 {
if( (h & m_old) != (h & m) ) { // mask changed for this hashcode, rare event
// condition above proves that 'h' has some other bits set beside 'm_old'
// find next applicable mask after m_old //TODO: look at bsl instruction
- for( ++m_old; !(h & m_old); m_old <<= 1 ); // at maximum few rounds depending on the first block size
+ for( ++m_old; !(h & m_old); m_old <<= 1 ) // at maximum few rounds depending on the first block size
+ ;
m_old = (m_old<<1) - 1; // get full mask from a bit
__TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
// check whether it is rehashing/ed
@@ -527,31 +541,6 @@ namespace interface4 {
} // internal
//! @endcond
-//! Hash multiplier
-static const size_t hash_multiplier = sizeof(size_t)==4? 2654435769U : 11400714819323198485ULL;
-
-//! Hasher functions
-template<typename T>
-inline size_t tbb_hasher( const T& t ) {
- return static_cast<size_t>( t ) * hash_multiplier;
-}
-template<typename P>
-inline size_t tbb_hasher( P* ptr ) {
- size_t const h = reinterpret_cast<size_t>( ptr );
- return (h >> 3) ^ h;
-}
-template<typename E, typename S, typename A>
-inline size_t tbb_hasher( const std::basic_string<E,S,A>& s ) {
- size_t h = 0;
- for( const E* c = s.c_str(); *c; c++ )
- h = static_cast<size_t>(*c) ^ (h * hash_multiplier);
- return h;
-}
-template<typename F, typename S>
-inline size_t tbb_hasher( const std::pair<F,S>& p ) {
- return tbb_hasher(p.first) ^ tbb_hasher(p.second);
-}
-
//! Unordered map from Key to T.
/** concurrent_hash_map is associative container with concurrent access.
@@ -770,7 +759,7 @@ public:
//! Construct empty table.
concurrent_hash_map(const allocator_type &a = allocator_type())
- : my_allocator(a)
+ : internal::hash_map_base(), my_allocator(a)
{}
//! Construct empty table with n preallocated buckets. This number serves also as initial concurrency level.
@@ -782,7 +771,7 @@ public:
//! Copy constructor
concurrent_hash_map( const concurrent_hash_map& table, const allocator_type &a = allocator_type())
- : my_allocator(a)
+ : internal::hash_map_base(), my_allocator(a)
{
internal_copy(table);
}
@@ -1354,7 +1343,6 @@ void concurrent_hash_map<Key,T,HashCompare,A>::internal_copy(I first, I last) {
} // namespace interface4
-using interface4::tbb_hasher;
using interface4::concurrent_hash_map;
diff --git a/include/tbb/concurrent_queue.h b/include/tbb/concurrent_queue.h
index 9c06b23..c137fb3 100644
--- a/include/tbb/concurrent_queue.h
+++ b/include/tbb/concurrent_queue.h
@@ -55,7 +55,7 @@ class concurrent_queue: public internal::concurrent_queue_base_v3<T> {
return b;
}
- //! Returns a block of size n (bytes)
+ //! Deallocates block created by allocate_block.
/*override*/ virtual void deallocate_block( void *b, size_t n ) {
my_allocator.deallocate( reinterpret_cast<char*>(b), n );
}
@@ -81,14 +81,14 @@ public:
//! Construct empty queue
explicit concurrent_queue(const allocator_type& a = allocator_type()) :
- internal::concurrent_queue_base_v3<T>( sizeof(T) ), my_allocator( a )
+ my_allocator( a )
{
}
//! [begin,end) constructor
template<typename InputIterator>
concurrent_queue( InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :
- internal::concurrent_queue_base_v3<T>( sizeof(T) ), my_allocator( a )
+ my_allocator( a )
{
for( ; begin != end; ++begin )
internal_push(&*begin);
@@ -96,7 +96,7 @@ public:
//! Copy constructor
concurrent_queue( const concurrent_queue& src, const allocator_type& a = allocator_type()) :
- internal::concurrent_queue_base_v3<T>( sizeof(T) ), my_allocator( a )
+ internal::concurrent_queue_base_v3<T>(), my_allocator( a )
{
assign( src );
}
@@ -150,7 +150,7 @@ template<typename T, class A>
void concurrent_queue<T,A>::clear() {
while( !empty() ) {
T value;
- internal_try_pop(&value);
+ this->internal_try_pop(&value);
}
}
@@ -170,6 +170,8 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
typedef typename A::template rebind<char>::other page_allocator_type;
page_allocator_type my_allocator;
+ typedef typename concurrent_queue_base_v3::padded_page<T> padded_page;
+
//! Class used to ensure exception-safety of method "pop"
class destroyer: internal::no_copy {
T& my_value;
@@ -178,9 +180,9 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
~destroyer() {my_value.~T();}
};
- T& get_ref( page& page, size_t index ) {
+ T& get_ref( page& p, size_t index ) {
__TBB_ASSERT( index<items_per_page, NULL );
- return static_cast<T*>(static_cast<void*>(&page+1))[index];
+ return (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
}
/*override*/ virtual void copy_item( page& dst, size_t index, const void* src ) {
@@ -188,7 +190,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
}
/*override*/ virtual void copy_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) {
- new( &get_ref(dst,dindex) ) T( static_cast<const T*>(static_cast<const void*>(&src+1))[sindex] );
+ new( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );
}
/*override*/ virtual void assign_and_destroy_item( void* dst, page& src, size_t index ) {
@@ -198,7 +200,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
}
/*overide*/ virtual page *allocate_page() {
- size_t n = sizeof(page) + items_per_page*item_size;
+ size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);
page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
if( !p )
internal::throw_exception(internal::eid_bad_alloc);
@@ -206,7 +208,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
}
/*override*/ virtual void deallocate_page( page *p ) {
- size_t n = sizeof(page) + items_per_page*item_size;
+ size_t n = sizeof(padded_page) + items_per_page*sizeof(T);
my_allocator.deallocate( reinterpret_cast<char*>(p), n );
}
@@ -298,8 +300,8 @@ public:
//! Set the capacity
/** Setting the capacity to 0 causes subsequent try_push operations to always fail,
and subsequent push operations to block forever. */
- void set_capacity( size_type capacity ) {
- internal_set_capacity( capacity, sizeof(T) );
+ void set_capacity( size_type new_capacity ) {
+ internal_set_capacity( new_capacity, sizeof(T) );
}
//! return allocator object
@@ -364,8 +366,8 @@ public:
//! [begin,end) constructor
template<typename InputIterator>
- concurrent_queue( InputIterator begin, InputIterator end, const A& a = A()) :
- concurrent_bounded_queue<T,A>( begin, end, a )
+ concurrent_queue( InputIterator b /*begin*/, InputIterator e /*end*/, const A& a = A()) :
+ concurrent_bounded_queue<T,A>( b, e, a )
{
}
diff --git a/include/tbb/concurrent_unordered_map.h b/include/tbb/concurrent_unordered_map.h
new file mode 100644
index 0000000..2521961
--- /dev/null
+++ b/include/tbb/concurrent_unordered_map.h
@@ -0,0 +1,241 @@
+/*
+ Copyright 2005-2010 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.
+*/
+
+/* 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
+
+#include "_concurrent_unordered_internal.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
+{
+protected:
+ typedef std::pair<const Key, T> 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) {}
+
+ 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) {}
+
+ 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);
+ }
+
+ 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> >
+{
+ // 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;
+ using traits_type::my_hash_compare;
+#if __TBB_EXTRA_DEBUG
+public:
+#endif
+ using traits_type::allow_multimapping;
+public:
+ using base_type::end;
+ using base_type::find;
+ using base_type::insert;
+
+ // Type definitions
+ typedef Key key_type;
+ typedef typename base_type::value_type value_type;
+ typedef T mapped_type;
+ typedef Hasher hasher;
+ typedef Key_equality key_equal;
+ typedef hash_compare key_compare;
+
+ typedef typename base_type::allocator_type allocator_type;
+ typedef typename base_type::pointer pointer;
+ typedef typename base_type::const_pointer const_pointer;
+ typedef typename base_type::reference reference;
+ typedef typename base_type::const_reference const_reference;
+
+ typedef typename base_type::size_type size_type;
+ typedef typename base_type::difference_type difference_type;
+
+ typedef typename base_type::iterator iterator;
+ typedef typename base_type::const_iterator const_iterator;
+ typedef typename base_type::iterator local_iterator;
+ typedef typename base_type::const_iterator const_local_iterator;
+
+ // Construction/destruction/copying
+ explicit concurrent_unordered_map(size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
+ const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
+ : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+ {
+ }
+
+ concurrent_unordered_map(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(),
+ 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)
+ {
+ for (; first != last; ++first)
+ base_type::insert(*first);
+ }
+
+ concurrent_unordered_map(const concurrent_unordered_map& table) : base_type(table)
+ {
+ }
+
+ concurrent_unordered_map(const concurrent_unordered_map& table, const Allocator& a)
+ : base_type(table, a)
+ {
+ }
+
+ concurrent_unordered_map& operator=(const concurrent_unordered_map& table)
+ {
+ base_type::operator=(table);
+ return (*this);
+ }
+
+ iterator unsafe_erase(const_iterator where)
+ {
+ return base_type::unsafe_erase(where);
+ }
+
+ size_type unsafe_erase(const key_type& key)
+ {
+ return base_type::unsafe_erase(key);
+ }
+
+ iterator unsafe_erase(const_iterator first, const_iterator last)
+ {
+ return base_type::unsafe_erase(first, last);
+ }
+
+ void swap(concurrent_unordered_map& table)
+ {
+ base_type::swap(table);
+ }
+
+ // Observers
+ hasher hash_function() const
+ {
+ return my_hash_compare.my_hash_object;
+ }
+
+ key_equal key_eq() const
+ {
+ return my_hash_compare.my_key_compare_object;
+ }
+
+ 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;
+
+} // namespace tbb
+
+#endif// __TBB_concurrent_unordered_map_H
diff --git a/include/tbb/concurrent_vector.h b/include/tbb/concurrent_vector.h
index b2e8009..8106eb4 100644
--- a/include/tbb/concurrent_vector.h
+++ b/include/tbb/concurrent_vector.h
@@ -30,15 +30,25 @@
#define __TBB_concurrent_vector_H
#include "tbb_stddef.h"
-#include <algorithm>
-#include <iterator>
-#include <new>
#include "tbb_exception.h"
#include "atomic.h"
#include "cache_aligned_allocator.h"
#include "blocked_range.h"
-
#include "tbb_machine.h"
+#include <new>
+
+#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 <algorithm>
+#include <iterator>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
#if _MSC_VER==1500 && !__INTEL_COMPILER
// VS2008/VC9 seems to have an issue; limits pull in math.h
@@ -448,7 +458,7 @@ private:
typedef const T& const_reference;
typedef I iterator;
typedef ptrdiff_t difference_type;
- generic_range_type( I begin_, I end_, size_t grainsize = 1) : blocked_range<I>(begin_,end_,grainsize) {}
+ generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {}
template<typename U>
generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {}
generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}
@@ -495,37 +505,37 @@ public:
//! Construct empty vector.
explicit concurrent_vector(const allocator_type &a = allocator_type())
- : internal::allocator_base<T, A>(a)
+ : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
{
vector_allocator_ptr = &internal_allocator;
}
//! Copying constructor
concurrent_vector( const concurrent_vector& vector, const allocator_type& a = allocator_type() )
- : internal::allocator_base<T, A>(a)
+ : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
{
vector_allocator_ptr = &internal_allocator;
- try {
+ __TBB_TRY {
internal_copy(vector, sizeof(T), ©_array);
- } catch(...) {
+ } __TBB_CATCH(...) {
segment_t *table = my_segment;
internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
- throw;
+ __TBB_RETHROW();
}
}
//! Copying constructor for vector with different allocator type
template<class M>
concurrent_vector( const concurrent_vector<T, M>& vector, const allocator_type& a = allocator_type() )
- : internal::allocator_base<T, A>(a)
+ : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
{
vector_allocator_ptr = &internal_allocator;
- try {
+ __TBB_TRY {
internal_copy(vector.internal_vector_base(), sizeof(T), ©_array);
- } catch(...) {
+ } __TBB_CATCH(...) {
segment_t *table = my_segment;
internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
- throw;
+ __TBB_RETHROW();
}
}
@@ -533,12 +543,12 @@ public:
explicit concurrent_vector(size_type n)
{
vector_allocator_ptr = &internal_allocator;
- try {
+ __TBB_TRY {
internal_resize( n, sizeof(T), max_size(), NULL, &destroy_array, &initialize_array );
- } catch(...) {
+ } __TBB_CATCH(...) {
segment_t *table = my_segment;
internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
- throw;
+ __TBB_RETHROW();
}
}
@@ -547,12 +557,12 @@ public:
: internal::allocator_base<T, A>(a)
{
vector_allocator_ptr = &internal_allocator;
- try {
+ __TBB_TRY {
internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
- } catch(...) {
+ } __TBB_CATCH(...) {
segment_t *table = my_segment;
internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
- throw;
+ __TBB_RETHROW();
}
}
@@ -562,12 +572,12 @@ public:
: internal::allocator_base<T, A>(a)
{
vector_allocator_ptr = &internal_allocator;
- try {
+ __TBB_TRY {
internal_assign_range(first, last, static_cast<is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
- } catch(...) {
+ } __TBB_CATCH(...) {
segment_t *table = my_segment;
internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
- throw;
+ __TBB_RETHROW();
}
}
@@ -891,13 +901,13 @@ private:
template<typename T, class A>
void concurrent_vector<T, A>::shrink_to_fit() {
internal_segments_table old;
- try {
+ __TBB_TRY {
if( internal_compact( sizeof(T), &old, &destroy_array, ©_array ) )
internal_free_segments( old.table, pointers_per_long_table, old.first_block ); // free joined and unnecessary segments
- } catch(...) {
+ } __TBB_CATCH(...) {
if( old.first_block ) // free segment allocated for compacting. Only for support of exceptions in ctor of user T[ype]
internal_free_segments( old.table, 1, old.first_block );
- throw;
+ __TBB_RETHROW();
}
}
@@ -924,7 +934,7 @@ T& concurrent_vector<T, A>::internal_subscript( size_type index ) const {
__TBB_ASSERT( index < my_early_size, "index out of bounds" );
size_type j = index;
segment_index_t k = segment_base_index_of( j );
- __TBB_ASSERT( my_segment != (segment_t*)my_storage || k < pointers_per_short_table, "index is being allocated" );
+ __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, "index is being allocated" );
// no need in __TBB_load_with_acquire since thread works in own space or gets
#if TBB_USE_THREADING_TOOLS
T* array = static_cast<T*>( tbb::internal::itt_load_pointer_v3(&my_segment[k].array));
@@ -942,7 +952,7 @@ T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index
internal::throw_exception(internal::eid_out_of_range); // throw std::out_of_range
size_type j = index;
segment_index_t k = segment_base_index_of( j );
- if( my_segment == (segment_t*)my_storage && k >= pointers_per_short_table )
+ if( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
internal::throw_exception(internal::eid_segment_range_error); // throw std::range_error
void *array = my_segment[k].array; // no need in __TBB_load_with_acquire
if( array <= internal::vector_allocation_error_flag ) // check for correct segment pointer
diff --git a/include/tbb/enumerable_thread_specific.h b/include/tbb/enumerable_thread_specific.h
index 1119836..668c353 100644
--- a/include/tbb/enumerable_thread_specific.h
+++ b/include/tbb/enumerable_thread_specific.h
@@ -31,7 +31,6 @@
#include "concurrent_vector.h"
#include "tbb_thread.h"
-#include "concurrent_hash_map.h"
#include "cache_aligned_allocator.h"
#if __SUNPRO_CC
#include <string.h> // for memcpy
@@ -45,12 +44,237 @@
namespace tbb {
- //! enum for selecting between single key and key-per-instance versions
- enum ets_key_usage_type { ets_key_per_instance, ets_no_key };
+//! enum for selecting between single key and key-per-instance versions
+enum ets_key_usage_type { ets_key_per_instance, ets_no_key };
+namespace interface5 {
+
//! @cond
- namespace internal {
+ namespace internal {
+
+ template<ets_key_usage_type ETS_key_type>
+ class ets_base: tbb::internal::no_copy {
+ protected:
+#if _WIN32||_WIN64
+ typedef DWORD key_type;
+#else
+ typedef pthread_t key_type;
+#endif
+#if __TBB_GCC_3_3_PROTECTED_BROKEN
+ public:
+#endif
+ struct slot;
+
+ struct array {
+ array* next;
+ size_t lg_size;
+ slot& at( size_t k ) {
+ return ((slot*)(void*)(this+1))[k];
+ }
+ size_t size() const {return (size_t)1<<lg_size;}
+ size_t mask() const {return size()-1;}
+ size_t start( size_t h ) const {
+ return h>>(8*sizeof(size_t)-lg_size);
+ }
+ };
+ struct slot {
+ key_type key;
+ void* ptr;
+ bool empty() const {return !key;}
+ bool match( key_type k ) const {return key==k;}
+ bool claim( key_type k ) {
+ __TBB_ASSERT(sizeof(tbb::atomic<key_type>)==sizeof(key_type), NULL);
+ __TBB_ASSERT(sizeof(void*)==sizeof(tbb::atomic<key_type>*), NULL);
+ union { void* space; tbb::atomic<key_type>* key_atomic; } helper;
+ helper.space = &key;
+ return helper.key_atomic->compare_and_swap(k,0)==0;
+ }
+ };
+#if __TBB_GCC_3_3_PROTECTED_BROKEN
+ protected:
+#endif
+ static key_type key_of_current_thread() {
+ tbb::tbb_thread::id id = tbb::this_tbb_thread::get_id();
+ key_type k;
+ memcpy( &k, &id, sizeof(k) );
+ return k;
+ }
+
+ //! Root of linked list of arrays of decreasing size.
+ /** NULL if and only if my_count==0.
+ Each array in the list is half the size of its predecessor. */
+ atomic<array*> my_root;
+ atomic<size_t> my_count;
+ virtual void* create_local() = 0;
+ virtual void* create_array(size_t _size) = 0; // _size in bytes
+ virtual void free_array(void* ptr, size_t _size) = 0; // _size in bytes
+ array* allocate( size_t lg_size ) {
+ size_t n = 1<<lg_size;
+ array* a = static_cast<array*>(create_array( sizeof(array)+n*sizeof(slot) ));
+ a->lg_size = lg_size;
+ std::memset( a+1, 0, n*sizeof(slot) );
+ return a;
+ }
+ void free(array* a) {
+ size_t n = 1<<(a->lg_size);
+ free_array( (void *)a, size_t(sizeof(array)+n*sizeof(slot)) );
+ }
+ static size_t hash( key_type k ) {
+ // Multiplicative hashing. Client should use *upper* bits.
+ // casts required for Mac gcc4.* compiler
+#if __TBB_WORDSIZE == 4
+ return uintptr_t(k)*0x9E3779B9;
+#else
+ return uintptr_t(k)*0x9E3779B97F4A7C15;
+#endif
+ }
+
+ ets_base() {my_root=NULL; my_count=0;}
+ virtual ~ets_base(); // g++ complains if this is not virtual...
+ void* table_lookup( bool& exists );
+ void table_clear();
+ slot& table_find( key_type k ) {
+ size_t h = hash(k);
+ array* r = my_root;
+ size_t mask = r->mask();
+ for(size_t i = r->start(h);;i=(i+1)&mask) {
+ slot& s = r->at(i);
+ if( s.empty() || s.match(k) )
+ return s;
+ }
+ }
+ void table_reserve_for_copy( const ets_base& other ) {
+ __TBB_ASSERT(!my_root,NULL);
+ __TBB_ASSERT(!my_count,NULL);
+ if( other.my_root ) {
+ array* a = allocate(other.my_root->lg_size);
+ a->next = NULL;
+ my_root = a;
+ my_count = other.my_count;
+ }
+ }
+ };
+
+ template<ets_key_usage_type ETS_key_type>
+ ets_base<ETS_key_type>::~ets_base() {
+ __TBB_ASSERT(!my_root, NULL);
+ }
+
+ template<ets_key_usage_type ETS_key_type>
+ void ets_base<ETS_key_type>::table_clear() {
+ while( array* r = my_root ) {
+ my_root = r->next;
+ free(r);
+ }
+ my_count = 0;
+ }
+
+ template<ets_key_usage_type ETS_key_type>
+ void* ets_base<ETS_key_type>::table_lookup( bool& exists ) {
+ const key_type k = key_of_current_thread();
+
+ __TBB_ASSERT(k!=0,NULL);
+ void* found;
+ size_t h = hash(k);
+ for( array* r=my_root; r; r=r->next ) {
+ size_t mask=r->mask();
+ for(size_t i = r->start(h); ;i=(i+1)&mask) {
+ slot& s = r->at(i);
+ if( s.empty() ) break;
+ if( s.match(k) ) {
+ if( r==my_root ) {
+ // Success at top level
+ exists = true;
+ return s.ptr;
+ } else {
+ // Success at some other level. Need to insert at top level.
+ exists = true;
+ found = s.ptr;
+ goto insert;
+ }
+ }
+ }
+ }
+ // Key does not yet exist
+ exists = false;
+ found = create_local();
+ {
+ size_t c = ++my_count;
+ array* r = my_root;
+ if( !r || c>r->size()/2 ) {
+ size_t s = r ? r->lg_size : 2;
+ while( c>size_t(1)<<(s-1) ) ++s;
+ array* a = allocate(s);
+ for(;;) {
+ a->next = my_root;
+ array* new_r = my_root.compare_and_swap(a,r);
+ if( new_r==r ) break;
+ if( new_r->lg_size>=s ) {
+ // Another thread inserted an equal or bigger array, so our array is superfluous.
+ free(a);
+ break;
+ }
+ r = new_r;
+ }
+ }
+ }
+ insert:
+ // Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.
+ array* ir = my_root;
+ size_t mask = ir->mask();
+ for(size_t i = ir->start(h);;i=(i+1)&mask) {
+ slot& s = ir->at(i);
+ if( s.empty() ) {
+ if( s.claim(k) ) {
+ s.ptr = found;
+ return found;
+ }
+ }
+ }
+ };
+
+ //! Specialization that exploits native TLS
+ template <>
+ class ets_base<ets_key_per_instance>: protected ets_base<ets_no_key> {
+ typedef ets_base<ets_no_key> super;
+#if _WIN32||_WIN64
+ typedef DWORD tls_key_t;
+ void create_key() { my_key = TlsAlloc(); }
+ void destroy_key() { TlsFree(my_key); }
+ void set_tls(void * value) { TlsSetValue(my_key, (LPVOID)value); }
+ void* get_tls() { return (void *)TlsGetValue(my_key); }
+#else
+ typedef pthread_key_t tls_key_t;
+ void create_key() { pthread_key_create(&my_key, NULL); }
+ void destroy_key() { pthread_key_delete(my_key); }
+ void set_tls( void * value ) const { pthread_setspecific(my_key, value); }
+ void* get_tls() const { return pthread_getspecific(my_key); }
+#endif
+ tls_key_t my_key;
+ virtual void* create_local() = 0;
+ virtual void* create_array(size_t _size) = 0; // _size in bytes
+ virtual void free_array(void* ptr, size_t _size) = 0; // size in bytes
+ public:
+ ets_base() {create_key();}
+ ~ets_base() {destroy_key();}
+ void* table_lookup( bool& exists ) {
+ void* found = get_tls();
+ if( found ) {
+ exists=true;
+ } else {
+ found = super::table_lookup(exists);
+ set_tls(found);
+ }
+ return found;
+ }
+ void table_clear() {
+ destroy_key();
+ create_key();
+ super::table_clear();
+ }
+ };
+
//! Random access iterator for traversing the thread local copies.
template< typename Container, typename Value >
class enumerable_thread_specific_iterator
@@ -118,9 +342,9 @@ namespace tbb {
Value& operator*() const {
Value* value = my_value;
if( !value ) {
- value = my_value = &(*my_container)[my_index].value;
+ value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
}
- __TBB_ASSERT( value==&(*my_container)[my_index].value, "corrupt cache" );
+ __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), "corrupt cache" );
return *value;
}
@@ -354,60 +578,6 @@ namespace tbb {
return !(i==j);
}
- // empty template for following specializations
- template<ets_key_usage_type et>
- struct tls_manager {};
-
- //! Struct that doesn't use a key
- template <>
- struct tls_manager<ets_no_key> {
- typedef size_t tls_key_t;
- static inline void create_key( tls_key_t &) { }
- static inline void destroy_key( tls_key_t & ) { }
- static inline void set_tls( tls_key_t &, void * ) { }
- static inline void * get_tls( tls_key_t & ) { return (size_t)0; }
- };
-
- //! Struct to use native TLS support directly
- template <>
- struct tls_manager <ets_key_per_instance> {
-#if _WIN32||_WIN64
- typedef DWORD tls_key_t;
- static inline void create_key( tls_key_t &k) { k = TlsAlloc(); }
- static inline void destroy_key( tls_key_t &k) { TlsFree(k); }
- static inline void set_tls( tls_key_t &k, void * value) { TlsSetValue(k, (LPVOID)value); }
- static inline void * get_tls( tls_key_t &k ) { return (void *)TlsGetValue(k); }
-#else
- typedef pthread_key_t tls_key_t;
- static inline void create_key( tls_key_t &k) { pthread_key_create(&k, NULL); }
- static inline void destroy_key( tls_key_t &k) { pthread_key_delete(k); }
- static inline void set_tls( tls_key_t &k, void * value) { pthread_setspecific(k, value); }
- static inline void * get_tls( tls_key_t &k ) { return pthread_getspecific(k); }
-#endif
- };
-
- class thread_hash_compare {
- public:
- // using hack suggested by Arch to get value for thread id for hashing...
-#if _WIN32||_WIN64
- typedef DWORD thread_key;
-#else
- typedef pthread_t thread_key;
-#endif
- static thread_key my_thread_key(const tbb_thread::id j) {
- thread_key key_val;
- memcpy(&key_val, &j, sizeof(thread_key));
- return key_val;
- }
-
- bool equal( const thread_key j, const thread_key k) const {
- return j == k;
- }
- unsigned long hash(const thread_key k) const {
- return (unsigned long)k;
- }
- };
-
// storage for initialization function pointer
template<typename T>
struct callback_base {
@@ -420,7 +590,7 @@ namespace tbb {
};
template <typename T, typename Functor>
- struct callback_leaf : public callback_base<T> {
+ struct callback_leaf : public callback_base<T>, public tbb::internal::no_copy {
typedef Functor my_callback_type;
typedef callback_leaf<T,Functor> my_type;
typedef my_type* callback_pointer;
@@ -447,39 +617,71 @@ namespace tbb {
/* override */ T apply() { return f(); } // does copy construction of returned value.
};
- template<typename Key, typename T, typename HC, typename A>
- class ets_concurrent_hash_map : public tbb::concurrent_hash_map<Key, T, HC, A> {
- public:
- typedef tbb::concurrent_hash_map<Key, T, HC, A> base_type;
- typedef typename base_type::const_pointer const_pointer;
- typedef typename base_type::key_type key_type;
- const_pointer find( const key_type &k ) {
- return internal_fast_find( k );
- } // make public
+
+ //! Template for adding padding in order to avoid false sharing
+ /** ModularSize should be sizeof(U) modulo the cache line size.
+ All maintenance of the space will be done explicitly on push_back,
+ and all thread local copies must be destroyed before the concurrent
+ vector is deleted.
+ */
+ template<typename U, size_t ModularSize>
+ struct ets_element {
+ char value[sizeof(U) + tbb::internal::NFS_MaxLineSize-ModularSize];
+ void unconstruct() {
+ // "reinterpret_cast<U*>(&value)->~U();" causes type-punning warning with gcc 4.4,
+ // "U* u = reinterpret_cast<U*>(&value); u->~U();" causes unused variable warning with VS2010.
+ // Thus another "casting via union" hack.
+ __TBB_ASSERT(sizeof(void*)==sizeof(U*),NULL);
+ union { void* space; U* val; } helper;
+ helper.space = &value;
+ helper.val->~U();
+ }
};
-
+
+ //! Partial specialization for case where no padding is needed.
+ template<typename U>
+ struct ets_element<U,0> {
+ char value[sizeof(U)];
+ void unconstruct() { // Same implementation as in general case
+ __TBB_ASSERT(sizeof(void*)==sizeof(U*),NULL);
+ union { void* space; U* val; } helper;
+ helper.space = &value;
+ helper.val->~U();
+ }
+ };
+
} // namespace internal
//! @endcond
- //! The thread local class template
+ //! The enumerable_thread_specific container
+ /** enumerable_thread_specific has the following properties:
+ - thread-local copies are lazily created, with default, exemplar or function initialization.
+ - thread-local copies do not move (during lifetime, and excepting clear()) so the address of a copy is invariant.
+ - the contained objects need not have operator=() defined if combine is not used.
+ - enumerable_thread_specific containers may be copy-constructed or assigned.
+ - thread-local copies can be managed by hash-table, or can be accessed via TLS storage for speed.
+ - outside of parallel contexts, the contents of all thread-local copies are accessible by iterator or using combine or combine_each methods
+
+ @par Segmented iterator
+ When the thread-local objects are containers with input_iterators defined, a segmented iterator may
+ be used to iterate over all the elements of all thread-local copies.
+
+ @par combine and combine_each
+ - Both methods are defined for enumerable_thread_specific.
+ - combine() requires the the type T have operator=() defined.
+ - neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)
+ - Both are evaluated in serial context (the methods are assumed to be non-benign.)
+
+ @ingroup containers */
template <typename T,
typename Allocator=cache_aligned_allocator<T>,
ets_key_usage_type ETS_key_type=ets_no_key >
- class enumerable_thread_specific {
+ class enumerable_thread_specific: internal::ets_base<ETS_key_type> {
template<typename U, typename A, ets_key_usage_type C> friend class enumerable_thread_specific;
- typedef internal::tls_manager< ETS_key_type > my_tls_manager;
+ typedef internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
- //! The padded elements; padded to avoid false sharing
- template<typename U>
- struct padded_element {
- U value;
- char padding[ ( (sizeof(U) - 1) / internal::NFS_MaxLineSize + 1 ) * internal::NFS_MaxLineSize - sizeof(U) ];
- padded_element(const U &v) : value(v) {}
- padded_element() {}
- };
-
//! A generic range, used to create range objects from the iterators
template<typename I>
class generic_range_type: public blocked_range<I> {
@@ -489,61 +691,80 @@ namespace tbb {
typedef const T& const_reference;
typedef I iterator;
typedef ptrdiff_t difference_type;
- generic_range_type( I begin_, I end_, size_t grainsize = 1) : blocked_range<I>(begin_,end_,grainsize) {}
+ generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {}
template<typename U>
generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {}
generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}
};
- typedef typename Allocator::template rebind< padded_element<T> >::other padded_allocator_type;
- typedef tbb::concurrent_vector< padded_element<T>, padded_allocator_type > internal_collection_type;
- typedef typename internal_collection_type::size_type hash_table_index_type; // storing array indices rather than iterators to simplify
- // copying the hash table that correlates thread IDs with concurrent vector elements.
+ typedef typename Allocator::template rebind< padded_element >::other padded_allocator_type;
+ typedef tbb::concurrent_vector< padded_element, padded_allocator_type > internal_collection_type;
- typedef typename Allocator::template rebind< std::pair< typename internal::thread_hash_compare::thread_key, hash_table_index_type > >::other hash_element_allocator;
- typedef internal::ets_concurrent_hash_map< typename internal::thread_hash_compare::thread_key, hash_table_index_type, internal::thread_hash_compare, hash_element_allocator > thread_to_index_type;
-
- typename my_tls_manager::tls_key_t my_key;
-
- void reset_key() {
- my_tls_manager::destroy_key(my_key);
- my_tls_manager::create_key(my_key);
- }
-
internal::callback_base<T> *my_finit_callback;
// need to use a pointed-to exemplar because T may not be assignable.
// using tbb_allocator instead of padded_element_allocator because we may be
// copying an exemplar from one instantiation of ETS to another with a different
// allocator.
- typedef typename tbb::tbb_allocator<padded_element<T> > exemplar_allocator_type;
- static padded_element<T> * create_exemplar(const T& my_value) {
- padded_element<T> *new_exemplar = 0;
- // void *new_space = padded_allocator_type().allocate(1);
- void *new_space = exemplar_allocator_type().allocate(1);
- new_exemplar = new(new_space) padded_element<T>(my_value);
+ typedef typename tbb::tbb_allocator<padded_element > exemplar_allocator_type;
+ static padded_element * create_exemplar(const T& my_value) {
+ padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
+ new(new_exemplar->value) T(my_value);
return new_exemplar;
}
- static padded_element<T> *create_exemplar( ) {
- // void *new_space = padded_allocator_type().allocate(1);
- void *new_space = exemplar_allocator_type().allocate(1);
- padded_element<T> *new_exemplar = new(new_space) padded_element<T>( );
+ static padded_element *create_exemplar( ) {
+ padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
+ new(new_exemplar->value) T( );
return new_exemplar;
}
- static void free_exemplar(padded_element<T> *my_ptr) {
- // padded_allocator_type().destroy(my_ptr);
- // padded_allocator_type().deallocate(my_ptr,1);
+ static void free_exemplar(padded_element *my_ptr) {
+ my_ptr->unconstruct();
exemplar_allocator_type().destroy(my_ptr);
exemplar_allocator_type().deallocate(my_ptr,1);
}
- padded_element<T>* my_exemplar_ptr;
+ padded_element* my_exemplar_ptr;
internal_collection_type my_locals;
- thread_to_index_type my_hash_tbl;
-
+
+ /*override*/ void* create_local() {
+#if TBB_DEPRECATED
+ void* lref = &my_locals[my_locals.push_back(padded_element())];
+#else
+ void* lref = &*my_locals.push_back(padded_element());
+#endif
+ if(my_finit_callback) {
+ new(lref) T(my_finit_callback->apply());
+ } else if(my_exemplar_ptr) {
+ pointer t_exemp = reinterpret_cast<T *>(&(my_exemplar_ptr->value));
+ new(lref) T(*t_exemp);
+ } else {
+ new(lref) T();
+ }
+ return lref;
+ }
+
+ void unconstruct_locals() {
+ for(typename internal_collection_type::iterator cvi = my_locals.begin(); cvi != my_locals.end(); ++cvi) {
+ cvi->unconstruct();
+ }
+ }
+
+ typedef typename Allocator::template rebind< uintptr_t >::other array_allocator_type;
+
+ // _size is in bytes
+ /*override*/ void* create_array(size_t _size) {
+ size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);
+ return array_allocator_type().allocate(nelements);
+ }
+
+ /*override*/ void free_array( void* _ptr, size_t _size) {
+ size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);
+ array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
+ }
+
public:
//! Basic types
@@ -566,8 +787,7 @@ namespace tbb {
//! Default constructor, which leads to default construction of local copies
enumerable_thread_specific() : my_finit_callback(0) {
- my_exemplar_ptr = create_exemplar();
- my_tls_manager::create_key(my_key);
+ my_exemplar_ptr = 0;
}
//! construction with initializer method
@@ -576,26 +796,24 @@ namespace tbb {
enumerable_thread_specific( Finit _finit )
{
my_finit_callback = internal::callback_leaf<T,Finit>::new_callback( _finit );
- my_tls_manager::create_key(my_key);
my_exemplar_ptr = 0; // don't need exemplar if function is provided
}
//! Constuction with exemplar, which leads to copy construction of local copies
enumerable_thread_specific(const T &_exemplar) : my_finit_callback(0) {
my_exemplar_ptr = create_exemplar(_exemplar);
- my_tls_manager::create_key(my_key);
}
//! Destructor
~enumerable_thread_specific() {
- my_tls_manager::destroy_key(my_key);
if(my_finit_callback) {
my_finit_callback->destroy();
}
- if(my_exemplar_ptr)
- {
+ if(my_exemplar_ptr) {
free_exemplar(my_exemplar_ptr);
}
+ this->clear(); // deallocation before the derived class is finished destructing
+ // So free(array *) is still accessible
}
//! returns reference to local, discarding exists
@@ -606,56 +824,10 @@ namespace tbb {
//! Returns reference to calling thread's local copy, creating one if necessary
reference local(bool& exists) {
- if ( pointer local_ptr = static_cast<pointer>(my_tls_manager::get_tls(my_key)) ) {
- exists = true;
- return *local_ptr;
- }
- hash_table_index_type local_index;
- typename internal::thread_hash_compare::thread_key my_t_key = internal::thread_hash_compare::my_thread_key(tbb::this_tbb_thread::get_id());
- {
- typename thread_to_index_type::const_pointer my_existing_entry;
- my_existing_entry = my_hash_tbl.find(my_t_key);
- if(my_existing_entry) {
- exists = true;
- local_index = my_existing_entry->second;
- }
- else {
-
- // see if the table entry can be found by accessor
- typename thread_to_index_type::accessor a;
- if(!my_hash_tbl.insert(a, my_t_key)) {
- exists = true;
- local_index = a->second;
- }
- else {
- // create new entry
- exists = false;
- if(my_finit_callback) {
- // convert iterator to array index
-#if TBB_DEPRECATED
- local_index = my_locals.push_back(my_finit_callback->apply());
-#else
- local_index = my_locals.push_back(my_finit_callback->apply()) - my_locals.begin();
-#endif
- }
- else {
- // convert iterator to array index
-#if TBB_DEPRECATED
- local_index = my_locals.push_back(*my_exemplar_ptr);
-#else
- local_index = my_locals.push_back(*my_exemplar_ptr) - my_locals.begin();
-#endif
- }
- // insert into hash table
- a->second = local_index;
- }
- }
- }
-
- reference local_ref = (my_locals[local_index].value);
- my_tls_manager::set_tls( my_key, static_cast<void *>(&local_ref) );
- return local_ref;
- } // local
+ __TBB_ASSERT(ETS_key_type==ets_no_key,"ets_key_per_instance not yet implemented");
+ void* ptr = this->table_lookup(exists);
+ return *(T*)ptr;
+ }
//! Get the number of local copies
size_type size() const { return my_locals.size(); }
@@ -679,55 +851,32 @@ namespace tbb {
//! Get const range for parallel algorithms
const_range_type range( size_t grainsize=1 ) const { return const_range_type( begin(), end(), grainsize ); }
-
+
//! Destroys local copies
void clear() {
+ unconstruct_locals();
my_locals.clear();
- my_hash_tbl.clear();
- reset_key();
+ this->table_clear();
// callback is not destroyed
// exemplar is not destroyed
}
- // STL container methods
- // copy constructor
-
private:
template<typename U, typename A2, ets_key_usage_type C2>
- void
- internal_copy_construct( const enumerable_thread_specific<U, A2, C2>& other) {
- typedef typename tbb::enumerable_thread_specific<U, A2, C2> other_type;
- for(typename other_type::const_iterator ci = other.begin(); ci != other.end(); ++ci) {
- my_locals.push_back(*ci);
- }
- if(other.my_finit_callback) {
- my_finit_callback = other.my_finit_callback->make_copy();
- }
- else {
- my_finit_callback = 0;
- }
- if(other.my_exemplar_ptr) {
- my_exemplar_ptr = create_exemplar(other.my_exemplar_ptr->value);
- }
- else {
- my_exemplar_ptr = 0;
- }
- my_tls_manager::create_key(my_key);
- }
+ void internal_copy( const enumerable_thread_specific<U, A2, C2>& other);
public:
template<typename U, typename Alloc, ets_key_usage_type Cachetype>
- enumerable_thread_specific( const enumerable_thread_specific<U, Alloc, Cachetype>& other ) : my_hash_tbl(other.my_hash_tbl)
- { // Have to do push_back because the contained elements are not necessarily assignable.
- internal_copy_construct(other);
+ enumerable_thread_specific( const enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
+ {
+ internal_copy(other);
}
- // non-templatized version
- enumerable_thread_specific( const enumerable_thread_specific& other ) : my_hash_tbl(other.my_hash_tbl)
+ enumerable_thread_specific( const enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
{
- internal_copy_construct(other);
+ internal_copy(other);
}
private:
@@ -735,15 +884,8 @@ namespace tbb {
template<typename U, typename A2, ets_key_usage_type C2>
enumerable_thread_specific &
internal_assign(const enumerable_thread_specific<U, A2, C2>& other) {
- typedef typename tbb::enumerable_thread_specific<U, A2, C2> other_type;
if(static_cast<void *>( this ) != static_cast<const void *>( &other )) {
- this->clear(); // resets TLS key
- my_hash_tbl = other.my_hash_tbl;
- // cannot use assign because T may not be assignable.
- for(typename other_type::const_iterator ci = other.begin(); ci != other.end(); ++ci) {
- my_locals.push_back(*ci);
- }
-
+ this->clear();
if(my_finit_callback) {
my_finit_callback->destroy();
my_finit_callback = 0;
@@ -752,13 +894,7 @@ namespace tbb {
free_exemplar(my_exemplar_ptr);
my_exemplar_ptr = 0;
}
- if(other.my_finit_callback) {
- my_finit_callback = other.my_finit_callback->make_copy();
- }
-
- if(other.my_exemplar_ptr) {
- my_exemplar_ptr = create_exemplar(other.my_exemplar_ptr->value);
- }
+ internal_copy( other );
}
return *this;
}
@@ -776,36 +912,21 @@ namespace tbb {
return internal_assign(other);
}
- private:
-
- // combine_func_t has signature T(T,T) or T(const T&, const T&)
- template <typename combine_func_t>
- T internal_combine(typename internal_collection_type::const_range_type r, combine_func_t f_combine) {
- if(r.is_divisible()) {
- typename internal_collection_type::const_range_type r2(r,split());
- return f_combine(internal_combine(r2, f_combine), internal_combine(r, f_combine));
- }
- if(r.size() == 1) {
- return r.begin()->value;
- }
- typename internal_collection_type::const_iterator i2 = r.begin();
- ++i2;
- return f_combine(r.begin()->value, i2->value);
- }
-
- public:
-
// combine_func_t has signature T(T,T) or T(const T&, const T&)
template <typename combine_func_t>
T combine(combine_func_t f_combine) {
- if(my_locals.begin() == my_locals.end()) {
+ if(begin() == end()) {
if(my_finit_callback) {
return my_finit_callback->apply();
}
- return (*my_exemplar_ptr).value;
+ pointer local_ref = reinterpret_cast<T*>((my_exemplar_ptr->value));
+ return T(*local_ref);
}
- typename internal_collection_type::const_range_type r(my_locals.begin(), my_locals.end(), (size_t)2);
- return internal_combine(r, f_combine);
+ const_iterator ci = begin();
+ T my_result = *ci;
+ while(++ci != end())
+ my_result = f_combine( my_result, *ci );
+ return my_result;
}
// combine_func_t has signature void(T) or void(const T&)
@@ -815,8 +936,48 @@ namespace tbb {
f_combine( *ci );
}
}
+
}; // enumerable_thread_specific
+
+ template <typename T, typename Allocator, ets_key_usage_type ETS_key_type>
+ template<typename U, typename A2, ets_key_usage_type C2>
+ void enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( const enumerable_thread_specific<U, A2, C2>& other) {
+ typedef internal::ets_base<ets_no_key> base;
+ __TBB_ASSERT(my_locals.size()==0,NULL);
+ this->table_reserve_for_copy( other );
+ for( base::array* r=other.my_root; r; r=r->next ) {
+ for( size_t i=0; i<r->size(); ++i ) {
+ base::slot& s1 = r->at(i);
+ if( !s1.empty() ) {
+ base::slot& s2 = this->table_find(s1.key);
+ if( s2.empty() ) {
+#if TBB_DEPRECATED
+ void* lref = &my_locals[my_locals.push_back(padded_element())];
+#else
+ void* lref = &*my_locals.push_back(padded_element());
+#endif
+ s2.ptr = new(lref) T(*(U*)s1.ptr);
+ s2.key = s1.key;
+ } else {
+ // Skip the duplicate
+ }
+ }
+ }
+ }
+ if(other.my_finit_callback) {
+ my_finit_callback = other.my_finit_callback->make_copy();
+ } else {
+ my_finit_callback = 0;
+ }
+ if(other.my_exemplar_ptr) {
+ pointer local_ref = reinterpret_cast<U*>(other.my_exemplar_ptr->value);
+ my_exemplar_ptr = create_exemplar(*local_ref);
+ } else {
+ my_exemplar_ptr = 0;
+ }
+ }
+
template< typename Container >
class flattened2d {
@@ -875,6 +1036,16 @@ namespace tbb {
return flattened2d<Container>(c);
}
+} // interface5
+
+namespace internal {
+using interface5::internal::segmented_iterator;
+}
+
+using interface5::enumerable_thread_specific;
+using interface5::flattened2d;
+using interface5::flatten2d;
+
} // namespace tbb
#endif
diff --git a/include/tbb/machine/linux_common.h b/include/tbb/machine/linux_common.h
index 4a48245..35c5ce7 100644
--- a/include/tbb/machine/linux_common.h
+++ b/include/tbb/machine/linux_common.h
@@ -35,7 +35,9 @@
#include <sched.h>
// Definition of __TBB_Yield()
+#ifndef __TBB_Yield
#define __TBB_Yield() sched_yield()
+#endif
/* Futex definitions */
#include <sys/syscall.h>
diff --git a/include/tbb/machine/linux_ia32.h b/include/tbb/machine/linux_ia32.h
index 73a699e..e0041a1 100644
--- a/include/tbb/machine/linux_ia32.h
+++ b/include/tbb/machine/linux_ia32.h
@@ -41,14 +41,20 @@
inline void __TBB_rel_acq_fence() { __asm__ __volatile__("mfence": : :"memory"); }
+#if __TBB_ICC_ASM_VOLATILE_BROKEN
+#define __TBB_VOLATILE
+#else
+#define __TBB_VOLATILE volatile
+#endif
+
#define __MACHINE_DECL_ATOMICS(S,T,X) \
static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand ) \
{ \
T result; \
\
__asm__ __volatile__("lock\ncmpxchg" X " %2,%1" \
- : "=a"(result), "=m"(*(T *)ptr) \
- : "q"(value), "0"(comparand), "m"(*(T *)ptr) \
+ : "=a"(result), "=m"(*(__TBB_VOLATILE T*)ptr) \
+ : "q"(value), "0"(comparand), "m"(*(__TBB_VOLATILE T*)ptr) \
: "memory"); \
return result; \
} \
@@ -57,8 +63,8 @@ static inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)
{ \
T result; \
__asm__ __volatile__("lock\nxadd" X " %0,%1" \
- : "=r"(result), "=m"(*(T *)ptr) \
- : "0"(addend), "m"(*(T *)ptr) \
+ : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr) \
+ : "0"(addend), "m"(*(__TBB_VOLATILE T*)ptr) \
: "memory"); \
return result; \
} \
@@ -67,8 +73,8 @@ static inline T __TBB_machine_fetchstore##S(volatile void *ptr, T value)
{ \
T result; \
__asm__ __volatile__("lock\nxchg" X " %0,%1" \
- : "=r"(result), "=m"(*(T *)ptr) \
- : "0"(value), "m"(*(T *)ptr) \
+ : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr) \
+ : "0"(value), "m"(*(__TBB_VOLATILE T*)ptr) \
: "memory"); \
return result; \
} \
@@ -82,7 +88,7 @@ static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value,
int64_t result;
#if __PIC__
/* compiling position-independent code */
- // EBX register preserved for compliancy with position-independent code rules on IA32
+ // EBX register preserved for compliance with position-independent code rules on IA32
__asm__ __volatile__ (
"pushl %%ebx\n\t"
"movl (%%ecx),%%ebx\n\t"
@@ -106,8 +112,8 @@ static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value,
i64 = value;
__asm__ __volatile__ (
"lock\n\t cmpxchg8b %1\n\t"
- : "=A"(result), "=m"(*(int64_t *)ptr)
- : "m"(*(int64_t *)ptr)
+ : "=A"(result), "=m"(*(__TBB_VOLATILE int64_t *)ptr)
+ : "m"(*(__TBB_VOLATILE int64_t *)ptr)
, "0"(comparand)
, "b"(i32[0]), "c"(i32[1])
: "memory"
@@ -123,11 +129,11 @@ static inline int32_t __TBB_machine_lg( uint32_t x ) {
}
static inline void __TBB_machine_or( volatile void *ptr, uint32_t addend ) {
- __asm__ __volatile__("lock\norl %1,%0" : "=m"(*(uint32_t *)ptr) : "r"(addend), "m"(*(uint32_t *)ptr) : "memory");
+ __asm__ __volatile__("lock\norl %1,%0" : "=m"(*(__TBB_VOLATILE uint32_t *)ptr) : "r"(addend), "m"(*(__TBB_VOLATILE uint32_t *)ptr) : "memory");
}
static inline void __TBB_machine_and( volatile void *ptr, uint32_t addend ) {
- __asm__ __volatile__("lock\nandl %1,%0" : "=m"(*(uint32_t *)ptr) : "r"(addend), "m"(*(uint32_t *)ptr) : "memory");
+ __asm__ __volatile__("lock\nandl %1,%0" : "=m"(*(__TBB_VOLATILE uint32_t *)ptr) : "r"(addend), "m"(*(__TBB_VOLATILE uint32_t *)ptr) : "memory");
}
static inline void __TBB_machine_pause( int32_t delay ) {
@@ -142,10 +148,10 @@ static inline int64_t __TBB_machine_load8 (const volatile void *ptr) {
if( ((uint32_t)ptr&7u)==0 ) {
// Aligned load
__asm__ __volatile__ ( "fildq %1\n\t"
- "fistpq %0" : "=m"(result) : "m"(*(uint64_t *)ptr) : "memory" );
+ "fistpq %0" : "=m"(result) : "m"(*(const __TBB_VOLATILE uint64_t*)ptr) : "memory" );
} else {
// Unaligned load
- result = __TBB_machine_cmpswp8((void*)ptr,0,0);
+ result = __TBB_machine_cmpswp8(const_cast<void*>(ptr),0,0);
}
return result;
}
@@ -159,7 +165,7 @@ static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
if( ((uint32_t)ptr&7u)==0 ) {
// Aligned store
__asm__ __volatile__ ( "fildq %1\n\t"
- "fistpq %0" : "=m"(*(int64_t *)ptr) : "m"(value) : "memory" );
+ "fistpq %0" : "=m"(*(__TBB_VOLATILE int64_t*)ptr) : "m"(value) : "memory" );
} else {
// Unaligned store
#if TBB_USE_PERFORMANCE_WARNINGS
@@ -186,7 +192,7 @@ struct __TBB_machine_load_store {
template <typename T>
struct __TBB_machine_load_store<T,8> {
static inline T load_with_acquire(const volatile T& location) {
- T to_return = __TBB_machine_load8((volatile void *)&location);
+ T to_return = __TBB_machine_load8((const volatile void *)&location);
__asm__ __volatile__("" : : : "memory" ); // Compiler fence to keep operations from migrating upwards
return to_return;
}
@@ -197,6 +203,8 @@ struct __TBB_machine_load_store<T,8> {
}
};
+#undef __TBB_VOLATILE
+
template<typename T>
inline T __TBB_machine_load_with_acquire(const volatile T &location) {
return __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
diff --git a/include/tbb/machine/linux_intel64.h b/include/tbb/machine/linux_intel64.h
index 77a78ad..aa8472c 100644
--- a/include/tbb/machine/linux_intel64.h
+++ b/include/tbb/machine/linux_intel64.h
@@ -47,8 +47,8 @@ static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparan
T result; \
\
__asm__ __volatile__("lock\ncmpxchg" X " %2,%1" \
- : "=a"(result), "=m"(*(T *)ptr) \
- : "q"(value), "0"(comparand), "m"(*(T *)ptr) \
+ : "=a"(result), "=m"(*(volatile T*)ptr) \
+ : "q"(value), "0"(comparand), "m"(*(volatile T*)ptr) \
: "memory"); \
return result; \
} \
@@ -57,8 +57,8 @@ static inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)
{ \
T result; \
__asm__ __volatile__("lock\nxadd" X " %0,%1" \
- : "=r"(result),"=m"(*(T *)ptr) \
- : "0"(addend), "m"(*(T *)ptr) \
+ : "=r"(result),"=m"(*(volatile T*)ptr) \
+ : "0"(addend), "m"(*(volatile T*)ptr) \
: "memory"); \
return result; \
} \
@@ -67,8 +67,8 @@ static inline T __TBB_machine_fetchstore##S(volatile void *ptr, T value)
{ \
T result; \
__asm__ __volatile__("lock\nxchg" X " %0,%1" \
- : "=r"(result),"=m"(*(T *)ptr) \
- : "0"(value), "m"(*(T *)ptr) \
+ : "=r"(result),"=m"(*(volatile T*)ptr) \
+ : "0"(value), "m"(*(volatile T*)ptr) \
: "memory"); \
return result; \
} \
@@ -85,11 +85,11 @@ static inline int64_t __TBB_machine_lg( uint64_t x ) {
}
static inline void __TBB_machine_or( volatile void *ptr, uint64_t addend ) {
- __asm__ __volatile__("lock\norq %1,%0" : "=m"(*(uint64_t *)ptr) : "r"(addend), "m"(*(uint64_t *)ptr) : "memory");
+ __asm__ __volatile__("lock\norq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(addend), "m"(*(volatile uint64_t*)ptr) : "memory");
}
static inline void __TBB_machine_and( volatile void *ptr, uint64_t addend ) {
- __asm__ __volatile__("lock\nandq %1,%0" : "=m"(*(uint64_t *)ptr) : "r"(addend), "m"(*(uint64_t *)ptr) : "memory");
+ __asm__ __volatile__("lock\nandq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(addend), "m"(*(volatile uint64_t*)ptr) : "memory");
}
static inline void __TBB_machine_pause( int32_t delay ) {
@@ -97,7 +97,7 @@ static inline void __TBB_machine_pause( int32_t delay ) {
__asm__ __volatile__("pause;");
}
return;
-}
+}
// Machine specific atomic operations
@@ -126,7 +126,9 @@ static inline void __TBB_machine_pause( int32_t delay ) {
#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
// Definition of other functions
+#ifndef __TBB_Pause
#define __TBB_Pause(V) __TBB_machine_pause(V)
+#endif
#define __TBB_Log2(V) __TBB_machine_lg(V)
// Special atomic functions
diff --git a/include/tbb/machine/windows_ia32.h b/include/tbb/machine/windows_ia32.h
index dcf7b19..e6e3fc1 100644
--- a/include/tbb/machine/windows_ia32.h
+++ b/include/tbb/machine/windows_ia32.h
@@ -151,7 +151,8 @@ static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \
__TBB_DEFINE_ATOMICS(1, __int8, __int8, al, cl)
__TBB_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)
-__TBB_DEFINE_ATOMICS(4, __int32, ptrdiff_t, eax, ecx)
+__TBB_DEFINE_ATOMICS(4, __int32, __int32, eax, ecx)
+__TBB_DEFINE_ATOMICS(W, ptrdiff_t, ptrdiff_t, eax, ecx)
static inline __int32 __TBB_machine_lg( unsigned __int64 i ) {
unsigned __int32 j;
@@ -197,19 +198,19 @@ static inline void __TBB_machine_pause (__int32 delay ) {
#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_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_fetchadd4(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_fetchstore4(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)
diff --git a/include/tbb/machine/xbox360_ppc.h b/include/tbb/machine/xbox360_ppc.h
new file mode 100644
index 0000000..0a3b2ef
--- /dev/null
+++ b/include/tbb/machine/xbox360_ppc.h
@@ -0,0 +1,85 @@
+/*
+ Copyright 2005-2010 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#define NONET
+#define NOD3D
+#include "xtl.h"
+#include "ppcintrinsics.h"
+
+#if _MSC_VER >= 1300
+extern "C" void _ReadWriteBarrier();
+#pragma intrinsic(_ReadWriteBarrier)
+#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+#endif
+
+inline void __TBB_rel_acq_fence() { __lwsync(); }
+
+#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
+
+inline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand )
+{
+ __lwsync();
+ __int32 result = InterlockedCompareExchange((volatile LONG*)ptr, value, comparand);
+ __lwsync();
+ return result;
+}
+
+inline __int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand )
+{
+ __lwsync();
+ __int64 result = InterlockedCompareExchange64((volatile LONG64*)ptr, value, comparand);
+ __lwsync();
+ return result;
+}
+
+#pragma optimize( "", off )
+inline void __TBB_machine_pause (__int32 delay )
+{
+ for (__int32 i=0; i<delay; i++) {;};
+}
+#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)
+#define __TBB_fence_for_acquire() __lwsync()
+#define __TBB_fence_for_release() __lwsync()
+
diff --git a/include/tbb/mutex.h b/include/tbb/mutex.h
index 32a61f6..f42bf2d 100644
--- a/include/tbb/mutex.h
+++ b/include/tbb/mutex.h
@@ -30,19 +30,14 @@
#define __TBB_mutex_H
#if _WIN32||_WIN64
-#include <windows.h>
-#if !defined(_WIN32_WINNT)
-// The following Windows API function is declared explicitly;
-// otherwise any user would have to specify /D_WIN32_WINNT=0x0400
-extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
-#endif
-
+ #include <windows.h>
+ #if !defined(_WIN32_WINNT)
+ // The following Windows API function is declared explicitly;
+ // otherwise any user would have to specify /D_WIN32_WINNT=0x0400
+ extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+ #endif
#else /* if not _WIN32||_WIN64 */
-#include <pthread.h>
-namespace tbb { namespace internal {
-// Use this internal TBB function to throw an exception
-extern void handle_perror( int error_code, const char* what );
-} } //namespaces
+ #include <pthread.h>
#endif /* _WIN32||_WIN64 */
#include <new>
@@ -97,7 +92,6 @@ public:
scoped_lock() : my_mutex(NULL) {};
//! Acquire lock on given mutex.
- /** Upon entry, *this should not be in the "have acquired a mutex" state. */
scoped_lock( mutex& mutex ) {
acquire( mutex );
}
@@ -210,14 +204,23 @@ public:
#endif /* TBB_USE_ASSERT */
}
-private:
-#if _WIN32||_WIN64
- CRITICAL_SECTION impl;
+ //! Return native_handle
+ #if _WIN32||_WIN64
+ typedef LPCRITICAL_SECTION native_handle_type;
+ #else
+ typedef pthread_mutex_t* native_handle_type;
+ #endif
+ native_handle_type native_handle() { return (native_handle_type) &impl; }
+
enum state_t {
INITIALIZED=0x1234,
DESTROYED=0x789A,
HELD=0x56CD
- } state;
+ };
+private:
+#if _WIN32||_WIN64
+ CRITICAL_SECTION impl;
+ enum state_t state;
#else
pthread_mutex_t impl;
#endif /* _WIN32||_WIN64 */
@@ -227,6 +230,12 @@ private:
//! All checks from mutex destructor using mutex.state were moved here
void __TBB_EXPORTED_METHOD internal_destroy();
+
+#if _WIN32||_WIN64
+public:
+ //! Set the internal state
+ void set_state( state_t to ) { state = to; }
+#endif
};
__TBB_DEFINE_PROFILING_SET_NAME(mutex)
diff --git a/include/tbb/parallel_do.h b/include/tbb/parallel_do.h
index c6fe53a..6f91f72 100644
--- a/include/tbb/parallel_do.h
+++ b/include/tbb/parallel_do.h
@@ -162,7 +162,7 @@ namespace internal {
{
typedef do_iteration_task<Body, Item> iteration_type;
- iteration_type& t = *new (task::self().allocate_additional_child_of(*my_barrier)) iteration_type(item, *this);
+ iteration_type& t = *new (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *this);
t.spawn( t );
}
@@ -176,7 +176,7 @@ namespace internal {
__TBB_ASSERT(my_barrier, "root task allocation failed");
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
parallel_do_feeder_impl(tbb::task_group_context &context)
{
my_barrier = new( task::allocate_root(context) ) empty_task();
@@ -393,13 +393,13 @@ namespace internal {
@ingroup algorithms */
template<typename Iterator, typename Body, typename Item>
void run_parallel_do( Iterator first, Iterator last, const Body& body
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, task_group_context& context
#endif
)
{
typedef do_task_iter<Iterator, Body, Item> root_iteration_task;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
parallel_do_feeder_impl<Body, Item> feeder(context);
#else
parallel_do_feeder_impl<Body, Item> feeder;
@@ -417,15 +417,15 @@ namespace internal {
@ingroup algorithms **/
template<typename Iterator, typename Body, typename Item>
void select_parallel_do( Iterator first, Iterator last, const Body& body, void (Body::*)(Item) const
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, task_group_context& context
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
)
{
run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, context
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
);
}
@@ -434,15 +434,15 @@ namespace internal {
@ingroup algorithms **/
template<typename Iterator, typename Body, typename Item, typename _Item>
void select_parallel_do( Iterator first, Iterator last, const Body& body, void (Body::*)(Item, parallel_do_feeder<_Item>&) const
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, task_group_context& context
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
)
{
run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, context
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
);
}
@@ -479,17 +479,17 @@ void parallel_do( Iterator first, Iterator last, const Body& body )
{
if ( first == last )
return;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
task_group_context context;
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
internal::select_parallel_do( first, last, body, &Body::operator()
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, context
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
);
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Parallel iteration over a range, with optional addition of more work and user-supplied context
/** @ingroup algorithms */
template<typename Iterator, typename Body>
@@ -499,7 +499,7 @@ void parallel_do( Iterator first, Iterator last, const Body& body, task_group_co
return;
internal::select_parallel_do( first, last, body, &Body::operator(), context );
}
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
//@}
diff --git a/include/tbb/parallel_for.h b/include/tbb/parallel_for.h
index 5405262..0b3c2be 100644
--- a/include/tbb/parallel_for.h
+++ b/include/tbb/parallel_for.h
@@ -58,10 +58,10 @@ namespace internal {
}
//! 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())
+ start_for( start_for& parent_, split ) :
+ my_range(parent_.my_range,split()),
+ my_body(parent_.my_body),
+ my_partition(parent_.my_partition,split())
{
my_partition.set_affinity(*this);
}
@@ -72,39 +72,39 @@ namespace internal {
public:
static void run( const Range& range, const Body& body, const Partitioner& partitioner ) {
if( !range.empty() ) {
-#if !__TBB_EXCEPTIONS || TBB_JOIN_OUTER_TASK_GROUP
+#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
start_for& a = *new(task::allocate_root()) start_for(range,body,const_cast<Partitioner&>(partitioner));
#else
// Bound context prevents exceptions from body to affect nesting or sibling algorithms,
// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.
task_group_context context;
start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-#endif /* __TBB_EXCEPTIONS && !TBB_JOIN_OUTER_TASK_GROUP */
+#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
task::spawn_root_and_wait(a);
}
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
static void run( const Range& range, const Body& body, const Partitioner& partitioner, task_group_context& context ) {
if( !range.empty() ) {
start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
task::spawn_root_and_wait(a);
}
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
};
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(*this);
+ 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,*this,b);
+ my_partition.spawn_or_delay(delay,b);
return this;
}
}
@@ -153,7 +153,7 @@ void parallel_for( const Range& range, const Body& body, affinity_partitioner& p
internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Parallel iteration over range with simple partitioner and user-supplied context.
/** @ingroup algorithms **/
template<typename Range, typename Body>
@@ -174,7 +174,7 @@ template<typename Range, typename Body>
void parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner, task_group_context& context ) {
internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//@}
//! @cond INTERNAL
@@ -211,6 +211,7 @@ void parallel_for(Index first, Index last, Index step, const Function& f, tbb::t
if (step <= 0 )
internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
else if (last > first) {
+ // Above "else" is necessary to prevent "potential divide by zero" warning
Index end = (last - first) / step;
if (first + end * step < last) end++;
tbb::blocked_range<Index> range(static_cast<Index>(0), end);
diff --git a/include/tbb/parallel_for_each.h b/include/tbb/parallel_for_each.h
index 57b63e0..6b8d862 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>::value_type& value ) const {
my_func(value);
}
};
diff --git a/include/tbb/parallel_reduce.h b/include/tbb/parallel_reduce.h
index 4dcd060..670b626 100644
--- a/include/tbb/parallel_reduce.h
+++ b/include/tbb/parallel_reduce.h
@@ -74,10 +74,10 @@ namespace internal {
bool has_right_zombie;
const reduction_context my_context;
aligned_space<Body,1> zombie_space;
- finish_reduce( char context ) :
+ finish_reduce( char context_ ) :
my_body(NULL),
has_right_zombie(false),
- my_context(context)
+ my_context(context_)
{
}
task* execute() {
@@ -118,14 +118,14 @@ namespace internal {
}
//! Splitting constructor used to generate children.
/** this becomes left child. Newly constructed object is right child. */
- start_reduce( start_reduce& parent, split ) :
- my_body(parent.my_body),
- my_range(parent.my_range,split()),
- my_partition(parent.my_partition,split()),
+ start_reduce( start_reduce& parent_, split ) :
+ my_body(parent_.my_body),
+ my_range(parent_.my_range,split()),
+ my_partition(parent_.my_partition,split()),
my_context(2)
{
my_partition.set_affinity(*this);
- parent.my_context = 1;
+ parent_.my_context = 1;
}
//! Update affinity info, if any
/*override*/ void note_affinity( affinity_id id ) {
@@ -135,22 +135,22 @@ namespace internal {
public:
static void run( const Range& range, Body& body, Partitioner& partitioner ) {
if( !range.empty() ) {
-#if !__TBB_EXCEPTIONS || TBB_JOIN_OUTER_TASK_GROUP
+#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
task::spawn_root_and_wait( *new(task::allocate_root()) start_reduce(range,&body,partitioner) );
#else
// Bound context prevents exceptions from body to affect nesting or sibling algorithms,
// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.
task_group_context context;
task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-#endif /* __TBB_EXCEPTIONS && !TBB_JOIN_OUTER_TASK_GROUP */
+#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
}
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
static void run( const Range& range, Body& body, Partitioner& partitioner, task_group_context& context ) {
if( !range.empty() )
task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
};
template<typename Range, typename Body, typename Partitioner>
@@ -166,14 +166,14 @@ public:
(*my_body)( my_range );
if( my_context==1 )
parallel_reduce_store_body(static_cast<finish_type*>(parent())->my_body, my_body );
- return my_partition.continue_after_execute_range(*this);
+ return my_partition.continue_after_execute_range();
} else {
finish_type& c = *new( allocate_continuation()) finish_type(my_context);
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,*this,b);
+ my_partition.spawn_or_delay(delay,b);
return this;
}
}
@@ -276,7 +276,7 @@ void parallel_reduce( const Range& range, Body& body, affinity_partitioner& part
internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Parallel iteration with reduction, simple partitioner and user-supplied context.
/** @ingroup algorithms **/
template<typename Range, typename Body>
@@ -297,7 +297,7 @@ template<typename Range, typename Body>
void parallel_reduce( const Range& range, Body& body, affinity_partitioner& partitioner, task_group_context& context ) {
internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
}
-#endif /* __TBB_EXCEPTIONS */
+#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"). **/
@@ -345,7 +345,7 @@ Value parallel_reduce( const Range& range, const Value& identity, const RealBody
return body.result();
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Parallel iteration with reduction, simple partitioner and user-supplied context.
/** @ingroup algorithms **/
template<typename Range, typename Value, typename RealBody, typename Reduction>
@@ -378,7 +378,7 @@ Value parallel_reduce( const Range& range, const Value& identity, const RealBody
::run( range, body, partitioner, context );
return body.result();
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//@}
} // namespace tbb
diff --git a/include/tbb/parallel_scan.h b/include/tbb/parallel_scan.h
index 5775db8..3a1963f 100644
--- a/include/tbb/parallel_scan.h
+++ b/include/tbb/parallel_scan.h
@@ -109,15 +109,15 @@ namespace internal {
poison_pointer(body);
poison_pointer(incoming);
}
- task* create_child( const Range& range, final_sum_type& f, sum_node* n, final_sum_type* incoming, Body* stuff_last ) {
+ task* create_child( const Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
if( !n ) {
f.recycle_as_child_of( *this );
- f.finish_construction( range, stuff_last );
+ f.finish_construction( range_, stuff_last_ );
return &f;
} else {
n->body = &f;
- n->incoming = incoming;
- n->stuff_last = stuff_last;
+ n->incoming = incoming_;
+ n->stuff_last = stuff_last_;
return n;
}
}
@@ -201,15 +201,15 @@ namespace internal {
typename Partitioner::partition_type partition;
/*override*/ task* execute();
public:
- start_scan( sum_node_type*& return_slot_, start_scan& parent, sum_node_type* parent_sum_ ) :
- body(parent.body),
- sum(parent.sum),
+ start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
+ body(parent_.body),
+ sum(parent_.sum),
return_slot(&return_slot_),
parent_sum(parent_sum_),
- is_final(parent.is_final),
+ is_final(parent_.is_final),
is_right_child(false),
- range(parent.range,split()),
- partition(parent.partition,split())
+ range(parent_.range,split()),
+ partition(parent_.partition,split())
{
__TBB_ASSERT( !*return_slot, NULL );
}
diff --git a/include/tbb/parallel_while.h b/include/tbb/parallel_while.h
index 378b55f..21c2bc1 100644
--- a/include/tbb/parallel_while.h
+++ b/include/tbb/parallel_while.h
@@ -185,7 +185,7 @@ template<typename Body>
void parallel_while<Body>::add( const value_type& item ) {
__TBB_ASSERT(my_barrier,"attempt to add to parallel_while that is not running");
typedef internal::while_iteration_task<Body> iteration_type;
- iteration_type& i = *new( task::self().allocate_additional_child_of(*my_barrier) ) iteration_type(item,*my_body);
+ iteration_type& i = *new( task::allocate_additional_child_of(*my_barrier) ) iteration_type(item,*my_body);
task::self().spawn( i );
}
diff --git a/include/tbb/partitioner.h b/include/tbb/partitioner.h
index 64ee5db..98db3ac 100644
--- a/include/tbb/partitioner.h
+++ b/include/tbb/partitioner.h
@@ -62,10 +62,10 @@ class partition_type_base {
public:
void set_affinity( task & ) {}
void note_affinity( task::affinity_id ) {}
- task* continue_after_execute_range( task& ) {return NULL;}
+ task* continue_after_execute_range() {return NULL;}
bool decide_whether_to_delay() {return false;}
- void spawn_or_delay( bool, task& a, task& b ) {
- a.spawn(b);
+ void spawn_or_delay( bool, task& b ) {
+ task::spawn(b);
}
};
@@ -188,12 +188,12 @@ public:
if( map_begin<map_end )
my_array[map_begin] = id;
}
- task* continue_after_execute_range( task& t ) {
+ task* continue_after_execute_range() {
task* first = NULL;
if( !delay_list.empty() ) {
first = &delay_list.pop_front();
while( !delay_list.empty() ) {
- t.spawn(*first);
+ task::spawn(*first);
first = &delay_list.pop_front();
}
}
@@ -203,11 +203,11 @@ public:
// The possible underflow caused by "-1u" is deliberate
return (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
}
- void spawn_or_delay( bool delay, task& a, task& b ) {
+ void spawn_or_delay( bool delay, task& b ) {
if( delay )
delay_list.push_back(b);
else
- a.spawn(b);
+ task::spawn(b);
}
~affinity_partition_type() {
diff --git a/include/tbb/pipeline.h b/include/tbb/pipeline.h
index ed99277..508c0e4 100644
--- a/include/tbb/pipeline.h
+++ b/include/tbb/pipeline.h
@@ -52,6 +52,15 @@ class pipeline_root_task;
class pipeline_cleaner;
} // namespace internal
+
+namespace interface5 {
+ template<typename T, typename U> class filter_t;
+
+ namespace internal {
+ class pipeline_proxy;
+ }
+}
+
//! @endcond
//! A stage in a pipeline.
@@ -59,7 +68,7 @@ class pipeline_cleaner;
class filter: internal::no_copy {
private:
//! Value used to mark "not in pipeline"
- static filter* not_in_pipeline() {return reinterpret_cast<filter*>(internal::intptr(-1));}
+ static filter* not_in_pipeline() {return reinterpret_cast<filter*>(intptr_t(-1));}
//! The lowest bit 0 is for parallel vs. serial
static const unsigned char filter_is_serial = 0x1;
@@ -72,6 +81,14 @@ private:
//! 5th bit distinguishes thread-bound and regular filters.
static const unsigned char filter_is_bound = 0x1<<5;
+ //! 7th bit defines exception propagation mode expected by the application.
+ static const unsigned char exact_exception_propagation =
+#if TBB_USE_CAPTURED_EXCEPTION
+ 0x0;
+#else
+ 0x1<<7;
+#endif /* TBB_USE_CAPTURED_EXCEPTION */
+
static const unsigned char current_version = __TBB_PIPELINE_VERSION(5);
static const unsigned char version_mask = 0x7<<1; // bits 1-3 are for version
public:
@@ -89,7 +106,7 @@ protected:
filter( bool is_serial_ ) :
next_filter_in_pipeline(not_in_pipeline()),
my_input_buffer(NULL),
- my_filter_mode(static_cast<unsigned char>(is_serial_ ? serial : parallel)),
+ my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | exact_exception_propagation)),
prev_filter_in_pipeline(not_in_pipeline()),
my_pipeline(NULL),
next_segment(NULL)
@@ -98,7 +115,7 @@ protected:
filter( mode filter_mode ) :
next_filter_in_pipeline(not_in_pipeline()),
my_input_buffer(NULL),
- my_filter_mode(static_cast<unsigned char>(filter_mode)),
+ my_filter_mode(static_cast<unsigned char>(filter_mode | exact_exception_propagation)),
prev_filter_in_pipeline(not_in_pipeline()),
my_pipeline(NULL),
next_segment(NULL)
@@ -128,7 +145,7 @@ public:
/** If the filter was added to a pipeline, the pipeline must be destroyed first. */
virtual __TBB_EXPORTED_METHOD ~filter();
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Destroys item if pipeline was cancelled.
/** Required to prevent memory leaks.
Note it can be called concurrently even for serial filters.*/
@@ -176,7 +193,7 @@ public:
};
protected:
thread_bound_filter(mode filter_mode):
- filter(static_cast<mode>(filter_mode | filter::filter_is_bound))
+ filter(static_cast<mode>(filter_mode | filter::filter_is_bound | filter::exact_exception_propagation))
{}
public:
//! If a data item is available, invoke operator() on that item.
@@ -216,7 +233,7 @@ public:
//! Run the pipeline to completion.
void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens );
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Run the pipeline to completion with user-supplied context.
void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );
#endif
@@ -230,6 +247,7 @@ private:
friend class filter;
friend class thread_bound_filter;
friend class internal::pipeline_cleaner;
+ friend class tbb::interface5::internal::pipeline_proxy;
//! Pointer to first filter in the pipeline.
filter* filter_list;
@@ -258,12 +276,261 @@ private:
//! Not used, but retained to satisfy old export files.
void __TBB_EXPORTED_METHOD inject_token( task& self );
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Does clean up if pipeline is cancelled or exception occured
void clear_filters();
#endif
};
+//------------------------------------------------------------------------
+// Support for lambda-friendly parallel_pipeline interface
+//------------------------------------------------------------------------
+
+namespace interface5 {
+
+namespace internal {
+ template<typename T, typename U, typename Body> class concrete_filter;
+}
+
+class flow_control {
+ bool is_pipeline_stopped;
+ flow_control() { is_pipeline_stopped = false; }
+ template<typename T, typename U, typename Body> friend class internal::concrete_filter;
+public:
+ void stop() { is_pipeline_stopped = true; }
+};
+
+//! @cond INTERNAL
+namespace internal {
+
+template<typename T, typename U, typename Body>
+class concrete_filter: public tbb::filter {
+ Body my_body;
+
+ /*override*/ void* operator()(void* input) {
+ T* temp_input = (T*)input;
+ // Call user's operator()() here
+ void* output = (void*) new U(my_body(*temp_input));
+ delete temp_input;
+ return output;
+ }
+
+public:
+ concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+template<typename U, typename Body>
+class concrete_filter<void,U,Body>: public filter {
+ Body my_body;
+
+ /*override*/void* operator()(void*) {
+ flow_control control;
+ U temp_output = my_body(control);
+ void* output = control.is_pipeline_stopped ? NULL : (void*) new U(temp_output);
+ return output;
+ }
+public:
+ concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+template<typename T, typename Body>
+class concrete_filter<T,void,Body>: public filter {
+ Body my_body;
+
+ /*override*/ void* operator()(void* input) {
+ T* temp_input = (T*)input;
+ my_body(*temp_input);
+ delete temp_input;
+ return NULL;
+ }
+public:
+ concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+template<typename Body>
+class concrete_filter<void,void,Body>: public filter {
+ Body my_body;
+
+ /** Override privately because it is always called virtually */
+ /*override*/ void* operator()(void*) {
+ flow_control control;
+ my_body(control);
+ void* output = control.is_pipeline_stopped ? NULL : (void*)(intptr_t)-1;
+ return output;
+ }
+public:
+ concrete_filter(filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+//! The class that represents an object of the pipeline for parallel_pipeline().
+/** It primarily serves as RAII class that deletes heap-allocated filter instances. */
+class pipeline_proxy {
+ tbb::pipeline my_pipe;
+public:
+ pipeline_proxy( const filter_t<void,void>& filter_chain );
+ ~pipeline_proxy() {
+ while( filter* f = my_pipe.filter_list )
+ delete f; // filter destructor removes it from the pipeline
+ }
+ tbb::pipeline* operator->() { return &my_pipe; }
+};
+
+//! Abstract base class that represents a node in a parse tree underlying a filter_t.
+/** These nodes are always heap-allocated and can be shared by filter_t objects. */
+class filter_node: tbb::internal::no_copy {
+ /** Count must be atomic because it is hidden state for user, but might be shared by threads. */
+ tbb::atomic<intptr_t> ref_count;
+protected:
+ filter_node() {
+ ref_count = 0;
+#ifdef __TBB_TEST_FILTER_NODE_COUNT
+ ++(__TBB_TEST_FILTER_NODE_COUNT);
+#endif
+ }
+public:
+ //! Add concrete_filter to pipeline
+ virtual void add_to( pipeline& ) = 0;
+ //! Increment reference count
+ void add_ref() {++ref_count;}
+ //! Decrement reference count and delete if it becomes zero.
+ void remove_ref() {
+ __TBB_ASSERT(ref_count>0,"ref_count underflow");
+ if( --ref_count==0 )
+ delete this;
+ }
+ virtual ~filter_node() {
+#ifdef __TBB_TEST_FILTER_NODE_COUNT
+ --(__TBB_TEST_FILTER_NODE_COUNT);
+#endif
+ }
+};
+
+//! Node in parse tree representing result of make_filter.
+template<typename T, typename U, typename Body>
+class filter_node_leaf: public filter_node {
+ const tbb::filter::mode mode;
+ const Body& body;
+ /*override*/void add_to( pipeline& p ) {
+ concrete_filter<T,U,Body>* f = new concrete_filter<T,U,Body>(mode,body);
+ p.add_filter( *f );
+ }
+public:
+ filter_node_leaf( tbb::filter::mode m, const Body& b ) : mode(m), body(b) {}
+};
+
+//! Node in parse tree representing join of two filters.
+class filter_node_join: public filter_node {
+ friend class filter_node; // to suppress GCC 3.2 warnings
+ filter_node& left;
+ filter_node& right;
+ /*override*/~filter_node_join() {
+ left.remove_ref();
+ right.remove_ref();
+ }
+ /*override*/void add_to( pipeline& p ) {
+ left.add_to(p);
+ right.add_to(p);
+ }
+public:
+ filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {
+ left.add_ref();
+ right.add_ref();
+ }
+};
+
+} // namespace internal
+//! @endcond
+
+template<typename T, typename U, typename Body>
+filter_t<T,U> make_filter(tbb::filter::mode mode, const Body& body) {
+ return new internal::filter_node_leaf<T,U,Body>(mode, body);
+}
+
+template<typename T, typename V, typename U>
+filter_t<T,U> operator& (const filter_t<T,V>& left, const filter_t<V,U>& right) {
+ __TBB_ASSERT(left.root,"cannot use default-constructed filter_t as left argument of '&'");
+ __TBB_ASSERT(right.root,"cannot use default-constructed filter_t as right argument of '&'");
+ return new internal::filter_node_join(*left.root,*right.root);
+}
+
+//! Class representing a chain of type-safe pipeline filters
+template<typename T, typename U>
+class filter_t {
+ typedef internal::filter_node filter_node;
+ filter_node* root;
+ filter_t( filter_node* root_ ) : root(root_) {
+ root->add_ref();
+ }
+ friend class internal::pipeline_proxy;
+ template<typename T_, typename U_, typename Body>
+ friend filter_t<T_,U_> make_filter(tbb::filter::mode, const Body& );
+ template<typename T_, typename V_, typename U_>
+ friend filter_t<T_,U_> operator& (const filter_t<T_,V_>& , const filter_t<V_,U_>& );
+public:
+ filter_t() : root(NULL) {}
+ filter_t( const filter_t<T,U>& rhs ) : root(rhs.root) {
+ if( root ) root->add_ref();
+ }
+ template<typename Body>
+ filter_t( tbb::filter::mode mode, const Body& body ) :
+ root( new internal::filter_node_leaf<T,U,Body>(mode, body) ) {
+ root->add_ref();
+ }
+
+ void operator=( const filter_t<T,U>& rhs ) {
+ // Order of operations below carefully chosen so that reference counts remain correct
+ // in unlikely event that remove_ref throws exception.
+ filter_node* old = root;
+ root = rhs.root;
+ if( root ) root->add_ref();
+ if( old ) old->remove_ref();
+ }
+ ~filter_t() {
+ if( root ) root->remove_ref();
+ }
+ void clear() {
+ // Like operator= with filter_t() on right side.
+ if( root ) {
+ filter_node* old = root;
+ root = NULL;
+ old->remove_ref();
+ }
+ }
+};
+
+inline internal::pipeline_proxy::pipeline_proxy( const filter_t<void,void>& filter_chain ) : my_pipe() {
+ __TBB_ASSERT( filter_chain.root, "cannot apply parallel_pipeline to default-constructed filter_t" );
+ filter_chain.root->add_to(my_pipe);
+}
+
+inline void parallel_pipeline(size_t max_number_of_live_tokens, const filter_t<void,void>& filter_chain
+#if __TBB_TASK_GROUP_CONTEXT
+ , tbb::task_group_context& context
+#endif
+ ) {
+ internal::pipeline_proxy pipe(filter_chain);
+ // tbb::pipeline::run() is called via the proxy
+ pipe->run(max_number_of_live_tokens
+#if __TBB_TASK_GROUP_CONTEXT
+ , context
+#endif
+ );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+inline void parallel_pipeline(size_t max_number_of_live_tokens, const filter_t<void,void>& filter_chain) {
+ tbb::task_group_context context;
+ parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
+}
+#endif // __TBB_TASK_GROUP_CONTEXT
+
+} // interface5
+
+using interface5::flow_control;
+using interface5::filter_t;
+using interface5::make_filter;
+using interface5::parallel_pipeline;
+
} // tbb
#endif /* __TBB_pipeline_H */
diff --git a/include/tbb/queuing_mutex.h b/include/tbb/queuing_mutex.h
index f971141..ec9832c 100644
--- a/include/tbb/queuing_mutex.h
+++ b/include/tbb/queuing_mutex.h
@@ -29,7 +29,20 @@
#ifndef __TBB_queuing_mutex_H
#define __TBB_queuing_mutex_H
+#include "tbb_config.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 <cstring>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "atomic.h"
#include "tbb_profiling.h"
@@ -64,7 +77,6 @@ public:
scoped_lock() {initialize();}
//! Acquire lock on given mutex.
- /** Upon entry, *this should not be in the "have acquired a mutex" state. */
scoped_lock( queuing_mutex& m ) {
initialize();
acquire(m);
@@ -95,7 +107,7 @@ public:
/** 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. */
- internal::uintptr going;
+ uintptr_t going;
};
void __TBB_EXPORTED_METHOD internal_construct();
diff --git a/include/tbb/queuing_rw_mutex.h b/include/tbb/queuing_rw_mutex.h
index a684d96..5e35478 100644
--- a/include/tbb/queuing_rw_mutex.h
+++ b/include/tbb/queuing_rw_mutex.h
@@ -29,7 +29,20 @@
#ifndef __TBB_queuing_rw_mutex_H
#define __TBB_queuing_rw_mutex_H
+#include "tbb_config.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 <cstring>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "atomic.h"
#include "tbb_profiling.h"
@@ -78,7 +91,6 @@ public:
scoped_lock() {initialize();}
//! Acquire lock on given mutex.
- /** Upon entry, *this should not be in the "have acquired a mutex" state. */
scoped_lock( queuing_rw_mutex& m, bool write=true ) {
initialize();
acquire(m,write);
diff --git a/include/tbb/reader_writer_lock.h b/include/tbb/reader_writer_lock.h
new file mode 100644
index 0000000..3a63969
--- /dev/null
+++ b/include/tbb/reader_writer_lock.h
@@ -0,0 +1,240 @@
+/*
+ Copyright 2005-2010 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_reader_writer_lock_H
+#define __TBB_reader_writer_lock_H
+
+#include "tbb_thread.h"
+#include "tbb_allocator.h"
+#include "atomic.h"
+
+namespace tbb {
+namespace interface5 {
+//! Writer-preference reader-writer lock with local-only spinning on readers.
+/** Loosely adapted from Mellor-Crummey and Scott pseudocode at
+ http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp
+ @ingroup synchronization */
+ class reader_writer_lock : tbb::internal::no_copy {
+ public:
+ friend class scoped_lock;
+ friend class scoped_lock_read;
+ //! Status type for nodes associated with lock instances
+ /** waiting_nonblocking: the wait state for nonblocking lock
+ instances; for writes, these transition straight to active
+ states; for reads, these are unused.
+
+ 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.
+
+ active: the active state means that the lock instance holds
+ the lock; it will transition to invalid state during node deletion
+
+ 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
+
+ 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.
+
+ State diagram for scoped_lock status:
+
+ waiting ----------> waiting_nonblocking
+ | _____________/ |
+ V V V
+ active -----------------> invalid
+
+ State diagram for scoped_lock_read status:
+
+ waiting
+ |
+ V
+ active ----------------->invalid
+
+ */
+ enum status_t { waiting_nonblocking, waiting, active, invalid };
+
+ //! Constructs a new reader_writer_lock
+ reader_writer_lock() {
+ internal_construct();
+ }
+
+ //! Destructs a reader_writer_lock object
+ ~reader_writer_lock() {
+ internal_destroy();
+ }
+
+ //! 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. */
+ class scoped_lock : tbb::internal::no_copy {
+ public:
+ friend class reader_writer_lock;
+
+ //! Construct with blocking attempt to acquire write lock on the passed-in lock
+ scoped_lock(reader_writer_lock& lock) {
+ internal_construct(lock);
+ }
+
+ //! Destructor, releases the write lock
+ ~scoped_lock() {
+ internal_destroy();
+ }
+
+ void* operator new(size_t s) {
+ return tbb::internal::allocate_via_handler_v3(s);
+ }
+ void operator delete(void* p) {
+ tbb::internal::deallocate_via_handler_v3(p);
+ }
+
+ private:
+ //! The pointer to the mutex to lock
+ reader_writer_lock *mutex;
+ //! The next queued competitor for the mutex
+ scoped_lock* next;
+ //! Status flag of the thread associated with this node
+ atomic<status_t> status;
+
+ //! Construct scoped_lock that is not holding lock
+ scoped_lock();
+
+ void __TBB_EXPORTED_METHOD internal_construct(reader_writer_lock&);
+ void __TBB_EXPORTED_METHOD internal_destroy();
+ };
+
+ //! The scoped lock pattern for read locks
+ class scoped_lock_read : tbb::internal::no_copy {
+ public:
+ friend class reader_writer_lock;
+
+ //! Construct with blocking attempt to acquire read lock on the passed-in lock
+ scoped_lock_read(reader_writer_lock& lock) {
+ internal_construct(lock);
+ }
+
+ //! Destructor, releases the read lock
+ ~scoped_lock_read() {
+ internal_destroy();
+ }
+
+ void* operator new(size_t s) {
+ return tbb::internal::allocate_via_handler_v3(s);
+ }
+ void operator delete(void* p) {
+ tbb::internal::deallocate_via_handler_v3(p);
+ }
+
+ private:
+ //! The pointer to the mutex to lock
+ reader_writer_lock *mutex;
+ //! The next queued competitor for the mutex
+ scoped_lock_read *next;
+ //! Status flag of the thread associated with this node
+ atomic<status_t> status;
+
+ //! Construct scoped_lock_read that is not holding lock
+ scoped_lock_read();
+
+ void __TBB_EXPORTED_METHOD internal_construct(reader_writer_lock&);
+ void __TBB_EXPORTED_METHOD internal_destroy();
+ };
+
+ //! Acquires the reader_writer_lock for write.
+ /** If the lock is currently held in write mode by another
+ context, the writer will block by spinning on a local
+ variable. Exceptions thrown: improper_lock The context tries
+ to acquire a reader_writer_lock that it already has write
+ ownership of.*/
+ void __TBB_EXPORTED_METHOD lock();
+
+ //! Tries to acquire the reader_writer_lock for write.
+ /** 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, try_lock() returns
+ false. */
+ bool __TBB_EXPORTED_METHOD try_lock();
+
+ //! Acquires the reader_writer_lock for read.
+ /** If the lock is currently held by a writer, this reader will
+ block and wait until the writers are done. Exceptions thrown:
+ improper_lock The context tries to acquire a
+ reader_writer_lock that it already has write ownership of. */
+ void __TBB_EXPORTED_METHOD lock_read();
+
+ //! Tries to acquire the reader_writer_lock for read.
+ /** This function does not block. Return Value: True or false,
+ depending on whether the lock is acquired or not. */
+ bool __TBB_EXPORTED_METHOD try_lock_read();
+
+ //! Releases the reader_writer_lock
+ void __TBB_EXPORTED_METHOD unlock();
+
+ private:
+ void __TBB_EXPORTED_METHOD internal_construct();
+ void __TBB_EXPORTED_METHOD internal_destroy();
+
+ //! Attempts to acquire write lock
+ /** If unavailable, spins in blocking case, returns false in non-blocking case. */
+ bool start_write(scoped_lock *);
+ //! Sets writer_head to w and attempts to unblock
+ void set_next_writer(scoped_lock *w);
+ //! Relinquishes write lock to next waiting writer or group of readers
+ void end_write(scoped_lock *);
+ //! Checks if current thread holds write lock
+ bool is_current_writer();
+
+ //! Attempts to acquire read lock
+ /** If unavailable, spins in blocking case, returns false in non-blocking case. */
+ void start_read(scoped_lock_read *);
+ //! Unblocks pending readers
+ void unblock_readers();
+ //! Relinquishes read lock by decrementing counter; last reader wakes pending writer
+ void end_read();
+
+ //! The list of pending readers
+ atomic<scoped_lock_read*> reader_head;
+ //! The list of pending writers
+ atomic<scoped_lock*> writer_head;
+ //! The last node in the list of pending writers
+ atomic<scoped_lock*> writer_tail;
+ //! Writer that owns the mutex; tbb_thread::id() otherwise.
+ tbb_thread::id my_current_writer;
+ //! Status of mutex
+ atomic<unsigned> rdr_count_and_flags;
+};
+
+} // namespace interface5
+
+using interface5::reader_writer_lock;
+
+} // namespace tbb
+
+#endif /* __TBB_reader_writer_lock_H */
diff --git a/include/tbb/recursive_mutex.h b/include/tbb/recursive_mutex.h
index 6003d63..ddf4283 100644
--- a/include/tbb/recursive_mutex.h
+++ b/include/tbb/recursive_mutex.h
@@ -30,22 +30,14 @@
#define __TBB_recursive_mutex_H
#if _WIN32||_WIN64
-
-#include <windows.h>
-#if !defined(_WIN32_WINNT)
-// The following Windows API function is declared explicitly;
-// otherwise any user would have to specify /D_WIN32_WINNT=0x0400
-extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
-#endif
-
+ #include <windows.h>
+ #if !defined(_WIN32_WINNT)
+ // The following Windows API function is declared explicitly;
+ // otherwise any user would have to specify /D_WIN32_WINNT=0x0400
+ extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+ #endif
#else /* if not _WIN32||_WIN64 */
-
-#include <pthread.h>
-namespace tbb { namespace internal {
-// Use this internal TBB function to throw an exception
- extern void handle_perror( int error_code, const char* what );
-} } //namespaces
-
+ #include <pthread.h>
#endif /* _WIN32||_WIN64 */
#include <new>
@@ -220,6 +212,14 @@ public:
#endif /* TBB_USE_ASSERT */
}
+ //! Return native_handle
+ #if _WIN32||_WIN64
+ typedef LPCRITICAL_SECTION native_handle_type;
+ #else
+ typedef pthread_mutex_t* native_handle_type;
+ #endif
+ native_handle_type native_handle() { return (native_handle_type) &impl; }
+
private:
#if _WIN32||_WIN64
CRITICAL_SECTION impl;
diff --git a/include/tbb/spin_mutex.h b/include/tbb/spin_mutex.h
index 8f6dc62..a88a14a 100644
--- a/include/tbb/spin_mutex.h
+++ b/include/tbb/spin_mutex.h
@@ -64,7 +64,7 @@ public:
spin_mutex* my_mutex;
//! Value to store into spin_mutex::flag to unlock the mutex.
- internal::uintptr my_unlock_value;
+ uintptr_t my_unlock_value;
//! Like acquire, but with ITT instrumentation.
void __TBB_EXPORTED_METHOD internal_acquire( spin_mutex& m );
diff --git a/include/tbb/spin_rw_mutex.h b/include/tbb/spin_rw_mutex.h
index fd760d4..38b3a1f 100644
--- a/include/tbb/spin_rw_mutex.h
+++ b/include/tbb/spin_rw_mutex.h
@@ -95,7 +95,6 @@ public:
scoped_lock() : mutex(NULL), is_writer(false) {}
//! Acquire lock on given mutex.
- /** Upon entry, *this should not be in the "have acquired a mutex" state. */
scoped_lock( spin_rw_mutex& m, bool write = true ) : mutex(NULL) {
acquire(m, write);
}
diff --git a/include/tbb/task.h b/include/tbb/task.h
index 57f5d81..900f099 100644
--- a/include/tbb/task.h
+++ b/include/tbb/task.h
@@ -32,14 +32,73 @@
#include "tbb_stddef.h"
#include "tbb_machine.h"
+typedef struct ___itt_caller *__itt_caller;
+
namespace tbb {
class task;
class task_list;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
class task_group_context;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+// 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
+#else
+#define __TBB_TASK_BASE_ACCESS private
+#endif
+
+namespace internal {
+
+ class allocate_additional_child_of_proxy: no_assign {
+ //! No longer used, but retained for binary layout compatibility. Always NULL.
+ task* self;
+ task& parent;
+ public:
+ explicit allocate_additional_child_of_proxy( task& parent_ ) : self(NULL), parent(parent_) {}
+ task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
+ void __TBB_EXPORTED_METHOD free( task& ) const;
+ };
+
+}
+
+namespace interface5 {
+ namespace internal {
+ //! 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
+ using declarations. */
+ class task_base: tbb::internal::no_copy {
+ __TBB_TASK_BASE_ACCESS:
+ friend class tbb::task;
+
+ //! 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 );
+
+ //! Like allocate_child, except that task's parent becomes "t", not this.
+ /** Typically used in conjunction with schedule_to_reexecute to implement while loops.
+ Atomically increments the reference count of t.parent() */
+ static tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( task& t ) {
+ return tbb::internal::allocate_additional_child_of_proxy(t);
+ }
+
+ //! Destroy a task.
+ /** Usually, calling this method is unnecessary, because a task is
+ implicitly deleted after its execute() 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. */
+ static void __TBB_EXPORTED_FUNC destroy( task& victim );
+ };
+ } // internal
+} // interface5
//! @cond INTERNAL
namespace internal {
@@ -58,16 +117,21 @@ namespace internal {
//! Pure virtual destructor;
// Have to have it just to shut up overzealous compilation warnings
virtual ~scheduler() = 0;
+#if __TBB_ARENA_PER_MASTER
+
+ //! For internal use only
+ virtual void enqueue( task& t, void* reserved ) = 0;
+#endif /* __TBB_ARENA_PER_MASTER */
};
//! A reference count
/** Should always be non-negative. A signed type is used so that underflow can be detected. */
- typedef intptr reference_count;
+ typedef intptr_t reference_count;
//! An id as used for specifying affinity.
typedef unsigned short affinity_id;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
struct context_list_node_t {
context_list_node_t *my_prev,
*my_next;
@@ -80,7 +144,7 @@ namespace internal {
task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
void __TBB_EXPORTED_METHOD free( task& ) const;
};
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
class allocate_root_proxy: no_assign {
public:
@@ -100,17 +164,6 @@ namespace internal {
void __TBB_EXPORTED_METHOD free( task& ) const;
};
- class allocate_additional_child_of_proxy: no_assign {
- task& self;
- task& parent;
- public:
- allocate_additional_child_of_proxy( task& self_, task& parent_ ) : self(self_), parent(parent_) {}
- task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
- void __TBB_EXPORTED_METHOD free( task& ) const;
- };
-
- class task_group_base;
-
//! Memory prefix to a task object.
/** This class is internal to the library.
Do not reference it directly, except within the library itself.
@@ -120,21 +173,21 @@ namespace internal {
class task_prefix {
private:
friend class tbb::task;
+ friend class tbb::interface5::internal::task_base;
friend class tbb::task_list;
friend class internal::scheduler;
friend class internal::allocate_root_proxy;
friend class internal::allocate_child_proxy;
friend class internal::allocate_continuation_proxy;
friend class internal::allocate_additional_child_of_proxy;
- friend class internal::task_group_base;
-#if __TBB_EXCEPTIONS
+#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
by users and as the result of unhandled exceptions in the task::execute()
methods. */
task_group_context *context;
-#endif /* __TBB_EXCEPTIONS */
+#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.
@@ -188,7 +241,7 @@ namespace internal {
} // namespace internal
//! @endcond
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
#if TBB_USE_CAPTURED_EXCEPTION
class tbb_exception;
@@ -219,8 +272,7 @@ namespace internal {
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
-{
+class task_group_context : internal::no_copy {
private:
#if TBB_USE_CAPTURED_EXCEPTION
typedef tbb_exception exception_container_type;
@@ -242,7 +294,6 @@ public:
enum traits_type {
exact_exception = 0x0001ul << traits_offset,
- no_cancellation = 0x0002ul << traits_offset,
concurrent_wait = 0x0004ul << traits_offset,
#if TBB_USE_CAPTURED_EXCEPTION
default_traits = 0
@@ -266,12 +317,16 @@ private:
its parent happens. Any context can be present in the list of one thread only. **/
internal::context_list_node_t my_node;
+ //! Used to set and maintain stack stitching point for Intel Performance Tools.
+ __itt_caller itt_caller;
+
//! 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
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)];
+ 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;
@@ -377,6 +432,8 @@ private:
static const kind_type binding_required = bound;
static const kind_type binding_completed = kind_type(bound+1);
+ static const kind_type detached = kind_type(binding_completed+1);
+ static const kind_type dying = kind_type(detached+1);
//! Checks if any of the ancestors has a cancellation request outstanding,
//! and propagates it back to descendants.
@@ -392,15 +449,16 @@ private:
}
}; // class task_group_context
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Base class for user-defined tasks.
/** @ingroup task_scheduling */
-class task: internal::no_copy {
+class task: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
+
//! Set reference count
void __TBB_EXPORTED_METHOD internal_set_ref_count( int count );
- //! Decrement reference count and return true if non-zero.
+ //! Decrement reference count and return its new value.
internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
protected:
@@ -427,7 +485,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
};
//------------------------------------------------------------------------
@@ -439,12 +497,12 @@ public:
return internal::allocate_root_proxy();
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Returns proxy for overloaded new that allocates a root task associated with user supplied context.
static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {
return internal::allocate_root_with_context_proxy(ctx);
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Returns proxy for overloaded new that allocates a continuation task of *this.
/** The continuation's parent becomes the parent of *this. */
@@ -457,19 +515,20 @@ public:
return *reinterpret_cast<internal::allocate_child_proxy*>(this);
}
- //! Like allocate_child, except that task's parent becomes "t", not this.
- /** Typically used in conjunction with schedule_to_reexecute to implement while loops.
- Atomically increments the reference count of t.parent() */
- internal::allocate_additional_child_of_proxy allocate_additional_child_of( task& t ) {
- return internal::allocate_additional_child_of_proxy(*this,t);
- }
+ //! Define recommended static form via import from base class.
+ using task_base::allocate_additional_child_of;
+#if __TBB_DEPRECATED_TASK_INTERFACE
//! Destroy a task.
/** Usually, calling this method is unnecessary, because a task is
implicitly deleted after its execute() 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. */
- void __TBB_EXPORTED_METHOD destroy( task& victim );
+ void __TBB_EXPORTED_METHOD destroy( task& t );
+#else /* !__TBB_DEPRECATED_TASK_INTERFACE */
+ //! Define recommended static form via import from base class.
+ using task_base::destroy;
+#endif /* !__TBB_DEPRECATED_TASK_INTERFACE */
//------------------------------------------------------------------------
// Recycling of tasks
@@ -488,7 +547,8 @@ public:
}
//! Recommended to use, safe variant of recycle_as_continuation
- /** For safety, it requires additional increment of ref_count. */
+ /** 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. */
void recycle_as_safe_continuation() {
__TBB_ASSERT( prefix().state==executing, "execute not running?" );
prefix().state = recycle;
@@ -504,13 +564,13 @@ public:
__TBB_ASSERT( new_parent.prefix().state!=freed, "parent already freed" );
p.state = allocated;
p.parent = &new_parent;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
p.context = new_parent.prefix().context;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
}
//! Schedule this for reexecution after current execute() returns.
- /** Requires that this.execute() be running. */
+ /** Made obsolete by recycle_as_safe_continuation; may become deprecated. */
void recycle_to_reexecute() {
__TBB_ASSERT( prefix().state==executing, "execute not running, or already recycled" );
__TBB_ASSERT( prefix().ref_count==0, "no child tasks allowed when recycled for reexecution" );
@@ -544,7 +604,7 @@ public:
}
//! Atomically decrement reference count.
- /** Has release semanics. */
+ /** Has release semantics. */
int decrement_ref_count() {
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
return int(internal_decrement_ref_count());
@@ -553,17 +613,8 @@ public:
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
}
- //! Schedule task for execution when a worker becomes available.
- /** After all children spawned so far finish their method task::execute,
- their parent's method task::execute may start running. Therefore, it
- is important to ensure that at least one child has not completed until
- the parent is ready to run. */
- void spawn( task& child ) {
- prefix().owner->spawn( child, child.prefix().next );
- }
-
- //! Spawn multiple tasks and clear list.
- void spawn( task_list& list );
+ //! Define recommended static forms via import from base class.
+ using task_base::spawn;
//! Similar to spawn followed by wait_for_all, but more efficient.
void spawn_and_wait_for_all( task& child ) {
@@ -574,8 +625,6 @@ public:
void __TBB_EXPORTED_METHOD spawn_and_wait_for_all( task_list& list );
//! Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
- /** The thread that calls spawn_root_and_wait must be the same thread
- that allocated the task. */
static void spawn_root_and_wait( task& root ) {
root.prefix().owner->spawn_root_and_wait( root, root.prefix().next );
}
@@ -591,18 +640,25 @@ public:
prefix().owner->wait_for_all( *this, NULL );
}
+#if __TBB_ARENA_PER_MASTER
+ //! Enqueue task for starvation-resistant execution.
+ static void enqueue( task& t ) {
+ t.prefix().owner->enqueue( t, NULL );
+ }
+
+#endif /* __TBB_ARENA_PER_MASTER */
//! The innermost task being executed or destroyed by the current thread at the moment.
static task& __TBB_EXPORTED_FUNC self();
//! task on whose behalf this task is working, or NULL if this is a root.
task* parent() const {return prefix().parent;}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Shared context that is used to communicate asynchronous state changes
task_group_context* context() {return prefix().context;}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
- //! True if task is owned by different thread than thread that owns its parent.
+ //! True if task was stolen from the task pool of another thread.
bool is_stolen_task() const {
return (prefix().extra_state & 0x80)!=0;
}
@@ -617,8 +673,8 @@ public:
//! The internal reference count.
int ref_count() const {
#if TBB_USE_ASSERT
- internal::reference_count ref_count = prefix().ref_count;
- __TBB_ASSERT( ref_count==int(ref_count), "integer overflow error");
+ internal::reference_count ref_count_ = prefix().ref_count;
+ __TBB_ASSERT( ref_count_==int(ref_count_), "integer overflow error");
#endif
return int(prefix().ref_count);
}
@@ -647,28 +703,27 @@ public:
The default action does nothing. */
virtual void __TBB_EXPORTED_METHOD note_affinity( affinity_id id );
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
/** \return false if cancellation has already been requested, true otherwise. **/
bool cancel_group_execution () { return prefix().context->cancel_group_execution(); }
//! Returns true if the context received cancellation request.
bool is_cancelled () const { return prefix().context->is_group_execution_cancelled(); }
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
private:
+ friend class interface5::internal::task_base;
friend class task_list;
friend class internal::scheduler;
friend class internal::allocate_root_proxy;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
friend class internal::allocate_root_with_context_proxy;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
friend class internal::allocate_continuation_proxy;
friend class internal::allocate_child_proxy;
friend class internal::allocate_additional_child_of_proxy;
- friend class internal::task_group_base;
-
//! 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 {
@@ -692,6 +747,7 @@ private:
task* first;
task** next_ptr;
friend class task;
+ friend class interface5::internal::task_base;
public:
//! Construct empty list
task_list() : first(NULL), next_ptr(&first) {}
@@ -725,9 +781,13 @@ public:
}
};
-inline void task::spawn( task_list& list ) {
+inline void interface5::internal::task_base::spawn( task& t ) {
+ t.prefix().owner->spawn( t, t.prefix().next );
+}
+
+inline void interface5::internal::task_base::spawn( task_list& list ) {
if( task* t = list.first ) {
- prefix().owner->spawn( *t, *list.next_ptr );
+ t->prefix().owner->spawn( *t, *list.next_ptr );
list.clear();
}
}
@@ -749,7 +809,7 @@ inline void operator delete( void* task, const tbb::internal::allocate_root_prox
tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
inline void *operator new( size_t bytes, const tbb::internal::allocate_root_with_context_proxy& p ) {
return &p.allocate(bytes);
}
@@ -757,7 +817,7 @@ inline void *operator new( size_t bytes, const tbb::internal::allocate_root_with
inline void operator delete( void* task, const tbb::internal::allocate_root_with_context_proxy& p ) {
p.free( *static_cast<tbb::task*>(task) );
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
inline void *operator new( size_t bytes, const tbb::internal::allocate_continuation_proxy& p ) {
return &p.allocate(bytes);
diff --git a/include/tbb/task_group.h b/include/tbb/task_group.h
index f2ab562..d245690 100644
--- a/include/tbb/task_group.h
+++ b/include/tbb/task_group.h
@@ -39,7 +39,7 @@ namespace internal {
}
template<typename F>
-class task_handle {
+class task_handle : internal::no_assign {
template<typename _F> friend class internal::task_handle_task;
static const intptr_t scheduled = 0x1;
@@ -53,9 +53,6 @@ class task_handle {
internal::throw_exception( internal::eid_invalid_multiple_scheduling );
my_state |= scheduled;
}
-
- // No assignment operator
- const task_handle& operator = ( const task_handle& );
public:
task_handle( const F& f ) : my_func(f), my_state(0) {}
@@ -104,10 +101,10 @@ protected:
template<typename F>
task_group_status internal_run_and_wait( F& f ) {
- try {
+ __TBB_TRY {
if ( !my_context.is_group_execution_cancelled() )
f();
- } catch ( ... ) {
+ } __TBB_CATCH( ... ) {
my_context.register_pending_exception();
}
return wait();
@@ -132,11 +129,11 @@ public:
}
task_group_status wait() {
- try {
- owner().prefix().owner->wait_for_all( *my_root, NULL );
- } catch ( ... ) {
+ __TBB_TRY {
+ my_root->wait_for_all();
+ } __TBB_CATCH( ... ) {
my_context.reset();
- throw;
+ __TBB_RETHROW();
}
if ( my_context.is_group_execution_cancelled() ) {
my_context.reset();
@@ -160,16 +157,18 @@ class task_group : public internal::task_group_base {
public:
task_group () : task_group_base( task_group_context::concurrent_wait ) {}
- ~task_group() try {
+ ~task_group() __TBB_TRY {
__TBB_ASSERT( my_root->ref_count() != 0, NULL );
if( my_root->ref_count() > 1 )
my_root->wait_for_all();
owner().destroy(*my_root);
}
+#if TBB_USE_EXCEPTIONS
catch (...) {
owner().destroy(*my_root);
throw;
}
+#endif /* TBB_USE_EXCEPTIONS */
#if __SUNPRO_CC
template<typename F>
diff --git a/include/tbb/task_scheduler_observer.h b/include/tbb/task_scheduler_observer.h
index 9df4d73..61003e5 100644
--- a/include/tbb/task_scheduler_observer.h
+++ b/include/tbb/task_scheduler_observer.h
@@ -42,7 +42,7 @@ class observer_proxy;
class task_scheduler_observer_v3 {
friend class observer_proxy;
observer_proxy* my_proxy;
- atomic<intptr> my_busy_count;
+ atomic<intptr_t> my_busy_count;
public:
//! Enable or disable observation
void __TBB_EXPORTED_METHOD observe( bool state=true );
diff --git a/include/tbb/tbb.h b/include/tbb/tbb.h
index a09817e..9c5ac0f 100644
--- a/include/tbb/tbb.h
+++ b/include/tbb/tbb.h
@@ -43,6 +43,8 @@
#include "blocked_range2d.h"
#include "blocked_range3d.h"
#include "cache_aligned_allocator.h"
+#include "combinable.h"
+#include "concurrent_unordered_map.h"
#include "concurrent_hash_map.h"
#include "concurrent_queue.h"
#include "concurrent_vector.h"
@@ -62,6 +64,7 @@
#include "pipeline.h"
#include "queuing_mutex.h"
#include "queuing_rw_mutex.h"
+#include "reader_writer_lock.h"
#include "recursive_mutex.h"
#include "spin_mutex.h"
#include "spin_rw_mutex.h"
diff --git a/include/tbb/tbb_allocator.h b/include/tbb/tbb_allocator.h
index 4f01990..008422d 100644
--- a/include/tbb/tbb_allocator.h
+++ b/include/tbb/tbb_allocator.h
@@ -29,9 +29,20 @@
#ifndef __TBB_tbb_allocator_H
#define __TBB_tbb_allocator_H
+#include "tbb_stddef.h"
#include <new>
+
+#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 <cstring>
-#include "tbb_stddef.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
namespace tbb {
diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h
index f907096..6f26e47 100644
--- a/include/tbb/tbb_config.h
+++ b/include/tbb/tbb_config.h
@@ -72,21 +72,42 @@
#endif /* TBB_PEFORMANCE_WARNINGS */
#endif /* TBB_USE_PERFORMANCE_WARNINGS */
+#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)
+ #if TBB_USE_EXCEPTIONS
+ #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.
+ #elif !defined(TBB_USE_EXCEPTIONS)
+ #define TBB_USE_EXCEPTIONS 0
+ #endif
+#elif !defined(TBB_USE_EXCEPTIONS)
+ #define TBB_USE_EXCEPTIONS 1
+#endif
+
+#ifndef TBB_IMPLEMENT_CPP0X
+/** By default, use C++0x classes if available **/
+#if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__
+#define TBB_IMPLEMENT_CPP0X 0
+#else
+#define TBB_IMPLEMENT_CPP0X 1
+#endif
+#endif /* TBB_IMPLEMENT_CPP0X */
/** Feature sets **/
-#ifndef __TBB_EXCEPTIONS
-#define __TBB_EXCEPTIONS 1
-#endif /* __TBB_EXCEPTIONS */
+#ifndef __TBB_COUNT_TASK_NODES
+ #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT
+#endif
+
+#ifndef __TBB_TASK_GROUP_CONTEXT
+#define __TBB_TASK_GROUP_CONTEXT 1
+#endif /* __TBB_TASK_GROUP_CONTEXT */
#ifndef __TBB_SCHEDULER_OBSERVER
#define __TBB_SCHEDULER_OBSERVER 1
#endif /* __TBB_SCHEDULER_OBSERVER */
-#ifndef __TBB_NEW_ITT_NOTIFY
-#define __TBB_NEW_ITT_NOTIFY 1
-#endif /* !__TBB_NEW_ITT_NOTIFY */
-
+#ifndef __TBB_ARENA_PER_MASTER
+#define __TBB_ARENA_PER_MASTER 1
+#endif /* __TBB_ARENA_PER_MASTER */
/* TODO: The following condition should be extended as soon as new compilers/runtimes
with std::exception_ptr support appear. */
@@ -118,7 +139,7 @@
/** Workarounds presence **/
-#if __GNUC__==4 && __GNUC_MINOR__==4 && !defined(__INTEL_COMPILER)
+#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)
#define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1
#endif
@@ -128,15 +149,23 @@
versions go out of the support list.
**/
-#if defined(_MSC_VER) && _MSC_VER < 0x1500 && !defined(__INTEL_COMPILER)
- /** VS2005 and earlier does not allow to declare a template class as a friend
+#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
+ incompatible with that of overridden one". **/
+ #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)
+ /** VS2005 and earlier do not allow declaring template class as a friend
of classes defined in other namespaces. **/
#define __TBB_TEMPLATE_FRIENDS_BROKEN 1
#endif
#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__
+ //! Macro controlling EH usages in TBB tests
/** Some older versions of glibc crash when exception handling happens concurrently. **/
- #define __TBB_EXCEPTION_HANDLING_BROKEN 1
+ #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1
#endif
#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110
@@ -144,8 +173,13 @@
#define __TBB_ICL_11_1_CODE_GEN_BROKEN 1
#endif
+#if __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)
+ /** A bug in GCC 3.3 with access to nested classes declared in protected area */
+ #define __TBB_GCC_3_3_PROTECTED_BROKEN 1
+#endif
+
#if __FreeBSD__
- /** The bug in FreeBSD 8.0 results in kernel panic when there is contention
+ /** A bug in FreeBSD 8.0 results in kernel panic when there is contention
on a mutex created with this attribute. **/
#define __TBB_PRIO_INHERIT_BROKEN 1
@@ -154,8 +188,11 @@
#define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1
#endif /* __FreeBSD__ */
-#if __LRB__
-#include "tbb_config_lrb.h"
+#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)
+ /** The Intel compiler for IA-32 (Linux|Mac OS X) crashes or generates
+ incorrect code when __asm__ arguments have a cast to volatile. **/
+ #define __TBB_ICC_ASM_VOLATILE_BROKEN 1
#endif
+
#endif /* __TBB_tbb_config_H */
diff --git a/include/tbb/tbb_exception.h b/include/tbb/tbb_exception.h
index 059c567..3e1eecd 100644
--- a/include/tbb/tbb_exception.h
+++ b/include/tbb/tbb_exception.h
@@ -31,11 +31,18 @@
#include "tbb_stddef.h"
-#if __TBB_EXCEPTIONS && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC)
-#error The current compilation environment does not support exception handling. Please set __TBB_EXCEPTIONS to 0 in tbb_config.h
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
#endif
#include <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#if __SUNPRO_CC
#include <string> // required to construct std exception classes
#endif
@@ -46,9 +53,9 @@ namespace tbb {
class bad_last_alloc : public std::bad_alloc {
public:
/*override*/ const char* what() const throw();
- /** Necessary to avoid ICL error: "exception specification for implicitly
- declared virtual is incompatible with that of overridden function". **/
+#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN
/*override*/ ~bad_last_alloc() throw() {}
+#endif
};
//! Exception for PPL locks
@@ -83,9 +90,17 @@ enum exception_id {
eid_missing_wait,
eid_invalid_multiple_scheduling,
eid_improper_lock,
+ eid_possible_deadlock,
+ eid_operation_not_permitted,
+ eid_condvar_wait_failed,
+ eid_invalid_load_factor,
+ eid_invalid_buckets_number,
+ eid_invalid_swap,
+ eid_reservation_length_error,
+ eid_invalid_key,
//! The last enumerator tracks the number of defined IDs. It must remain the last one.
/** When adding new IDs, place them immediately _before_ this comment (that is
- _after_ all the existing IDs. Never insert new IDs between the existing ones. **/
+ _after_ all the existing IDs. NEVER insert new IDs between the existing ones. **/
eid_max
};
@@ -94,13 +109,13 @@ enum exception_id {
scattered in multiple places, especially in templates. **/
void __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
-//! Versionless covenience wrapper for throw_exception_v4()
+//! Versionless convenience wrapper for throw_exception_v4()
inline void throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
-} // namespace internal
+} // namespace internal
} // namespace tbb
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
#include "tbb_allocator.h"
#include <exception>
#include <typeinfo>
@@ -184,10 +199,10 @@ public:
set(src.my_exception_name, src.my_exception_info);
}
- captured_exception ( const char* name, const char* info )
+ captured_exception ( const char* name_, const char* info )
: my_dynamic(false)
{
- set(name, info);
+ set(name_, info);
}
__TBB_EXPORTED_METHOD ~captured_exception () throw() {
@@ -209,7 +224,7 @@ public:
void __TBB_EXPORTED_METHOD destroy () throw();
/*override*/
- void throw_self () { throw *this; }
+ void throw_self () { __TBB_THROW(*this); }
/*override*/
const char* __TBB_EXPORTED_METHOD name() const throw();
@@ -243,10 +258,16 @@ class movable_exception : public tbb_exception
typedef movable_exception<ExceptionData> self_type;
public:
- movable_exception ( const ExceptionData& data )
- : my_exception_data(data)
+ movable_exception ( const ExceptionData& data_ )
+ : my_exception_data(data_)
, my_dynamic(false)
- , my_exception_name(typeid(self_type).name())
+ , my_exception_name(
+#if TBB_USE_EXCEPTIONS
+ typeid(self_type).name()
+#else /* !TBB_USE_EXCEPTIONS */
+ "movable_exception"
+#endif /* !TBB_USE_EXCEPTIONS */
+ )
{}
movable_exception ( const movable_exception& src ) throw ()
@@ -292,9 +313,7 @@ public:
}
}
/*override*/
- void throw_self () {
- throw *this;
- }
+ void throw_self () { __TBB_THROW( *this ); }
protected:
//! User data
@@ -341,6 +360,6 @@ private:
} // namespace tbb
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
#endif /* __TBB_exception_H */
diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h
index 8c01a45..aa13065 100644
--- a/include/tbb/tbb_machine.h
+++ b/include/tbb/tbb_machine.h
@@ -45,6 +45,8 @@ extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
#include "machine/windows_ia32.h"
#elif defined(_M_AMD64)
#include "machine/windows_intel64.h"
+#elif _XBOX
+#include "machine/xbox360_ppc.h"
#else
#error Unsupported platform
#endif
@@ -319,6 +321,33 @@ struct work_around_alignment_bug {
#endif
#endif /* ____TBB_TypeWithAlignmentAtLeastAsStrict */
+// Template class here is to avoid instantiation of the static data for modules that don't use it
+template<typename T>
+struct reverse {
+ static const T byte_table[256];
+};
+// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed
+// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.
+template<typename T>
+const T reverse<T>::byte_table[256] = {
+ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+ 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+ 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+ 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+ 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+ 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+ 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+ 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+ 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+ 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+ 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+ 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+ 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+ 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+ 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+ 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+};
+
} // namespace internal
} // namespace tbb
@@ -591,4 +620,23 @@ inline uintptr_t __TBB_LockByte( unsigned char& flag ) {
}
#endif
+#ifndef __TBB_ReverseByte
+inline unsigned char __TBB_ReverseByte(unsigned char src) {
+ return tbb::internal::reverse<unsigned char>::byte_table[src];
+}
+#endif
+
+template<typename T>
+T __TBB_ReverseBits(T src)
+{
+ T dst;
+ unsigned char *original = (unsigned char *) &src;
+ unsigned char *reversed = (unsigned char *) &dst;
+
+ for( int i = sizeof(T)-1; i >= 0; i-- )
+ reversed[i] = __TBB_ReverseByte( original[sizeof(T)-i-1] );
+
+ return dst;
+}
+
#endif /* __TBB_machine_H */
diff --git a/include/tbb/tbb_profiling.h b/include/tbb/tbb_profiling.h
index dc964c5..c3bbb51 100644
--- a/include/tbb/tbb_profiling.h
+++ b/include/tbb/tbb_profiling.h
@@ -30,7 +30,7 @@
#define __TBB_profiling_H
// Check if the tools support is enabled
-#if (_WIN32||_WIN64||__linux__) && TBB_USE_THREADING_TOOLS
+#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS
#if _WIN32||_WIN64
#include <stdlib.h> /* mbstowcs_s */
diff --git a/include/tbb/tbb_stddef.h b/include/tbb/tbb_stddef.h
index f3f9f0f..a4c938e 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 2
-#define TBB_VERSION_MINOR 2
+#define TBB_VERSION_MAJOR 3
+#define TBB_VERSION_MINOR 0
// Engineering-focused interface version
-#define TBB_INTERFACE_VERSION 4003
+#define TBB_INTERFACE_VERSION 5000
#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000
// The oldest major interface version still supported
@@ -159,10 +159,10 @@ namespace internal {
#include "tbb_config.h"
+//! The namespace tbb contains all components of the library.
namespace tbb {
//! 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
@@ -173,7 +173,6 @@ namespace tbb {
#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
#define __TBB_ASSERT_EX __TBB_ASSERT
-namespace tbb {
//! Set assertion handler and return previous value of it.
assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );
@@ -182,7 +181,6 @@ namespace tbb {
If assertion handler is null, print message for assertion failure and abort.
Otherwise call the assertion handler. */
void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment );
-} // namespace tbb
#else
@@ -193,9 +191,6 @@ namespace tbb {
#endif /* TBB_USE_ASSERT */
-//! The namespace tbb contains all components of the library.
-namespace tbb {
-
//! The function returns the interface version of the TBB shared library being used.
/**
* The version it returns is determined at runtime, not at compile/link time.
@@ -219,22 +214,48 @@ namespace internal {
using std::size_t;
-//! An unsigned integral type big enough to hold a pointer.
-/** There's no guarantee by the C++ standard that a size_t is really big enough,
- but it happens to be for all platforms of interest. */
-typedef size_t uintptr;
-
-//! A signed integral type big enough to hold a pointer.
-/** There's no guarantee by the C++ standard that a ptrdiff_t is really big enough,
- but it happens to be for all platforms of interest. */
-typedef std::ptrdiff_t intptr;
-
//! Compile-time constant that is upper bound on cache line/sector size.
/** It should be used only in situations where having a compile-time upper
bound is more useful than a run-time exact answer.
@ingroup memory_allocation */
const size_t NFS_MaxLineSize = 128;
+template<class T, int S>
+struct padded_base : T {
+ char pad[NFS_MaxLineSize - sizeof(T) % NFS_MaxLineSize];
+};
+template<class T> struct padded_base<T, 0> : T {};
+
+//! Pads type T to fill out to a multiple of cache line size.
+template<class T>
+struct padded : padded_base<T, sizeof(T)> {};
+
+//! Extended variant of the standard offsetof macro
+/** The standard offsetof macro is not sufficient for TBB as it can be used for
+ POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/
+#define __TBB_offsetof(class_name, member_name) \
+ ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
+
+//! Returns address of the object containing a member with the given name and address
+#define __TBB_get_object_ref(class_name, member_name, member_addr) \
+ (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))
+
+//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info
+void __TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info );
+
+#if TBB_USE_EXCEPTIONS
+ #define __TBB_TRY try
+ #define __TBB_CATCH(e) catch(e)
+ #define __TBB_THROW(e) throw e
+ #define __TBB_RETHROW() throw
+#else /* !TBB_USE_EXCEPTIONS */
+ inline bool __TBB_false() { return false; }
+ #define __TBB_TRY
+ #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )
+ #define __TBB_THROW(e) ((void)0)
+ #define __TBB_RETHROW() ((void)0)
+#endif /* !TBB_USE_EXCEPTIONS */
+
//! Report a runtime warning.
void __TBB_EXPORTED_FUNC runtime_warning( const char* format, ... );
diff --git a/include/tbb/tbb_thread.h b/include/tbb/tbb_thread.h
index 1e12fd2..0f878ff 100644
--- a/include/tbb/tbb_thread.h
+++ b/include/tbb/tbb_thread.h
@@ -39,10 +39,21 @@
#include <pthread.h>
#endif // _WIN32||_WIN64
-#include <iosfwd>
-#include <exception> // Need std::terminate from here.
#include "tbb_stddef.h"
#include "tick_count.h"
+#include <exception> // Need std::terminate from here.
+
+#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 <iosfwd>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
namespace tbb {
@@ -72,9 +83,9 @@ namespace internal {
static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {
thread_closure_0 *self = static_cast<thread_closure_0*>(c);
- try {
+ __TBB_TRY {
self->function();
- } catch ( ... ) {
+ } __TBB_CATCH( ... ) {
std::terminate();
}
delete self;
@@ -89,9 +100,9 @@ namespace internal {
//! Routine passed to Windows's _beginthreadex by thread::internal_start() inside tbb.dll
static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {
thread_closure_1 *self = static_cast<thread_closure_1*>(c);
- try {
+ __TBB_TRY {
self->function(self->arg1);
- } catch ( ... ) {
+ } __TBB_CATCH( ... ) {
std::terminate();
}
delete self;
@@ -106,9 +117,9 @@ namespace internal {
//! Routine passed to Windows's _beginthreadex by thread::internal_start() inside tbb.dll
static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {
thread_closure_2 *self = static_cast<thread_closure_2*>(c);
- try {
+ __TBB_TRY {
self->function(self->arg1, self->arg2);
- } catch ( ... ) {
+ } __TBB_CATCH( ... ) {
std::terminate();
}
delete self;
@@ -189,10 +200,10 @@ namespace internal {
class tbb_thread_v3::id {
#if _WIN32||_WIN64
DWORD my_id;
- id( DWORD my_id ) : my_id(my_id) {}
+ id( DWORD id_ ) : my_id(id_) {}
#else
pthread_t my_id;
- id( pthread_t my_id ) : my_id(my_id) {}
+ id( pthread_t id_ ) : my_id(id_) {}
#endif // _WIN32||_WIN64
friend class tbb_thread_v3;
public:
diff --git a/src/Makefile b/src/Makefile
index 41cc16d..dc6943e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -27,6 +27,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
all: release debug examples
@@ -39,9 +40,6 @@ rml: rml_release rml_debug
test: tbbmalloc_test_release rml_test_release test_release tbbmalloc_test_debug rml_test_debug test_debug
-# Suffix _ni stands for "no ingnore", meaning that the first error during the test session will stop it
-test_ni: tbbmalloc_test_release_ni test_release_ni tbbmalloc_test_debug_ni test_debug_ni
-
test_no_depends: tbbmalloc_test_release_no_depends test_release_no_depends tbbmalloc_test_debug_no_depends test_debug_no_depends
@echo done
@@ -101,16 +99,10 @@ tbb_debug: mkdir_debug
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)
+ $(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_no_depends:
- -$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
-
-test_release_ni:
- $(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.test cfg=release tbb_root=$(tbb_root)
-
-test_debug_ni:
$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
.PHONY: tbbmalloc_release tbbmalloc_debug
@@ -137,16 +129,10 @@ tbbmalloc_proxy_dll_debug: mkdir_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 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)
-
-tbbmalloc_test_release_ni: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbbmalloc_release) 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)
-
-tbbmalloc_test_debug_ni: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbbmalloc_debug) 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)
.PHONY: rml_release rml_debug rml_test_release rml_test_debug
@@ -160,11 +146,11 @@ rml_debug: mkdir_debug
rml_test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,rml_release) rml_test_release_no_depends
rml_test_release_no_depends:
- -$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.rml cfg=release rml_test tbb_root=$(tbb_root)
+ $(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.rml cfg=release rml_test tbb_root=$(tbb_root)
rml_test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,rml_debug) rml_test_debug_no_depends
rml_test_debug_no_depends:
- -$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.rml cfg=debug rml_test tbb_root=$(tbb_root)
+ $(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.rml cfg=debug rml_test tbb_root=$(tbb_root)
.PHONY: examples_release examples_debug
@@ -191,11 +177,11 @@ clean_examples:
mkdir_release:
$(shell $(MD) "$(work_dir)_release" >$(NUL) 2>$(NUL))
- $(if $(subst undefined,,$(origin_build_dir)),,cd "$(work_dir)_release" && $(MAKE_TBBVARS) $(tbb_build_prefix)_release)
+ @echo Created $(work_dir)_release directory
mkdir_debug:
$(shell $(MD) "$(work_dir)_debug" >$(NUL) 2>$(NUL))
- $(if $(subst undefined,,$(origin_build_dir)),,cd "$(work_dir)_debug" && $(MAKE_TBBVARS) $(tbb_build_prefix)_debug)
+ @echo Created $(work_dir)_debug directory
codecov: compiler=$(if $(findstring windows,$(tbb_os)),icl,icc)
codecov:
diff --git a/src/index.html b/src/index.html
index cc7c58a..fe27a65 100644
--- a/src/index.html
+++ b/src/index.html
@@ -18,6 +18,49 @@ This directory contains the source code and unit tests for Threading Building Bl
<DD>Source code of the Resource Management Layer (RML).
</DL>
+<h2>Files</h2>
+<dl>
+<dt><a href="Makefile">Makefile</a>
+</dt><dd>Advanced Makefile for developing and debugging of TBB. See the <a href="../build/index.html#build">basic build directions</a>. Additional targets and options:
+ <dl>
+ <dt><tt>make test_{name} time_{name}</tt>
+ </dt><dd>Make and run individual test or benchmark.</dd>
+ <dt><tt>make stress_{name}</tt>
+ </dt><dd>Equivalent to 'make test_{name}' but runs until a failure detected or terminated by user.</dd>
+ <dt><tt>make run_cmd="{command}" [(above options or targets)]</tt>
+ </dt><dd>Command prefix for tests execution. Also, "run_cmd=-" will ignore test execution failures. See also -k and -i options of the GNU make for more options to keep building and testing despite of failures.</dd>
+ <dt><tt>make debug_{name}</tt>
+ </dt><dd>Equivalent to 'make test_{name}' but compiles in debug mode and runs under debugger ("run_cmd=$(debugger)").</dd>
+ <dt><tt>make args="{command-line arguments}" [(above options or targets)]</tt>
+ </dt><dd>Additional arguments for the run.</dd>
+ <dt><tt>make repeat="{N}" [(above options or targets)]</tt>
+ </dt><dd>Repeats execution N times.</dd>
+ <dt><tt>make clean_{filename}</tt>
+ </dt><dd>Removes executable, object, and other intermediate files with specified filename ('*' also works).</dd>
+ <dt><tt>make cfg={debug|release} [(above options or targets)]</tt>
+ </dt><dd>Specifies a build mode or corresponding directory to work in.</dd>
+ <dt><tt>make tbb_strict=1 [(above options or targets)]</tt>
+ </dt><dd>Enables warnings as errors.</dd>
+ <dt><tt>make examples/{target}</tt>
+ </dt><dd>Invokes examples/Makefile with specified target.</dd>
+ <dt><tt>make clean_release clean_debug clean_examples</tt>
+ </dt><dd>Removes release or debug build directories, or cleans all examples.</dd>
+ <dt><tt>make test_no_depends</tt>
+ </dt><dd>Equivalent to 'make test' but does not check for libraries updates.</dd>
+ <dt><tt>make info</tt>
+ </dt><dd>Output information about build configuration and directories.</dd>
+ <dt><tt>make cpp0x=1 [(above options or targets)]</tt>
+ </dt><dd>Enables C++0x extensions like lambdas for compilers that implement them as experimental features.</dd>
+ <dt><tt>make CXXFLAGS={Flags} [(above options or targets)]</tt>
+ </dt><dd>Specifies additional options for compiler.</dd>
+ <dt><tt>make target={name} [(above options or targets)]</tt>
+ </dt><dd>Includes additional build/{name}.inc file after OS-specific one.</dd>
+ <dt><tt>make extra_inc={filename} [(above options or targets)]</tt>
+ </dt><dd>Includes additional makefile.</dd>
+
+ </dd></dl>
+</dd></dl>
+
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
diff --git a/src/old/concurrent_queue_v2.cpp b/src/old/concurrent_queue_v2.cpp
index d528e12..0359a95 100644
--- a/src/old/concurrent_queue_v2.cpp
+++ b/src/old/concurrent_queue_v2.cpp
@@ -176,7 +176,7 @@ void micro_queue::push( const void* item, ticket k, concurrent_queue_base& base
}
base.copy_item( *p, index, item );
// If no exception was thrown, mark item as present.
- p->mask |= uintptr(1)<<index;
+ p->mask |= uintptr_t(1)<<index;
}
}
@@ -190,7 +190,7 @@ bool micro_queue::pop( void* dst, ticket k, concurrent_queue_base& base ) {
bool success = false;
{
pop_finalizer finalizer( *this, k+concurrent_queue_rep::n_queue, index==base.items_per_page-1 ? &p : NULL );
- if( p.mask & uintptr(1)<<index ) {
+ if( p.mask & uintptr_t(1)<<index ) {
success = true;
base.assign_and_destroy_item( dst, p, index );
}
diff --git a/src/old/concurrent_queue_v2.h b/src/old/concurrent_queue_v2.h
index 23344ab..d55b5a3 100644
--- a/src/old/concurrent_queue_v2.h
+++ b/src/old/concurrent_queue_v2.h
@@ -59,7 +59,7 @@ protected:
//! Prefix on a page
struct page {
page* next;
- uintptr mask;
+ uintptr_t mask;
};
//! Capacity of the queue
diff --git a/src/old/concurrent_vector_v2.cpp b/src/old/concurrent_vector_v2.cpp
index 8c0a417..b0d161d 100644
--- a/src/old/concurrent_vector_v2.cpp
+++ b/src/old/concurrent_vector_v2.cpp
@@ -28,11 +28,22 @@
#include "concurrent_vector_v2.h"
#include "tbb/tbb_machine.h"
-#include <stdexcept>
#include "../tbb/itt_notify.h"
#include "tbb/task.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 <cstring>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#if defined(_MSC_VER) && defined(_Wp64)
// Workaround for overzealous compiler warnings in /Wp64 mode
@@ -98,7 +109,7 @@ concurrent_vector_base::size_type concurrent_vector_base::internal_capacity() co
void concurrent_vector_base::internal_reserve( size_type n, size_type element_size, size_type max_size ) {
if( n>max_size ) {
- throw std::length_error("argument to ConcurrentVector::reserve exceeds ConcurrentVector::max_size()");
+ __TBB_THROW( std::length_error("argument to ConcurrentVector::reserve exceeds ConcurrentVector::max_size()") );
}
for( segment_index_t k = helper::find_segment_end(*this); segment_base(k)<n; ++k ) {
helper::extend_segment_if_necessary(*this,k);
diff --git a/src/old/concurrent_vector_v2.h b/src/old/concurrent_vector_v2.h
index 3cb494c..738d29a 100644
--- a/src/old/concurrent_vector_v2.h
+++ b/src/old/concurrent_vector_v2.h
@@ -30,13 +30,23 @@
#define __TBB_concurrent_vector_H
#include "tbb/tbb_stddef.h"
-#include <iterator>
-#include <new>
#include "tbb/atomic.h"
#include "tbb/cache_aligned_allocator.h"
#include "tbb/blocked_range.h"
-
#include "tbb/tbb_machine.h"
+#include <new>
+
+#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 <iterator>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
namespace tbb {
@@ -59,8 +69,8 @@ namespace internal {
static const int min_segment_size = segment_index_t(1)<<lg_min_segment_size;
static segment_index_t segment_index_of( size_t index ) {
- uintptr i = index|1<<(lg_min_segment_size-1);
- uintptr j = __TBB_Log2(i);
+ uintptr_t i = index|1<<(lg_min_segment_size-1);
+ uintptr_t j = __TBB_Log2(i);
return segment_index_t(j-(lg_min_segment_size-1));
}
diff --git a/src/old/spin_rw_mutex_v2.cpp b/src/old/spin_rw_mutex_v2.cpp
index b2e2b3c..a19ec93 100644
--- a/src/old/spin_rw_mutex_v2.cpp
+++ b/src/old/spin_rw_mutex_v2.cpp
@@ -34,8 +34,8 @@ namespace tbb {
using namespace internal;
-static inline bool CAS(volatile uintptr &addr, uintptr newv, uintptr oldv) {
- return __TBB_CompareAndSwapW((volatile void *)&addr, (intptr)newv, (intptr)oldv) == (intptr)oldv;
+static inline bool CAS(volatile uintptr_t &addr, uintptr_t newv, uintptr_t oldv) {
+ return __TBB_CompareAndSwapW((volatile void *)&addr, (intptr_t)newv, (intptr_t)oldv) == (intptr_t)oldv;
}
//! Signal that write lock is released
@@ -136,7 +136,7 @@ void spin_rw_mutex::internal_release_reader(spin_rw_mutex *mutex)
__TBB_ASSERT( mutex->state & READERS, "invalid state of a read lock: no readers" );
__TBB_ASSERT( !(mutex->state & WRITER), "invalid state of a read lock: active writer" );
ITT_NOTIFY(sync_releasing, mutex); // release reader
- __TBB_FetchAndAddWrelease((volatile void *)&(mutex->state),-(intptr)ONE_READER);
+ __TBB_FetchAndAddWrelease((volatile void *)&(mutex->state),-(intptr_t)ONE_READER);
}
bool spin_rw_mutex::internal_try_acquire_writer( spin_rw_mutex * mutex )
diff --git a/src/old/spin_rw_mutex_v2.h b/src/old/spin_rw_mutex_v2.h
index 47930f5..bc45277 100644
--- a/src/old/spin_rw_mutex_v2.h
+++ b/src/old/spin_rw_mutex_v2.h
@@ -168,7 +168,7 @@ public:
};
private:
- typedef internal::uintptr state_t;
+ typedef uintptr_t state_t;
static const state_t WRITER = 1;
static const state_t WRITER_PENDING = 2;
static const state_t READERS = ~(WRITER | WRITER_PENDING);
diff --git a/src/tbb/itt_notify_proxy.c b/src/old/task_v2.cpp
similarity index 71%
copy from src/tbb/itt_notify_proxy.c
copy to src/old/task_v2.cpp
index 7fdedfa..7deccfc 100644
--- a/src/tbb/itt_notify_proxy.c
+++ b/src/old/task_v2.cpp
@@ -26,30 +26,21 @@
the GNU General Public License.
*/
-#include "tbb/tbb_config.h"
+/* This compilation unit provides definition of task::destroy( task& )
+ that is binary compatible with TBB 2.x. In TBB 3.0, the method became
+ static, and its name decoration changed, though the definition remained.
-/* This declaration in particular shuts up "empty translation unit" warning */
-extern int __TBB_load_ittnotify();
-
-#if __TBB_NEW_ITT_NOTIFY
-#if DO_ITT_NOTIFY
-
-#if _WIN32||_WIN64
- #ifndef UNICODE
- #define UNICODE
- #endif
-#endif /* WIN */
-
-extern void ITT_DoOneTimeInitialization();
-
-#define ITT_SIMPLE_INIT 1
-#define __itt_init_lib_name ITT_DoOneTimeInitialization
+ The macro switch should be set prior to including task.h
+ or any TBB file that might bring task.h up.
+*/
+#define __TBB_DEPRECATED_TASK_INTERFACE 1
+#include "tbb/task.h"
-#include "tools_api/ittnotify_static.c"
+namespace tbb {
-int __TBB_load_ittnotify() {
- return __itt_init_lib();
+void task::destroy( task& victim ) {
+ // Forward to static version
+ task_base::destroy( victim );
}
-#endif /* DO_ITT_NOTIFY */
-#endif /* __TBB_NEW_ITT_NOTIFY */
+} // namespace tbb
diff --git a/src/old/test_task_v2.cpp b/src/old/test_task_v2.cpp
new file mode 100644
index 0000000..fc724cd
--- /dev/null
+++ b/src/old/test_task_v2.cpp
@@ -0,0 +1,123 @@
+/*
+ Copyright 2005-2010 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.
+*/
+
+// Tests that methods of class task that changed from non-static to static between
+// TBB 2.2 and TBB 3.0 still work when TBB_DEPRECATED_TASK_INTERFACE is defined.
+
+#define TBB_DEPRECATED_TASK_INTERFACE 1
+#include "tbb/task.h"
+#include "tbb/atomic.h"
+#include "../test/harness_assert.h"
+
+tbb::atomic<int> Sum;
+tbb::atomic<int> DummyCount;
+
+class DummyTask: public tbb::task {
+ tbb::task* execute() {
+ ASSERT(false,"DummyTask should never execute");
+ return NULL;
+ }
+public:
+ //! Used to verify that right task was destroyed
+ bool can_destroy;
+ DummyTask() : can_destroy(false) {
+ ++DummyCount;
+ }
+ ~DummyTask() {
+ ASSERT(can_destroy,"destroyed wrong task?");
+ --DummyCount;
+ }
+};
+
+class ChildTask: public tbb::task {
+public:
+ const int addend;
+ ChildTask( int addend_ ) : addend(addend_) {}
+ tbb::task* execute() {
+ Sum+=addend;
+ return NULL;
+ }
+};
+
+void TestFormallyNonstaticMethods() {
+ // Check signatures
+ void (tbb::task::*d)( tbb::task& ) = &tbb::task::destroy;
+ void (tbb::task::*s)( tbb::task& ) = &tbb::task::spawn;
+ void (tbb::task::*slist)( tbb::task_list& ) = &tbb::task::spawn;
+
+ DummyTask& root = *new( tbb::task::allocate_root() ) DummyTask;
+
+ for( int use_list=0; use_list<2; ++use_list ) {
+ // Note: the cases n=0 is important to check, because spawn(task_list)
+ // has different logic for the empty case.
+ for( int n=0; n<1000; n=n<5 ? n+1 : n=n+n/5 ) {
+ Sum=0;
+ root.set_ref_count(n+1);
+ if( use_list ) {
+ tbb::task_list list;
+ for( int i=0; i<n; ++i ) {
+ tbb::task& child = *new( root.allocate_child() ) ChildTask(i+1);
+ list.push_back(child);
+ }
+ // Spawn the children
+ (root.*slist)(list);
+ } else {
+ // Do spawning without a list
+ for( int i=0; i<n; ++i ) {
+ tbb::task& child = *new( root.allocate_child() ) ChildTask(i+1);
+ // Spawn one child
+ (root.*s)(child);
+ }
+ }
+ root.wait_for_all();
+ // Check that children ran.
+ ASSERT( Sum==n*(n+1)/2, "child did not run?" );
+ }
+ }
+
+ //! Check method destroy.
+ root.set_ref_count(1);
+ DummyTask& child = *new( root.allocate_child() ) DummyTask;
+ child.can_destroy=true;
+ (root.*d)( child );
+ ASSERT( root.ref_count()==0, NULL );
+ root.can_destroy=true;
+ (root.*d)( root );
+ ASSERT( !DummyCount, "constructor/destructor mismatch" );
+}
+
+#include "tbb/task_scheduler_init.h"
+#include "../test/harness.h"
+
+int TestMain () {
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ tbb::task_scheduler_init init(p);
+ TestFormallyNonstaticMethods();
+ }
+ return Harness::Done;
+}
diff --git a/src/perf/statistics.cpp b/src/perf/statistics.cpp
index afe22cd..25788fa 100644
--- a/src/perf/statistics.cpp
+++ b/src/perf/statistics.cpp
@@ -333,74 +333,6 @@ void StatisticsCollector::Print(int dataOutput, const char *ModeName)
fprintf(OutputFile, XMLAutoFilter,1,1,1,int(AnalysisTitles.size()+Formulas.size()+COUNT_PARAMETERS));
fprintf(OutputFile, XMLEndWorkSheet);
//----------------------------------------
- strcpy(SheetName,"Vertical");
- fprintf(OutputFile, XMLBeginSheet, SheetName);
- fprintf(OutputFile, XMLNames, int(Formulas.size()+AnalysisTitles.size()+COUNT_PARAMETERS+2),2,int(AnalysisTitles.size()+Formulas.size()+COUNT_PARAMETERS+2),int(Statistics.size()+1));
- fprintf(OutputFile, XMLBeginTable, int(max(Statistics.size()+1, size_t(7))), int(RoundTitles.size()+AnalysisTitles.size()+Formulas.size()+COUNT_PARAMETERS+2));
- //fprintf(OutputFile, XMLColumsVerticalTable, Statistics.size()+1);
- //----------------------------------------
-
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLNameAndTime, Name.c_str(), TimerBuff, DateBuff);
- fprintf(OutputFile, XMLTableParamAndTitle, int(Statistics.size()), int(AnalysisTitles.size()), int(RoundTitles.size()), Title.c_str());
- fprintf(OutputFile, XMLERow);
- fprintf(OutputFile, XMLBRow);
- //-------------------
- fprintf(OutputFile, XMLCellTopName);
- for (Statistics_t::iterator i = Statistics.begin(); i != Statistics.end(); i++)
- fprintf(OutputFile, XMLCellName, i->second->Name.c_str());
- fprintf(OutputFile, XMLERow);
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLCellTopThread);
- for (Statistics_t::iterator i = Statistics.begin(); i != Statistics.end(); i++)
- fprintf(OutputFile, XMLCellThread, i->second->Threads);
- fprintf(OutputFile, XMLERow);
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLCellTopMode, ModeName);
- for (Statistics_t::iterator i = Statistics.begin(); i != Statistics.end(); i++)
- fprintf(OutputFile, XMLCellMode, i->second->Mode.c_str());
- fprintf(OutputFile, XMLERow);
- //-----------------
- for (AnalysisTitles_t::iterator t = AnalysisTitles.begin(); t != AnalysisTitles.end(); t++)
- {
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLAnalysisTitle, t->c_str()+1);
- for (Statistics_t::iterator i = Statistics.begin(); i != Statistics.end(); i++)
- fprintf(OutputFile, XMLCellAnalysis, i->second->Analysis.count(*t)?(i->second->Analysis[*t]).c_str():"");
- fprintf(OutputFile, XMLERow);
- }
- //-------------------------------------
- for (Formulas_t::iterator t = Formulas.begin(); t != Formulas.end(); t++)
- {
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLAnalysisTitle, t->first.c_str()+1);
- size_t place = 0;
- for (Statistics_t::iterator i = Statistics.begin(); i != Statistics.end(); i++)
- fprintf(OutputFile, XMLCellAnalysis, ExcelFormula(t->second, Formulas.size()-place, i->second->Results.size(), false).c_str());
- fprintf(OutputFile, XMLERow);
- }
- //--------------------------------------
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLCellEmptyWhite, "Result");
- fprintf(OutputFile, XMLERow);
-
- for (size_t k = 0; k < RoundTitles.size(); k++)
- {
- fprintf(OutputFile, XMLBRow);
- fprintf(OutputFile, XMLAnalysisTitle, RoundTitles[k].c_str());
- for (Statistics_t::iterator i = Statistics.begin(); i != Statistics.end(); i++)
- if(i->second->Results.size() > k)
- fprintf(OutputFile, XMLCellData, i->second->Results[k]);
- else
- fprintf(OutputFile, XMLCellEmptyWhite, "");
- fprintf(OutputFile, XMLERow);
- }
- fprintf(OutputFile, XMLEndTable);
- //----------------------------------------
- fprintf(OutputFile, XMLWorkSheetProperties, int(Formulas.size()+AnalysisTitles.size()+COUNT_PARAMETERS+2), int(Formulas.size()+AnalysisTitles.size()+COUNT_PARAMETERS+2),1,1,6);
- fprintf(OutputFile, XMLAutoFilter, int(Formulas.size()+AnalysisTitles.size()+COUNT_PARAMETERS+2),2, int(Formulas.size()+AnalysisTitles.size()+COUNT_PARAMETERS+2), int(Statistics.size()+1));
- //----------------------------------------
- fprintf(OutputFile, XMLEndWorkSheet);
fprintf(OutputFile, XMLEndWorkbook);
fclose(OutputFile);
}
diff --git a/src/perf/time_framework.h b/src/perf/time_framework.h
index 89abc2d..59a636c 100644
--- a/src/perf/time_framework.h
+++ b/src/perf/time_framework.h
@@ -37,6 +37,7 @@
#include "tbb/tbb_stddef.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/tick_count.h"
+#define HARNESS_CUSTOM_MAIN 1
#include "../test/harness.h"
#include "../test/harness_barrier.h"
#define STATISTICS_INLINE
diff --git a/src/perf/time_sandbox.h b/src/perf/time_sandbox.h
index f3bb23b..da6bcd9 100644
--- a/src/perf/time_sandbox.h
+++ b/src/perf/time_sandbox.h
@@ -115,7 +115,7 @@ namespace sandbox9 {
//if harness.h included
#if defined(ASSERT) && !HARNESS_NO_PARSE_COMMAND_LINE
#ifndef TEST_PREFIX
-#define TEST_PREFIX if(Verbose) printf("Processing with %d threads: %ld...\n", threads, value);
+#define TEST_PREFIX if(Verbose) printf("Processing with %d threads: %ld...\n", threads, long(value));
#endif
#endif//harness included
diff --git a/src/perf/time_vector.cpp b/src/perf/time_vector.cpp
index 1f9d6cc..36442f1 100644
--- a/src/perf/time_vector.cpp
+++ b/src/perf/time_vector.cpp
@@ -46,6 +46,7 @@
#include "tbb/parallel_for.h"
#include "tbb/tick_count.h"
#include "tbb/blocked_range.h"
+#define HARNESS_CUSTOM_MAIN 1
#include "../test/harness.h"
//#include "harness_barrier.h"
#include "../test/harness_allocator.h"
diff --git a/src/rml/client/rml_factory.h b/src/rml/client/rml_factory.h
index 1bcec18..2414692 100644
--- a/src/rml/client/rml_factory.h
+++ b/src/rml/client/rml_factory.h
@@ -28,8 +28,6 @@
// No ifndef guard because this file is not a normal include file.
-// FIXME - resolve whether _debug version of the RML should have different suffix. */
-
#if TBB_USE_DEBUG
#define DEBUG_SUFFIX "_debug"
#else
@@ -51,7 +49,7 @@
#include "library_assert.h"
-const ::rml::versioned_object::version_type CLIENT_VERSION = 1;
+const ::rml::versioned_object::version_type CLIENT_VERSION = 2;
#if __TBB_WEAK_SYMBOLS
#pragma weak __RML_open_factory
@@ -81,9 +79,8 @@ const ::rml::versioned_object::version_type CLIENT_VERSION = 1;
if( dynamic_link( RML_SERVER_NAME, server_link_table, 4, 4, &h ) ) {
library_handle = h;
version_type server_version;
- status_type result = (*open_factory_routine)( *this, server_version, CLIENT_VERSION );
+ result = (*open_factory_routine)( *this, server_version, CLIENT_VERSION );
// server_version can be checked here for incompatibility here if necessary.
- return result;
} else {
library_handle = NULL;
result = st_not_found;
@@ -92,8 +89,9 @@ const ::rml::versioned_object::version_type CLIENT_VERSION = 1;
}
void FACTORY::close() {
- if( library_handle ) {
+ if( library_handle )
(*my_wait_to_close_routine)(*this);
+ if( (size_t)library_handle>FACTORY::c_dont_unload ) {
dynamic_link_handle h = library_handle;
dynamic_unlink(h);
library_handle = NULL;
diff --git a/src/rml/include/rml_base.h b/src/rml/include/rml_base.h
index 85ab556..f172fc7 100644
--- a/src/rml/include/rml_base.h
+++ b/src/rml/include/rml_base.h
@@ -35,6 +35,9 @@
#if _WIN32||_WIN64
#include <windows.h>
#endif /* _WIN32||_WIN64 */
+#if __SUNPRO_CC
+using std::size_t;
+#endif
#ifdef RML_PURE_VIRTUAL_HANDLER
#define RML_PURE(T) {RML_PURE_VIRTUAL_HANDLER(); return (T)0;}
@@ -95,8 +98,6 @@ public:
virtual std::size_t min_stack_size() const RML_PURE(std::size_t)
//! Server calls this routine when it needs client to create a job object.
- /** Value of index is guaranteed to be unique for each job and in the half-open
- interval [0,max_job_count) */
virtual job* create_one_job() RML_PURE(job*)
//! Acknowledge that all jobs have been cleaned up.
@@ -126,19 +127,26 @@ public:
//! Typedef for convenience of derived classes.
typedef ::rml::job job;
+#if _WIN32||_WIN64
+ typedef void* execution_resource_t;
+#endif
+
//! Request that connection to server be closed.
/** Causes each job associated with the client to have its cleanup method called,
possibly by a thread different than the thread that created the job.
This method can return before all cleanup methods return.
Actions that have to wait after all cleanup methods return should be part of
- client::acknowledge_close_connection. */
- virtual void request_close_connection() = 0;
+ client::acknowledge_close_connection.
+ Pass true as exiting if request_close_connection() is called because exit() is
+ called. In that case, it is the client's responsibility to make sure all threads
+ are terminated. In all other cases, pass false. */
+ virtual void request_close_connection( bool exiting = false ) = 0;
//! Called by client thread when it reaches a point where it cannot make progress until other threads do.
virtual void yield() = 0;
//! Called by client to indicate a change in the number of non-RML threads that are running.
- /** This is a performance hint to the RML to adjust how many many threads it should let run
+ /** This is a performance hint to the RML to adjust how many threads it should let run
concurrently. The delta is the change in the number of non-RML threads that are running.
For example, a value of 1 means the client has started running another thread, and a value
of -1 indicates that the client has blocked or terminated one of its threads. */
@@ -177,8 +185,12 @@ public:
#else
void* library_handle;
#endif /* _WIN32||_WIN64 */
+
+ //! Special marker to keep dll from being unloaded prematurely
+ static const size_t c_dont_unload = 1;
};
+//! Typedef for callback functions to print server info
typedef void (*server_info_callback_t)( void* arg, const char* server_info );
} // namespace rml
diff --git a/src/rml/include/rml_omp.h b/src/rml/include/rml_omp.h
index e9e3972..8202ade 100644
--- a/src/rml/include/rml_omp.h
+++ b/src/rml/include/rml_omp.h
@@ -42,14 +42,14 @@ class omp_client;
// Classes instantiated by the server
//------------------------------------------------------------------------
-//! Represents a set of worker threads provided by the server.
+//! Represents a set of omp worker threads provided by the server.
class omp_server: public ::rml::server {
public:
- //! A number of threads
+ //! A number of coins (i.e., threads)
typedef unsigned size_type;
//! Return the number of coins in the bank. (negative if machine is oversubscribed).
- virtual int current_balance() const RML_PURE(int);
+ virtual int current_balance() const = 0;
//! Request n coins. Returns number of coins granted. Oversubscription amount if negative.
/** Always granted if is_strict is true.
@@ -57,20 +57,34 @@ public:
- Negative result indicates that no coins were taken, and that the bank has deficit
by that amount and the caller (if being a good citizen) should return that many coins.
*/
- virtual int try_increase_load( size_type /*n*/, bool /*strict*/ ) RML_PURE(size_type)
+ virtual int try_increase_load( size_type /*n*/, bool /*strict*/ ) = 0;
//! Return n coins into the bank.
- virtual void decrease_load( size_type /*n*/ ) RML_PURE(void);
+ virtual void decrease_load( size_type /*n*/ ) = 0;
//! Convert n coins into n threads.
/** When a thread returns, it is converted back into a coin and the coin is returned to the bank. */
- virtual void get_threads( size_type /*m*/, void* /*cookie*/, job* /*array*/[] ) RML_PURE(void);
+ virtual void get_threads( size_type /*m*/, void* /*cookie*/, job* /*array*/[] ) = 0;
/** Putting a thread to sleep - convert a thread into a coin
Waking up a thread - convert a coin into a thread
Note: conversion between a coin and a thread does not affect the accounting.
*/
+#if _WIN32||_WIN64
+ //! Inform server of a tbb master thread.
+ virtual void register_master( execution_resource_t& /*v*/ ) = 0;
+
+ //! Inform server that the tbb master thread is done with its work.
+ virtual void unregister_master( execution_resource_t /*v*/ ) = 0;
+
+ //! deactivate
+ /** give control to ConcRT RM */
+ virtual void deactivate( job* ) = 0;
+
+ //! reactivate
+ virtual void reactivate( job* ) = 0;
+#endif /* _WIN32||_WIN64 */
};
@@ -80,9 +94,10 @@ public:
class omp_client: public ::rml::client {
public:
- //! Called by server thread when it runs its part of a parallel region.
- /** The index argument is a 0-origin index of this thread within the array
- returned by method get_threads. Server decreases the load by 1 after this method returns. */
+ //! Called by server thread when it delivers a thread to client
+ /** The index argument is a 0-origin index of the job for this thread within the array
+ returned by method get_threads. Server decreases the load by 1 (i.e., returning the coin
+ back to the bank) after this method returns. */
virtual void process( job&, void* /*cookie*/, size_type /*index*/ ) RML_PURE(void)
};
@@ -92,7 +107,7 @@ class omp_factory: public ::rml::factory {
//! Pointer to routine that creates an RML server.
status_type (*my_make_server_routine)( omp_factory&, omp_server*&, omp_client& );
- //! Pointer to routine that returns server version info.
+ //! Pointer to routine that calls callback function with server version info.
void (*my_call_with_server_info_routine)( ::rml::server_info_callback_t cb, void* arg );
public:
diff --git a/src/rml/include/rml_tbb.h b/src/rml/include/rml_tbb.h
index 42f1719..6e9ea7e 100644
--- a/src/rml/include/rml_tbb.h
+++ b/src/rml/include/rml_tbb.h
@@ -42,10 +42,20 @@ class tbb_client;
//------------------------------------------------------------------------
// Classes instantiated by the server
//------------------------------------------------------------------------
+
+//! Represents a set of tbb worker threads provided by the server.
class tbb_server: public ::rml::server {
public:
//! Inform server of adjustments in the number of workers that the client can profitably use.
virtual void adjust_job_count_estimate( int delta ) = 0;
+
+#if _WIN32||_WIN64
+ //! Inform server of a tbb master thread.
+ virtual void register_master( execution_resource_t& v ) = 0;
+
+ //! Inform server that the tbb master thread is done with its work.
+ virtual void unregister_master( execution_resource_t v ) = 0;
+#endif /* _WIN32||_WIN64 */
};
//------------------------------------------------------------------------
@@ -55,9 +65,9 @@ public:
class tbb_client: public ::rml::client {
public:
//! Defined by TBB to steal a task and execute it.
- /** Called by server when wants an execution context to do some TBB work.
+ /** Called by server when it wants an execution context to do some TBB work.
The method should return when it is okay for the thread to yield indefinitely. */
- virtual void process( job& ) = 0;
+ virtual void process( job& ) RML_PURE(void)
};
/** Client must ensure that instance is zero-inited, typically by being a file-scope object. */
@@ -66,7 +76,7 @@ class tbb_factory: public ::rml::factory {
//! Pointer to routine that creates an RML server.
status_type (*my_make_server_routine)( tbb_factory&, tbb_server*&, tbb_client& );
- //! Pointer to routine that returns server version info.
+ //! Pointer to routine that calls callback function with server version info.
void (*my_call_with_server_info_routine)( ::rml::server_info_callback_t cb, void* arg );
public:
@@ -81,7 +91,7 @@ public:
//! Factory method to be called by client to create a server object.
/** Factory must be open.
- Returns st_success, st_connection_exists, or st_incompatible . */
+ Returns st_success, or st_incompatible . */
status_type make_server( server_type*&, client_type& );
//! Close factory
diff --git a/src/rml/server/irml.rc b/src/rml/server/irml.rc
index 60c6275..267c2f2 100644
--- a/src/rml/server/irml.rc
+++ b/src/rml/server/irml.rc
@@ -87,7 +87,7 @@ BEGIN
BLOCK "000004b0"
BEGIN
VALUE "CompanyName", "Intel Corporation\0"
- VALUE "FileDescription", "Resource manager library\0"
+ VALUE "FileDescription", "Threading Building Blocks resource manager library\0"
VALUE "FileVersion", TBB_VERSION "\0"
//what is it? VALUE "InternalName", "irml\0"
VALUE "LegalCopyright", "Copyright 2005-2010 Intel Corporation. All Rights Reserved.\0"
diff --git a/src/rml/server/job_automaton.h b/src/rml/server/job_automaton.h
index 049a4e3..514418e 100644
--- a/src/rml/server/job_automaton.h
+++ b/src/rml/server/job_automaton.h
@@ -53,8 +53,7 @@ namespace internal {
ptr|1
"owner" = corresponding server_thread.
-Odd states indicate that someone is executing code on the job.
-Furthermore, odd states!=-1 indicate that owner will read its mailbox shortly.
+Odd states (except -1) indicate that someone is executing code on the job.
Most transitions driven only by owner.
Transition 0-->-1 is driven by non-owner.
Transition ptr->-1 is driven by owner or non-owner.
@@ -106,20 +105,17 @@ public:
}
//! Transition 0-->-1
- /** If successful, return true. */
+ /** If successful, return true. called by non-owner (for TBB and the likes) */
bool try_plug_null() {
return my_job.compare_and_swap( -1, 0 )==0;
}
//! Try to transition to -1. If successful, set j to contents and return true.
- /** Called by owner or non-owner. */
+ /** Called by owner or non-owner. (for OpenMP and the likes) */
bool try_plug( rml::job*&j ) {
for(;;) {
intptr_t snapshot = my_job;
if( snapshot&1 ) {
- // server_thread that owns job is executing a mailbox item for the job,
- // and will thus read its mailbox afterwards, and see a terminate request
- // for the job.
j = NULL;
return false;
}
@@ -128,7 +124,7 @@ public:
j = reinterpret_cast<rml::job*>(snapshot);
return true;
}
- // Need to retry, because current thread may be nonowner that read a 0, and owner might have
+ // Need to retry, because current thread may be non-owner that read a 0, and owner might have
// caused transition 0->1->ptr after we took our snapshot.
}
}
diff --git a/src/rml/server/rml_server.cpp b/src/rml/server/rml_server.cpp
index 77b8ac1..decf627 100644
--- a/src/rml/server/rml_server.cpp
+++ b/src/rml/server/rml_server.cpp
@@ -35,6 +35,7 @@
#include "tbb/cache_aligned_allocator.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
+#include "tbb/spin_mutex.h"
#include "tbb/tbb_misc.h" // Get DetectNumberOfWorkers() from here.
#if _MSC_VER==1500 && !defined(__INTEL_COMPILER)
// VS2008/VC9 seems to have an issue;
@@ -45,13 +46,29 @@
#if _MSC_VER==1500 && !defined(__INTEL_COMPILER)
#pragma warning( pop )
#endif
+#if _MSC_VER && defined(_Wp64)
+// Workaround for overzealous compiler warnings
+#pragma warning (push)
+#pragma warning (disable: 4244)
+#endif
#include "job_automaton.h"
#include "wait_counter.h"
#include "thread_monitor.h"
-namespace rml {
+#if RML_USE_WCRM
+#include <concrt.h>
+#include <concrtrm.h>
+using namespace Concurrency;
+#include <vector>
+#include <hash_map>
+#define __RML_REMOVE_VIRTUAL_PROCESSORS_DISABLED 0
+#endif /* RML_USE_WCRM */
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
+namespace rml {
namespace internal {
//! Number of hardware contexts
@@ -70,16 +87,51 @@ using __kmp::rml::omp_server;
typedef versioned_object::version_type version_type;
-const version_type SERVER_VERSION = 1;
+#define SERVER_VERSION 2
+#define EARLIEST_COMPATIBLE_CLIENT_VERSION 2
static const size_t cache_line_size = tbb::internal::NFS_MaxLineSize;
template<typename Server, typename Client> class generic_connection;
-class tbb_connection_v1;
-class omp_connection_v1;
+class tbb_connection_v2;
+class omp_connection_v2;
+
+#if RML_USE_WCRM
+//! State of a server_thread
+/** Below are diagrams of legal state transitions.
+
+ ts_busy
+ ^ ^
+ / \
+ / V
+ ts_done <----- ts_asleep <------> ts_idle
+*/
+
+enum thread_state_t {
+ ts_idle,
+ ts_asleep,
+ ts_busy,
+ ts_done
+};
+
+//! Extra state of an omp server thread
+enum thread_extra_state_t {
+ ts_none,
+ ts_removed,
+ ts_lent
+};
+
+//! Results from try_grab_for()
+enum thread_grab_t {
+ wk_failed,
+ wk_from_asleep,
+ wk_from_idle
+};
+
+#else /* !RML_USE_WCRM */
//! State of a server_thread
-/** Below is a diagram of legal state transitions.
+/** Below are diagrams of legal state transitions.
OMP
ts_omp_busy
@@ -88,6 +140,13 @@ class omp_connection_v1;
/ V
ts_asleep <-----------> ts_idle
+
+ ts_deactivated
+ ^ ^
+ / \
+ V \
+ ts_none <--------------> ts_reactivated
+
TBB
ts_tbb_busy
^ ^
@@ -112,14 +171,19 @@ enum thread_state_t {
ts_done,
ts_created,
ts_started,
- ts_visited
+ ts_visited,
+ //! For omp threads only
+ ts_none,
+ ts_deactivated,
+ ts_reactivated
};
+#endif /* RML_USE_WCRM */
#if TBB_USE_ASSERT
#define PRODUCE_ARG(x) ,x
#else
#define PRODUCE_ARG(x)
-#endif
+#endif /* TBB_USE_ASSERT */
//! Synchronizes dispatch of OpenMP work.
class omp_dispatch_type {
@@ -129,12 +193,12 @@ class omp_dispatch_type {
omp_client::size_type index;
tbb::atomic<job_type*> job;
#if TBB_USE_ASSERT
- omp_connection_v1* server;
+ omp_connection_v2* server;
#endif /* TBB_USE_ASSERT */
public:
omp_dispatch_type() {job=NULL;}
void consume();
- void produce( omp_client& c, job_type& j, void* cookie_, omp_client::size_type index_ PRODUCE_ARG( omp_connection_v1& s )) {
+ void produce( omp_client& c, job_type& j, void* cookie_, omp_client::size_type index_ PRODUCE_ARG( omp_connection_v2& s )) {
__TBB_ASSERT( &j, NULL );
__TBB_ASSERT( !job, "job already set" );
client = &c;
@@ -149,9 +213,10 @@ public:
};
//! A reference count.
-/** No default constructor, because clients must be very careful about whether the
+/** No default constructor, because users of ref_count must be very careful about whether the
initial reference count is 0 or 1. */
class ref_count: no_copy {
+ friend class thread_map;
tbb::atomic<int> my_ref_count;
public:
ref_count(int k ) {my_ref_count=k;}
@@ -170,10 +235,306 @@ public:
}
};
-//! Forward declaration
-class server_thread;
+#if RML_USE_WCRM
+
+#if USE_UMS_THREAD
+#define RML_THREAD_KIND UmsThreadDefault
+#define RML_THREAD_KIND_STRING "UmsThread"
+#else
+#define RML_THREAD_KIND ThreadScheduler
+#define RML_THREAD_KIND_STRING "WinThread"
+#endif
+
+// Forward declaration
class thread_map;
+static const IExecutionResource* c_remove_prepare = (IExecutionResource*)0;
+static const IExecutionResource* c_remove_returned = (IExecutionResource*)1;
+
+//! Server thread representation
+class server_thread_rep : no_copy {
+ friend class thread_map;
+ friend class omp_connection_v2;
+ friend class server_thread;
+ friend class tbb_server_thread;
+ friend class omp_server_thread;
+ template<typename Connection> friend void make_job( Connection& c, typename Connection::server_thread_type& t );
+ typedef int thread_state_rep_t;
+public:
+ //! Ctor
+ server_thread_rep( bool assigned, IScheduler* s, IExecutionResource* r, thread_map& map, rml::client& cl ) :
+ uid( GetExecutionContextId() ), my_scheduler(s), my_proxy(NULL),
+ my_thread_map(map), my_client(cl), my_job(NULL)
+ {
+ my_state = assigned ? ts_busy : ts_idle;
+ my_extra_state = ts_none;
+ terminate = false;
+ my_execution_resource = r;
+ }
+ //! Dtor
+ ~server_thread_rep() {}
+
+ //! Synchronization routine
+ inline rml::job* wait_for_job() {
+ if( !my_job ) my_job = &my_job_automaton.wait_for_job();
+ return my_job;
+ }
+
+ // Getters and setters
+ inline thread_state_t read_state() const { thread_state_rep_t s = my_state; return static_cast<thread_state_t>(s); }
+ inline void set_state( thread_state_t to ) {my_state = to;}
+ inline void set_removed() { __TBB_ASSERT( my_extra_state==ts_none, NULL ); my_extra_state = ts_removed; }
+ inline bool is_removed() const { return my_extra_state==ts_removed; }
+ inline bool is_lent() const {return my_extra_state==ts_lent;}
+ inline void set_lent() { my_extra_state=ts_lent; }
+ inline void set_returned() { my_extra_state=ts_none; }
+ inline IExecutionResource* get_execution_resource() { return my_execution_resource; }
+ inline IVirtualProcessorRoot* get_virtual_processor() { return (IVirtualProcessorRoot*)get_execution_resource(); }
+
+ //! Enlist the thread for work
+ inline bool wakeup( thread_state_t to, thread_state_t from ) {
+ __TBB_ASSERT( from==ts_asleep && (to==ts_idle||to==ts_busy||to==ts_done), NULL );
+ return my_state.compare_and_swap( to, from )==from;
+ }
+
+ //! Enlist the thread for.
+ thread_grab_t try_grab_for();
+
+ //! Destroy the client job associated with the thread
+ template<typename Connection> bool destroy_job( Connection* c );
+
+ //! Try to re-use the thread
+ void revive( IScheduler* s, IExecutionResource* r, rml::client& c ) {
+ // the variables may not have been set before a thread was told to quit
+ __TBB_ASSERT( my_scheduler==s, "my_scheduler has been altered?\n" );
+ my_scheduler = s;
+ __TBB_ASSERT( &my_client==&c, "my_client has been altered?\n" );
+ if( r ) my_execution_resource = r;
+ my_client = c;
+ my_state = ts_idle;
+ __TBB_ASSERT( my_extra_state==ts_removed, NULL );
+ my_extra_state = ts_none;
+ }
+
+protected:
+ const int uid;
+ IScheduler* my_scheduler;
+ IThreadProxy* my_proxy;
+ tbb::atomic<IExecutionResource*> my_execution_resource; /* for non-masters, it is IVirtualProcessorRoot */
+ thread_map& my_thread_map;
+ rml::client& my_client;
+ job* my_job;
+ job_automaton my_job_automaton;
+ tbb::atomic<bool> terminate;
+ tbb::atomic<thread_state_rep_t> my_state;
+ tbb::atomic<thread_extra_state_t> my_extra_state;
+};
+
+//! Class that implements IExecutionContext
+class server_thread : public IExecutionContext, public server_thread_rep {
+ friend class tbb_connection_v2;
+ friend class omp_connection_v2;
+ friend class tbb_server_thread;
+ friend class omp_server_thread;
+ friend class thread_map;
+ template<typename Connection> friend void make_job( Connection& c, typename Connection::server_thread_type& t );
+protected:
+ server_thread( bool is_tbb, bool assigned, IScheduler* s, IExecutionResource* r, thread_map& map, rml::client& cl ) : server_thread_rep(assigned,s,r,map,cl), tbb_thread(is_tbb) {}
+ ~server_thread() {}
+ /*override*/ unsigned int GetId() const { return uid; }
+ /*override*/ IScheduler* GetScheduler() { return my_scheduler; }
+ /*override*/ IThreadProxy* GetProxy() { return my_proxy; }
+ /*override*/ void SetProxy( IThreadProxy* thr_proxy ) { my_proxy = thr_proxy; }
+
+private:
+ bool tbb_thread;
+};
+
+// Forward declaration
+class tbb_connection_v2;
+class omp_connection_v2;
+
+//! TBB server thread
+class tbb_server_thread : public server_thread {
+ friend class tbb_connection_v2;
+public:
+ tbb_server_thread( bool assigned, IScheduler* s, IExecutionResource* r, tbb_connection_v2* con, thread_map& map, rml::client& cl ) : server_thread(true,assigned,s,r,map,cl), my_conn(con) {
+ activation_count = 0;
+ }
+ ~tbb_server_thread() {}
+ /*override*/ void Dispatch( DispatchState* );
+ inline bool initiate_termination();
+ bool sleep_perhaps();
+ //! Switch out this thread
+ bool switch_out();
+private:
+ tbb_connection_v2* my_conn;
+public:
+ tbb::atomic<int> activation_count;
+};
+
+//! OMP server thread
+class omp_server_thread : public server_thread {
+ friend class omp_connection_v2;
+public:
+ omp_server_thread( bool assigned, IScheduler* s, IExecutionResource* r, omp_connection_v2* con, thread_map& map, rml::client& cl ) :
+ server_thread(false,assigned,s,r,map,cl), my_conn(con), my_cookie(NULL), my_index(UINT_MAX) {}
+ ~omp_server_thread() {}
+ /*override*/ void Dispatch( DispatchState* );
+ inline void* get_cookie() {return my_cookie;}
+ inline ::__kmp::rml::omp_client::size_type get_index() {return my_index;}
+
+ inline IExecutionResource* get_execution_resource() { return get_execution_resource(); }
+ inline bool initiate_termination() { return destroy_job( (omp_connection_v2*) my_conn ); }
+ void sleep_perhaps();
+private:
+ omp_connection_v2* my_conn;
+ void* my_cookie;
+ ::__kmp::rml::omp_client::size_type my_index;
+ omp_dispatch_type omp_data;
+};
+
+//! Class that implements IScheduler
+template<typename Connection>
+class scheduler : no_copy, public IScheduler {
+public:
+ /*override*/ unsigned int GetId() const {return uid;}
+ /*override*/ void Statistics( unsigned int* /*pTaskCompletionRate*/, unsigned int* /*pTaskArrivalRate*/, unsigned int* /*pNumberOfTaskEnqueued*/) {}
+ /*override*/ SchedulerPolicy GetPolicy() const { __TBB_ASSERT(my_policy,NULL); return *my_policy; }
+ /*override*/ void AddVirtualProcessors( IVirtualProcessorRoot** vproots, unsigned int count ) { if( !my_conn.is_closing() ) my_conn.add_virtual_processors( vproots, count); }
+ /*override*/ void RemoveVirtualProcessors( IVirtualProcessorRoot** vproots, unsigned int count );
+ /*override*/ void NotifyResourcesExternallyIdle( IVirtualProcessorRoot** vproots, unsigned int count ) { __TBB_ASSERT( false, "This call is not allowed for TBB" ); }
+ /*override*/ void NotifyResourcesExternallyBusy( IVirtualProcessorRoot** vproots, unsigned int count ) { __TBB_ASSERT( false, "This call is not allowed for TBB" ); }
+protected:
+ scheduler( Connection& conn );
+ virtual ~scheduler() { __TBB_ASSERT( my_policy, NULL ); delete my_policy; }
+
+public:
+ static scheduler* create( Connection& conn ) {return new scheduler( conn );}
+
+private:
+ const int uid;
+ Connection& my_conn;
+ SchedulerPolicy* my_policy;
+};
+
+
+/*
+ * --> ts_busy --> ts_done
+ */
+class thread_scavenger_thread : public IExecutionContext, no_copy {
+public:
+ thread_scavenger_thread( IScheduler* s, IVirtualProcessorRoot* r, thread_map& map ) :
+ uid( GetExecutionContextId() ), my_scheduler(s), my_virtual_processor_root(r), my_proxy(NULL), my_thread_map(map)
+ {
+ my_state = ts_busy;
+#if TBB_USE_ASSERT
+ activation_count = 0;
+#endif
+ }
+ ~thread_scavenger_thread() {}
+ /*override*/ unsigned int GetId() const { return uid; }
+ /*override*/ IScheduler* GetScheduler() { return my_scheduler; }
+ /*override*/ IThreadProxy* GetProxy() { return my_proxy; }
+ /*override*/ void SetProxy( IThreadProxy* thr_proxy ) { my_proxy = thr_proxy; }
+ /*override*/ void Dispatch( DispatchState* );
+ inline thread_state_t read_state() { return my_state; }
+ inline void set_state( thread_state_t s ) { my_state = s; }
+ inline IVirtualProcessorRoot* get_virtual_processor() { return my_virtual_processor_root; }
+private:
+ const int uid;
+ IScheduler* my_scheduler;
+ IVirtualProcessorRoot* my_virtual_processor_root;
+ IThreadProxy* my_proxy;
+ thread_map& my_thread_map;
+ tbb::atomic<thread_state_t> my_state;
+#if TBB_USE_ASSERT
+public:
+ tbb::atomic<int> activation_count;
+#endif
+};
+
+static const thread_scavenger_thread* c_claimed = reinterpret_cast<thread_scavenger_thread*>(1);
+
+struct garbage_connection_queue {
+ tbb::atomic<uintptr_t> head;
+ tbb::atomic<uintptr_t> tail;
+ static const uintptr_t empty = 0; // connection scavenger thread empty list
+ static const uintptr_t plugged = 1; // end of use of the list
+ static const uintptr_t plugged_acked = 2; // connection scavenger saw the plugged flag, and it freed all connections
+};
+
+//! Connection scavenger
+/** It collects closed connection objects, wait for worker threads belonging to the connection to return to ConcRT RM
+ * then return the object to the memory manager.
+ */
+class connection_scavenger_thread {
+ friend void assist_cleanup_connections();
+ /*
+ * connection_scavenger_thread's state
+ * ts_busy <----> ts_asleep <--
+ */
+ tbb::atomic<thread_state_t> state;
+
+ /* We steal two bits from a connection pointer to encode
+ * whether the connection is for TBB or for OMP.
+ *
+ * ----------------------------------
+ * | | | |
+ * ----------------------------------
+ * ^ ^
+ * / |
+ * 1 : tbb, 0 : omp |
+ * if set, terminate
+ */
+ // FIXME: pad these?
+ thread_monitor monitor;
+ int default_concurrency;
+ HANDLE thr_handle;
+#if TBB_USE_ASSERT
+ tbb::atomic<int> n_scavenger_threads;
+#endif
+
+public:
+ connection_scavenger_thread() : thr_handle(NULL) {
+ state = ts_asleep;
+#if TBB_USE_ASSERT
+ n_scavenger_threads = 0;
+#endif
+ }
+
+ ~connection_scavenger_thread() {}
+
+ void wakeup() {
+ if( state.compare_and_swap( ts_busy, ts_asleep )==ts_asleep )
+ monitor.notify();
+ }
+
+ void sleep_perhaps();
+
+ void process_requests( uintptr_t conn_ex );
+
+ static __RML_DECL_THREAD_ROUTINE thread_routine( void* arg );
+
+ void launch( int dc ) {
+ default_concurrency = dc;
+ thread_monitor::launch( connection_scavenger_thread::thread_routine, this, NULL );
+ }
+
+ template<typename Server, typename Client>
+ void add_request( generic_connection<Server,Client>* conn_to_close );
+
+ template<typename Server, typename Client>
+ uintptr_t grab_and_prepend( generic_connection<Server,Client>* last_conn_to_close );
+};
+
+void free_all_connections( uintptr_t );
+
+#endif /* RML_USE_WCRM */
+
+#if !RML_USE_WCRM
+class server_thread;
+
//! thread_map_base; we need to make the iterator type available to server_thread
struct thread_map_base {
//! A value in the map
@@ -210,43 +571,57 @@ struct thread_map_base {
the job held by job_automaton. */
mutable rml::job* my_job;
job_automaton my_automaton;
-// FIXME - pad out to cache line, because my_automaton is hit hard by thread()
+ // FIXME - pad out to cache line, because my_automaton is hit hard by thread()
friend class thread_map;
};
typedef tbb::concurrent_vector<value_type,tbb::zero_allocator<value_type,tbb::cache_aligned_allocator> > array_type;
};
+#endif /* !RML_USE_WCRM */
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ // Suppress overzealous compiler warnings about uninstantiatble class
+ #pragma warning(push)
+ #pragma warning(disable:4510 4610)
+#endif
template<typename T>
class padded: public T {
char pad[cache_line_size - sizeof(T)%cache_line_size];
};
-// FIXME - should we pad out memory to avoid false sharing of our global variables?
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ #pragma warning(pop)
+#endif
+// FIXME - should we pad out memory to avoid false sharing of our global variables?
static tbb::atomic<int> the_balance;
static tbb::atomic<int> the_balance_inited;
+#if !RML_USE_WCRM
//! Per thread information
/** ref_count holds number of clients that are using this,
plus 1 if a host thread owns this instance. */
class server_thread: public ref_count {
friend class thread_map;
template<typename Server, typename Client> friend class generic_connection;
+ friend class tbb_connection_v2;
+ friend class omp_connection_v2;
//! Integral type that can hold a thread_state_t
typedef int thread_state_rep_t;
tbb::atomic<thread_state_rep_t> state;
public:
thread_monitor monitor;
- // FIXME: make them private...
+private:
bool is_omp_thread;
- tbb::atomic<thread_state_rep_t> tbb_state;
- server_thread* link; // FIXME: this is a temporary fix. Remove when all is done.
+ tbb::atomic<thread_state_rep_t> my_extra_state;
+ server_thread* link;
thread_map_base::array_type::iterator my_map_pos;
-private:
rml::server *my_conn;
rml::job* my_job;
job_automaton* my_ja;
size_t my_index;
+ tbb::atomic<bool> terminate;
+ omp_dispatch_type omp_dispatch;
#if TBB_USE_ASSERT
//! Flag used to check if thread is still using *this.
@@ -261,25 +636,30 @@ private:
template<typename Connection>
bool destroy_job( Connection& c );
- //! do terminate the thread
+ //! Do terminate the thread
/** Return true if thread must quit. */
bool do_termination();
void loop();
static __RML_DECL_THREAD_ROUTINE thread_routine( void* arg );
+
public:
+ server_thread();
+
+ ~server_thread();
+
+ //! Read the thread state
thread_state_t read_state() const {
thread_state_rep_t s = state;
__TBB_ASSERT( unsigned(s)<=unsigned(ts_done), "corrupted server thread?" );
return thread_state_t(s);
}
- tbb::atomic<bool> terminate;
-
- omp_dispatch_type omp_dispatch;
-
- server_thread();
- ~server_thread();
+ //! Read the tbb-specific extra thread state
+ thread_state_t read_extra_state() const {
+ thread_state_rep_t s = my_extra_state;
+ return thread_state_t(s);
+ }
//! Launch a thread that is bound to *this.
void launch( size_t stack_size );
@@ -290,7 +670,16 @@ public:
bool wakeup( thread_state_t to, thread_state_t from );
//! Attempt to enslave a thread for OpenMP/TBB.
+ /** Returns true if state is successfully changed. 's' takes either ts_omp_busy or ts_tbb_busy */
bool try_grab_for( thread_state_t s );
+
+#if _WIN32||_WIN64
+ //! Send the worker thread to sleep temporarily
+ void deactivate();
+
+ //! Wake the worker thread up
+ void reactivate();
+#endif /* _WIN32||_WIN64 */
};
//! Bag of threads that are private to a client.
@@ -332,10 +721,11 @@ public:
}
};
+
//! Forward declaration
void wakeup_some_tbb_threads();
-//! Type-independent part of class generic_connection. *
+//! Type-independent part of class generic_connection.
/** One to one map from server threads to jobs, and associated reference counting. */
class thread_map : public thread_map_base {
public:
@@ -356,7 +746,7 @@ public:
/** Returns number of unrealized threads to create. */
size_type wakeup_tbb_threads( size_type n );
- bool wakeup_next_thread( iterator i, tbb_connection_v1& conn );
+ bool wakeup_next_thread( iterator i, tbb_connection_v2& conn );
void release_tbb_threads( server_thread* t );
void adjust_balance( int delta );
@@ -388,6 +778,7 @@ private:
//! Number of jobs that need cleanup, plus one extra.
/** When it becomes zero, acknowledge_close_connection is called. */
ref_count my_client_ref_count;
+
::rml::client& my_client;
//! Counter owned by factory that produced this thread_map.
wait_counter& my_factory_counter;
@@ -407,8 +798,8 @@ void thread_map::bind_one_thread( rml::server& server, value_type& x ) {
t.my_conn = &server;
t.my_ja = &x.my_automaton;
t.launch( my_min_stack_size );
- // Must wakeup thread so it can fill in its "my_job" field in *this.
- // Otherwise deadlock can occur where wait_for_job spins on thread that is sleeping.
+ /* Must wake thread up so it can fill in its "my_job" field in *this.
+ Otherwise deadlock can occur where wait_for_job spins on thread that is sleeping. */
__TBB_ASSERT( t.state!=ts_tbb_busy, NULL );
t.wakeup( ts_idle, ts_asleep );
}
@@ -424,15 +815,15 @@ thread_map::value_type* thread_map::add_one_thread( bool is_omp_thread_ ) {
__TBB_ASSERT( u>=1, NULL );
t.my_index = u - 1;
__TBB_ASSERT( t.state!=ts_tbb_busy, NULL );
- if( !t.is_omp_thread )
- t.tbb_state = ts_created;
+ t.my_extra_state = t.is_omp_thread ? ts_none : ts_created;
+
iterator i = t.my_map_pos = my_array.grow_by(1);
value_type& v = *i;
v.my_thread = &t;
return &v;
}
-void thread_map::bind() {
+void thread_map::bind() {
++my_factory_counter;
my_min_stack_size = my_client.min_stack_size();
__TBB_ASSERT( my_unrealized_threads==0, "already called bind?" );
@@ -443,7 +834,6 @@ void thread_map::unbind() {
// Ask each server_thread to cleanup its job for this server.
for( iterator i=begin(); i!=end(); ++i ) {
server_thread& t = i->thread();
- // The last parameter of the message is not used by the recipient.
t.terminate = true;
t.wakeup( ts_idle, ts_asleep );
}
@@ -474,11 +864,13 @@ thread_map::size_type thread_map::wakeup_tbb_threads( size_type n ) {
for( iterator k=begin(); k!=e; ++k ) {
// If another thread added *k, there is a tiny timing window where thread() is invalid.
server_thread& t = k->wait_for_thread();
- if( t.tbb_state==ts_created || t.read_state()==ts_tbb_busy )
+ thread_state_t thr_s = t.read_state();
+ if( t.read_extra_state()==ts_created || thr_s==ts_tbb_busy || thr_s==ts_done )
continue;
if( --the_balance>=0 ) { // try to withdraw a coin from the deposit
while( !t.try_grab_for( ts_tbb_busy ) ) {
- if( t.read_state()==ts_tbb_busy ) {
+ thr_s = t.read_state();
+ if( thr_s==ts_tbb_busy || thr_s==ts_done ) {
// we lost; move on to the next.
++the_balance;
goto skip;
@@ -496,16 +888,137 @@ skip:
}
return n<my_unrealized_threads ? n : my_unrealized_threads;
}
+#else /* RML_USE_WCRM */
-void thread_map::remove_client_ref() {
- int k = my_client_ref_count.remove_ref();
- if( k==0 ) {
- // Notify factory that thread has crossed back into RML.
- --my_factory_counter;
- // Notify client that RML is done with the client object.
- my_client.acknowledge_close_connection();
- }
-}
+class thread_map : no_copy {
+ friend class omp_connection_v2;
+ typedef ::std::hash_map<uintptr_t,server_thread*> hash_map_type;
+ size_t my_min_stack_size;
+ size_t my_unrealized_threads;
+ ::rml::client& my_client;
+ //! Counter owned by factory that produced this thread_map.
+ wait_counter& my_factory_counter;
+ //! Ref counters
+ ref_count my_server_ref_count;
+ ref_count my_client_ref_count;
+ // FIXME: pad this?
+ hash_map_type my_map;
+ bool shutdown_in_progress;
+ std::vector<IExecutionResource*> original_exec_resources;
+ tbb::cache_aligned_allocator<padded<tbb_server_thread> > my_tbb_allocator;
+ tbb::cache_aligned_allocator<padded<omp_server_thread> > my_omp_allocator;
+ tbb::cache_aligned_allocator<padded<thread_scavenger_thread> > my_scavenger_allocator;
+ IResourceManager* my_concrt_resource_manager;
+ IScheduler* my_scheduler;
+ ISchedulerProxy* my_scheduler_proxy;
+ tbb::atomic<thread_scavenger_thread*> my_thread_scavenger_thread;
+#if TBB_USE_ASSERT
+ tbb::atomic<int> n_add_vp_requests;
+ tbb::atomic<int> n_thread_scavengers_created;
+#endif
+public:
+ thread_map( wait_counter& fc, ::rml::client& client ) :
+ my_min_stack_size(0), my_client(client), my_factory_counter(fc),
+ my_server_ref_count(1), my_client_ref_count(1), shutdown_in_progress(false),
+ my_concrt_resource_manager(NULL), my_scheduler(NULL), my_scheduler_proxy(NULL)
+ {
+ my_thread_scavenger_thread = NULL;
+#if TBB_USE_ASSERT
+ n_add_vp_requests = 0;
+ n_thread_scavengers_created;
+#endif
+ }
+
+ ~thread_map() {
+ __TBB_ASSERT( n_thread_scavengers_created<=1, "too many scavenger thread created" );
+ // if thread_scavenger_thread is launched, wait for it to complete
+ if( my_thread_scavenger_thread ) {
+ __TBB_ASSERT( my_thread_scavenger_thread!=c_claimed, NULL );
+ while( my_thread_scavenger_thread->read_state()==ts_busy )
+ __TBB_Yield();
+ thread_scavenger_thread* tst = my_thread_scavenger_thread;
+ my_scavenger_allocator.deallocate(static_cast<padded<thread_scavenger_thread>*>(tst),1);
+ }
+ // deallocate thread contexts
+ for( hash_map_type::const_iterator hi=my_map.begin(); hi!=my_map.end(); ++hi ) {
+ server_thread* thr = hi->second;
+ if( thr->tbb_thread ) {
+ while( ((tbb_server_thread*)thr)->activation_count>1 )
+ __TBB_Yield();
+ ((tbb_server_thread*)thr)->~tbb_server_thread();
+ my_tbb_allocator.deallocate(static_cast<padded<tbb_server_thread>*>(thr),1);
+ } else {
+ ((omp_server_thread*)thr)->~omp_server_thread();
+ my_omp_allocator.deallocate(static_cast<padded<omp_server_thread>*>(thr),1);
+ }
+ }
+ if( my_scheduler_proxy ) {
+ my_scheduler_proxy->Shutdown();
+ my_concrt_resource_manager->Release();
+ __TBB_ASSERT( my_scheduler, NULL );
+ delete my_scheduler;
+ } else {
+ __TBB_ASSERT( !my_scheduler, NULL );
+ }
+ }
+ typedef hash_map_type::key_type key_type;
+ typedef hash_map_type::value_type value_type;
+ typedef hash_map_type::iterator iterator;
+ iterator begin() {return my_map.begin();}
+ iterator end() {return my_map.end();}
+ iterator find( key_type k ) {return my_map.find( k );}
+ iterator insert( key_type k, server_thread* v ) {
+ std::pair<iterator,bool> res = my_map.insert( value_type(k,v) );
+ return res.first;
+ }
+ void bind( IScheduler* s ) {
+ ++my_factory_counter;
+ if( s ) {
+ my_unrealized_threads = s->GetPolicy().GetPolicyValue( MaxConcurrency );
+ __TBB_ASSERT( my_unrealized_threads>0, NULL );
+ my_scheduler = s;
+ my_concrt_resource_manager = CreateResourceManager(); // reference count==3 when first created.
+ my_scheduler_proxy = my_concrt_resource_manager->RegisterScheduler( s, CONCRT_RM_VERSION_1 );
+ my_scheduler_proxy->RequestInitialVirtualProcessors( false );
+ }
+ }
+ bool is_closing() { return shutdown_in_progress; }
+ void unbind( rml::server& server, ::tbb::spin_mutex& mtx );
+ void add_client_ref() { my_server_ref_count.add_ref(); }
+ void remove_client_ref();
+ void add_server_ref() {my_server_ref_count.add_ref();}
+ int remove_server_ref() {return my_server_ref_count.remove_ref();}
+ int get_server_ref_count() { int k = my_server_ref_count.my_ref_count; return k; }
+ void assist_cleanup( bool assist_null_only );
+ void adjust_balance( int delta );
+ int current_balance() const {int k = the_balance; return k;}
+ ::rml::client& client() const {return my_client;}
+ void register_as_master( server::execution_resource_t& v ) const { (IExecutionResource*&)v = my_scheduler_proxy ? my_scheduler_proxy->SubscribeCurrentThread() : NULL; }
+ // Rremove() should be called from the same thread that subscribed the current h/w thread (i.e., the one that
+ // called register_as_master() ).
+ void unregister( server::execution_resource_t v ) const {if( v ) ((IExecutionResource*)v)->Remove( my_scheduler );}
+ void add_virtual_processors( IVirtualProcessorRoot** vprocs, unsigned int count, tbb_connection_v2& conn, ::tbb::spin_mutex& mtx );
+ void add_virtual_processors( IVirtualProcessorRoot** vprocs, unsigned int count, omp_connection_v2& conn, ::tbb::spin_mutex& mtx );
+ void remove_virtual_processors( IVirtualProcessorRoot** vproots, unsigned count, ::tbb::spin_mutex& mtx );
+ void mark_virtual_processors_as_lent( IVirtualProcessorRoot** vproots, unsigned count, ::tbb::spin_mutex& mtx );
+ void create_oversubscribers( unsigned n, std::vector<server_thread*>& thr_vec, omp_connection_v2& conn, ::tbb::spin_mutex& mtx );
+ void wakeup_tbb_threads( int c, ::tbb::spin_mutex& mtx );
+ void mark_virtual_processors_as_returned( IVirtualProcessorRoot** vprocs, unsigned int count, tbb::spin_mutex& mtx );
+ inline void addto_original_exec_resources( IExecutionResource* r, ::tbb::spin_mutex& mtx ) {
+ ::tbb::spin_mutex::scoped_lock lck(mtx);
+ __TBB_ASSERT( !is_closing(), "try to regster master while connection is being shutdown?" );
+ original_exec_resources.push_back( r );
+ }
+#if !__RML_REMOVE_VIRTUAL_PROCESSORS_DISABLED
+ void allocate_thread_scavenger( IExecutionResource* v );
+#endif
+ inline thread_scavenger_thread* get_thread_scavenger() { return my_thread_scavenger_thread; }
+};
+
+garbage_connection_queue connections_to_reclaim;
+connection_scavenger_thread connection_scavenger;
+
+#endif /* !RML_USE_WCRM */
//------------------------------------------------------------------------
// generic_connection
@@ -514,29 +1027,80 @@ void thread_map::remove_client_ref() {
template<typename Server, typename Client>
struct connection_traits {};
-static tbb::atomic<tbb_connection_v1*> this_tbb_connection;
+// head of the active tbb connections
+static tbb::atomic<uintptr_t> active_tbb_connections;
+static tbb::atomic<int> current_tbb_conn_readers;
+static size_t current_tbb_conn_reader_epoch;
+static tbb::atomic<size_t> close_tbb_connection_event_count;
+
+#if RML_USE_WCRM
+template<typename Connection>
+void make_job( Connection& c, server_thread& t );
+#endif
template<typename Server, typename Client>
class generic_connection: public Server, no_copy {
/*override*/ version_type version() const {return SERVER_VERSION;}
/*override*/ void yield() {thread_monitor::yield();}
- /*override*/ void independent_thread_number_changed( int delta ) {my_thread_map.adjust_balance( -delta );}
+ /*override*/ void independent_thread_number_changed( int delta ) { my_thread_map.adjust_balance( -delta ); }
/*override*/ unsigned default_concurrency() const {return hardware_concurrency()-1;}
+ friend void wakeup_some_tbb_threads();
+ friend class connection_scavenger_thread;
protected:
thread_map my_thread_map;
+ generic_connection* next_conn;
+ size_t my_ec;
+#if RML_USE_WCRM
+ // FIXME: pad it?
+ tbb::spin_mutex map_mtx;
+ IScheduler* my_scheduler;
+ void do_open( IScheduler* s ) {
+ my_scheduler = s;
+ my_thread_map.bind( s );
+ }
+ bool is_closing() { return my_thread_map.is_closing(); }
+ void request_close_connection( bool existing );
+#else
void do_open() {my_thread_map.bind();}
- void request_close_connection();
+ void request_close_connection( bool );
+#endif /* RML_USE_WCRM */
//! Make destructor virtual
virtual ~generic_connection() {}
- generic_connection( wait_counter& fc, Client& c ) : my_thread_map(fc,c) {}
+#if !RML_USE_WCRM
+ generic_connection( wait_counter& fc, Client& c ) : my_thread_map(fc,c), next_conn(NULL), my_ec(0) {}
+#else
+ generic_connection( wait_counter& fc, Client& c ) :
+ my_thread_map(fc,c), next_conn(NULL), my_ec(0), map_mtx(), my_scheduler(NULL) {}
+ void add_virtual_processors( IVirtualProcessorRoot** vprocs, unsigned int count );
+ void remove_virtual_processors( IVirtualProcessorRoot** vprocs, unsigned int count );
+ void notify_resources_externally_busy( IVirtualProcessorRoot** vprocs, unsigned int count ) { my_thread_map.mark_virtual_processors_as_lent( vprocs, count, map_mtx ); }
+ void notify_resources_externally_idle( IVirtualProcessorRoot** vprocs, unsigned int count ) {
+ my_thread_map.mark_virtual_processors_as_returned( vprocs, count, map_mtx );
+ }
+#endif /* !RML_USE_WCRM */
public:
+ typedef Server server_type;
+ typedef Client client_type;
Client& client() const {return static_cast<Client&>(my_thread_map.client());}
- int add_server_ref () {return my_thread_map.add_server_ref();}
+ void set_scratch_ptr( job& j, void* ptr ) { ::rml::server::scratch_ptr(j) = ptr; }
+#if RML_USE_WCRM
+ template<typename Connection>
+ friend void make_job( Connection& c, server_thread& t );
+ void add_server_ref () {my_thread_map.add_server_ref();}
+ void remove_server_ref() {if( my_thread_map.remove_server_ref()==0 ) delete this;}
+ void add_client_ref () {my_thread_map.add_client_ref();}
+ void remove_client_ref() {my_thread_map.remove_client_ref();}
+#else /* !RML_USE_WCRM */
+ int add_server_ref () {return my_thread_map.add_server_ref();}
void remove_server_ref() {if( my_thread_map.remove_server_ref()==0 ) delete this;}
void remove_client_ref() {my_thread_map.remove_client_ref();}
void make_job( server_thread& t, job_automaton& ja );
+#endif /* RML_USE_WCRM */
+ static generic_connection* get_addr( uintptr_t addr_ex ) {
+ return reinterpret_cast<generic_connection*>( addr_ex&~(uintptr_t)3 );
+ }
};
//------------------------------------------------------------------------
@@ -549,11 +1113,38 @@ struct connection_traits<tbb_server,tbb_client> {
static const bool is_tbb = true;
};
-//! Represents a server and client binding.
+//! Represents a server/client binding.
/** The internal representation uses inheritance for the server part and a pointer for the client part. */
-class tbb_connection_v1: public generic_connection<tbb_server,tbb_client> {
- friend void wakeup_some_tbb_threads();
+class tbb_connection_v2: public generic_connection<tbb_server,tbb_client> {
/*override*/ void adjust_job_count_estimate( int delta );
+#if !RML_USE_WCRM
+#if _WIN32||_WIN64
+ /*override*/ void register_master ( rml::server::execution_resource_t& /*v*/ ) {}
+ /*override*/ void unregister_master ( rml::server::execution_resource_t /*v*/ ) {}
+#endif
+#else
+ /*override*/ void register_master ( rml::server::execution_resource_t& v ) {
+ my_thread_map.register_as_master(v);
+ if( v ) ++nesting;
+ }
+ /*override*/ void unregister_master ( rml::server::execution_resource_t v ) {
+ if( v ) {
+ __TBB_ASSERT( nesting>0, NULL );
+ if( --nesting==0 ) {
+#if !__RML_REMOVE_VIRTUAL_PROCESSORS_DISABLED
+ my_thread_map.allocate_thread_scavenger( (IExecutionResource*)v );
+#endif
+ }
+ }
+ my_thread_map.unregister(v);
+ }
+ IScheduler* create_scheduler() {return( scheduler<tbb_connection_v2>::create( *this ) );}
+ friend void free_all_connections( uintptr_t );
+ friend class scheduler<tbb_connection_v2>;
+ friend class execution_context;
+ friend class connection_scavenger_thread;
+#endif /* RML_USE_WCRM */
+ friend void wakeup_some_tbb_threads();
//! Estimate on number of jobs without threads working on them.
tbb::atomic<int> my_slack;
friend class dummy_class_to_shut_up_gratuitous_warning_from_gcc_3_2_3;
@@ -561,26 +1152,34 @@ class tbb_connection_v1: public generic_connection<tbb_server,tbb_client> {
tbb::atomic<int> my_job_count_estimate;
#endif /* TBB_USE_ASSERT */
- // pad these? or use a single variable w/ atomic add/subtract?
tbb::atomic<int> n_adjust_job_count_requests;
- ~tbb_connection_v1();
+#if RML_USE_WCRM
+ tbb::atomic<int> nesting;
+#endif
-public:
- enum tbb_conn_t {
- c_empty = 0,
- c_init = -1,
- c_locked = -2
- };
+ // dtor
+ ~tbb_connection_v2();
+public:
+#if RML_USE_WCRM
+ typedef tbb_server_thread server_thread_type;
+#endif
//! True if there is slack that try_process can use.
bool has_slack() const {return my_slack>0;}
- bool try_process( server_thread& t, job& job ) {
+#if RML_USE_WCRM
+ bool try_process( job& job )
+#else
+ bool try_process( server_thread& t, job& job )
+#endif
+ {
bool visited = false;
// No check for my_slack>0 here because caller is expected to do that check.
int k = --my_slack;
if( k>=0 ) {
- t.tbb_state = ts_visited; // remember the thread paid a trip to process() at least once
+#if !RML_USE_WCRM
+ t.my_extra_state = ts_visited; // remember the thread paid a trip to process() at least once
+#endif
client().process(job);
visited = true;
}
@@ -588,76 +1187,53 @@ public:
return visited;
}
- tbb_connection_v1( wait_counter& fc, tbb_client& client ) : generic_connection<tbb_server,tbb_client>(fc,client) {
+ tbb_connection_v2( wait_counter& fc, tbb_client& client ) : generic_connection<tbb_server,tbb_client>(fc,client)
+ {
my_slack = 0;
+#if RML_USE_WCRM
+ nesting = 0;
+#endif
#if TBB_USE_ASSERT
my_job_count_estimate = 0;
#endif /* TBB_USE_ASSERT */
__TBB_ASSERT( !my_slack, NULL );
+
+#if RML_USE_WCRM
+ do_open( client.max_job_count()>0 ? create_scheduler() : NULL );
+#else
do_open();
- __TBB_ASSERT( this_tbb_connection==reinterpret_cast<tbb_connection_v1*>(tbb_connection_v1::c_init), NULL );
+#endif /* !RML_USE_WCRM */
n_adjust_job_count_requests = 0;
- this_tbb_connection = this;
- }
- void wakeup_tbb_threads( unsigned n ) {my_thread_map.wakeup_tbb_threads( n );}
- bool wakeup_next_thread( thread_map::iterator i ) {return my_thread_map.wakeup_next_thread( i, *this );}
- thread_map::size_type get_unrealized_threads () {return my_thread_map.get_unrealized_threads();}
-};
-
-/* to deal with cases where the machine is oversubscribed; we want each thread to trip to try_process() at least once */
-/* this should not involve computing the_balance */
-bool thread_map::wakeup_next_thread( thread_map::iterator this_thr, tbb_connection_v1& conn ) {
- if( all_visited_at_least_once )
- return false;
+ // Acquire head of active_tbb_connections & push the connection into the list
+ uintptr_t conn;
+ do {
+ for( ; (conn=active_tbb_connections)&1; )
+ __TBB_Yield();
+ } while( active_tbb_connections.compare_and_swap( conn|1, conn )!=conn );
- iterator e = end();
-retry:
- bool exist = false;
- iterator k=this_thr;
- for( ++k; k!=e; ++k ) {
- // If another thread added *k, there is a tiny timing window where thread() is invalid.
- server_thread& t = k->wait_for_thread();
- if( t.tbb_state!=ts_visited )
- exist = true;
- if( t.read_state()!=ts_tbb_busy && t.tbb_state==ts_started )
- if( t.try_grab_for( ts_tbb_busy ) )
- return true;
+ this->next_conn = generic_connection<tbb_server,tbb_client>::get_addr(conn);
+ // Update and release head of active_tbb_connections
+ active_tbb_connections = (uintptr_t) this; // set and release
}
- for( k=begin(); k!=this_thr; ++k ) {
- server_thread& t = k->wait_for_thread();
- if( t.tbb_state!=ts_visited )
- exist = true;
- if( t.read_state()!=ts_tbb_busy && t.tbb_state==ts_started )
- if( t.try_grab_for( ts_tbb_busy ) )
- return true;
+ inline void wakeup_tbb_threads( unsigned n ) {
+ my_thread_map.wakeup_tbb_threads( n
+#if RML_USE_WCRM
+ , map_mtx
+#endif
+ );
}
+#if RML_USE_WCRM
+ inline int get_nesting_level() { return nesting; }
+#else
+ inline bool wakeup_next_thread( thread_map::iterator i ) {return my_thread_map.wakeup_next_thread( i, *this );}
+ inline thread_map::size_type get_unrealized_threads () {return my_thread_map.get_unrealized_threads();}
+#endif /* !RML_USE_WCRM */
+};
- if( exist )
- if( conn.has_slack() )
- goto retry;
- else
- all_visited_at_least_once = true;
- return false;
-}
-
-void thread_map::release_tbb_threads( server_thread* t ) {
- for( ; t; t = t->link ) {
- while( t->read_state()!=ts_asleep )
- __TBB_Yield();
- t->tbb_state = ts_started;
- }
-}
-
-void thread_map::adjust_balance( int delta ) {
- int new_balance = the_balance += delta;
- if( new_balance>0 && 0>=new_balance-delta /*== old the_balance*/ )
- wakeup_some_tbb_threads();
-}
-
-//------------------------------------------------------------------------
-// OpenMP server
-//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+// OpenMP server
+//------------------------------------------------------------------------
template<>
struct connection_traits<omp_server,omp_client> {
@@ -665,11 +1241,39 @@ struct connection_traits<omp_server,omp_client> {
static const bool is_tbb = false;
};
-class omp_connection_v1: public generic_connection<omp_server,omp_client> {
- /*override*/ int current_balance() const {return the_balance;}
- /*override*/ int try_increase_load( size_type n, bool strict );
- /*override*/ void decrease_load( size_type n );
+class omp_connection_v2: public generic_connection<omp_server,omp_client> {
+#if !RML_USE_WCRM
+ /*override*/ int current_balance() const {return the_balance;}
+#else
+ friend void free_all_connections( uintptr_t );
+ friend class scheduler<omp_connection_v2>;
+ /*override*/ int current_balance() const {return my_thread_map.current_balance();}
+#endif /* !RML_USE_WCRM */
+ /*override*/ int try_increase_load( size_type n, bool strict );
+ /*override*/ void decrease_load( size_type n );
/*override*/ void get_threads( size_type request_size, void* cookie, job* array[] );
+#if !RML_USE_WCRM
+#if _WIN32||_WIN64
+ /*override*/ void register_master ( rml::server::execution_resource_t& /*v*/ ) {}
+ /*override*/ void unregister_master ( rml::server::execution_resource_t /*v*/ ) {}
+#endif
+#else
+ /*override*/ void register_master ( rml::server::execution_resource_t& v ) {
+ my_thread_map.register_as_master( v );
+ my_thread_map.addto_original_exec_resources( (IExecutionResource*)v, map_mtx );
+ }
+ /*override*/ void unregister_master ( rml::server::execution_resource_t v ) { my_thread_map.unregister(v); }
+#endif /* !RML_USE_WCRM */
+#if _WIN32||_WIN64
+ /*override*/ void deactivate( rml::job* j );
+ /*override*/ void reactivate( rml::job* j );
+#endif /* _WIN32||_WIN64 */
+#if RML_USE_WCRM
+public:
+ typedef omp_server_thread server_thread_type;
+private:
+ IScheduler* create_scheduler() {return( scheduler<omp_connection_v2>::create( *this ) );}
+#endif /* RML_USE_WCRM */
public:
#if TBB_USE_ASSERT
//! Net change in delta caused by this connection.
@@ -677,65 +1281,248 @@ public:
tbb::atomic<int> net_delta;
#endif /* TBB_USE_ASSERT */
- omp_connection_v1( wait_counter& fc, omp_client& client ) : generic_connection<omp_server,omp_client>(fc,client) {
+ omp_connection_v2( wait_counter& fc, omp_client& client ) : generic_connection<omp_server,omp_client>(fc,client) {
#if TBB_USE_ASSERT
net_delta = 0;
#endif /* TBB_USE_ASSERT */
+#if RML_USE_WCRM
+ do_open( create_scheduler() );
+#else
do_open();
+#endif /* RML_USE_WCRM */
}
- ~omp_connection_v1() {__TBB_ASSERT( net_delta==0, "net increase/decrease of load is nonzero" );}
+ ~omp_connection_v2() {__TBB_ASSERT( net_delta==0, "net increase/decrease of load is nonzero" );}
};
-template<typename Server, typename Client>
-void generic_connection<Server,Client>::request_close_connection() {
+#if !RML_USE_WCRM
+/* to deal with cases where the machine is oversubscribed; we want each thread to trip to try_process() at least once */
+/* this should not involve computing the_balance */
+bool thread_map::wakeup_next_thread( thread_map::iterator this_thr, tbb_connection_v2& conn ) {
+ if( all_visited_at_least_once )
+ return false;
+
+ iterator e = end();
+retry:
+ bool exist = false;
+ iterator k=this_thr;
+ for( ++k; k!=e; ++k ) {
+ // If another thread added *k, there is a tiny timing window where thread() is invalid.
+ server_thread& t = k->wait_for_thread();
+ if( t.my_extra_state!=ts_visited )
+ exist = true;
+ if( t.read_state()!=ts_tbb_busy && t.my_extra_state==ts_started )
+ if( t.try_grab_for( ts_tbb_busy ) )
+ return true;
+ }
+ for( k=begin(); k!=this_thr; ++k ) {
+ server_thread& t = k->wait_for_thread();
+ if( t.my_extra_state!=ts_visited )
+ exist = true;
+ if( t.read_state()!=ts_tbb_busy && t.my_extra_state==ts_started )
+ if( t.try_grab_for( ts_tbb_busy ) )
+ return true;
+ }
+
+ if( exist )
+ if( conn.has_slack() )
+ goto retry;
+ else
+ all_visited_at_least_once = true;
+ return false;
+}
+
+void thread_map::release_tbb_threads( server_thread* t ) {
+ for( ; t; t = t->link ) {
+ while( t->read_state()!=ts_asleep )
+ __TBB_Yield();
+ t->my_extra_state = ts_started;
+ }
+}
+#endif /* !RML_USE_WCRM */
+
+void thread_map::adjust_balance( int delta ) {
+ int new_balance = the_balance += delta;
+ if( new_balance>0 && 0>=new_balance-delta /*== old the_balance*/ )
+ wakeup_some_tbb_threads();
+}
+
+void thread_map::remove_client_ref() {
+ int k = my_client_ref_count.remove_ref();
+ if( k==0 ) {
+ // Notify factory that thread has crossed back into RML.
+ --my_factory_counter;
+ // Notify client that RML is done with the client object.
+ my_client.acknowledge_close_connection();
+ }
+}
+
+#if RML_USE_WCRM
+/** Not a member of generic_connection because we need Connection to be the derived class. */
+template<typename Connection>
+void make_job( Connection& c, typename Connection::server_thread_type& t ) {
+ if( t.my_job_automaton.try_acquire() ) {
+ rml::job& j = *t.my_client.create_one_job();
+ __TBB_ASSERT( &j!=NULL, "client:::create_one_job returned NULL" );
+ __TBB_ASSERT( (intptr_t(&j)&1)==0, "client::create_one_job returned misaligned job" );
+ t.my_job_automaton.set_and_release( j );
+ c.set_scratch_ptr( j, (void*) &t );
+ }
+}
+#endif /* RML_USE_WCRM */
+
#if _MSC_VER && !defined(__INTEL_COMPILER)
// Suppress "conditional expression is constant" warning.
#pragma warning( push )
#pragma warning( disable: 4127 )
-#endif
+#endif
+#if RML_USE_WCRM
+template<typename Server, typename Client>
+void generic_connection<Server,Client>::request_close_connection( bool exiting ) {
+ // for TBB connections, exiting should always be false
+ if( connection_traits<Server,Client>::is_tbb )
+ __TBB_ASSERT( !exiting, NULL);
+#if TBB_USE_ASSERT
+ else if( exiting )
+ reinterpret_cast<omp_connection_v2*>(this)->net_delta = 0;
+#endif
+ if( exiting ) {
+ uintptr_t tail = connections_to_reclaim.tail;
+ while( connections_to_reclaim.tail.compare_and_swap( garbage_connection_queue::plugged, tail )!=tail )
+ __TBB_Yield();
+ my_thread_map.unbind( *this, map_mtx );
+ my_thread_map.assist_cleanup( connection_traits<Server,Client>::assist_null_only );
+ // It is assumed that the client waits for all other threads to terminate before
+ // calling request_close_connection with true. Thus, it is safe to return all
+ // outstanding connection objects that are reachable. It is possible that there may
+ // be some unreachable connection objects lying somewhere.
+ free_all_connections( connection_scavenger.grab_and_prepend( this ) );
+ return;
+ }
+#else /* !RML_USE_WCRM */
+template<typename Server, typename Client>
+void generic_connection<Server,Client>::request_close_connection( bool ) {
+#endif /* RML_USE_WCRM */
if( connection_traits<Server,Client>::is_tbb ) {
- __TBB_ASSERT( this_tbb_connection==reinterpret_cast<tbb_connection_v1*>(this), NULL );
- tbb_connection_v1* conn;
+ // acquire the head of active tbb connections
+ uintptr_t conn;
do {
- while( (conn=this_tbb_connection)==reinterpret_cast<tbb_connection_v1*>(tbb_connection_v1::c_locked) )
+ for( ; (conn=active_tbb_connections)&1; )
__TBB_Yield();
- } while ( this_tbb_connection.compare_and_swap(0, conn)!=conn );
+ } while( active_tbb_connections.compare_and_swap( conn|1, conn )!=conn );
+
+ // Locate the current connection
+ generic_connection* pred_conn = NULL;
+ generic_connection* curr_conn = (generic_connection*) conn;
+ for( ; curr_conn && curr_conn!=this; curr_conn=curr_conn->next_conn )
+ pred_conn = curr_conn;
+ __TBB_ASSERT( curr_conn==this, "the current connection is not in the list?" );
+
+ // Remove this from the list
+ if( pred_conn ) {
+ pred_conn->next_conn = curr_conn->next_conn;
+ active_tbb_connections = reinterpret_cast<uintptr_t>(generic_connection<tbb_server,tbb_client>::get_addr(active_tbb_connections)); // release it
+ } else
+ active_tbb_connections = (uintptr_t) curr_conn->next_conn; // update & release it
+ curr_conn->next_conn = NULL;
+ // Increment the tbb connection close event count
+ my_ec = ++close_tbb_connection_event_count;
+ // Wait happens in tbb_connection_v2::~tbb_connection_v2()
}
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-#pragma warning( pop )
-#endif
+#if RML_USE_WCRM
+ my_thread_map.unbind( *this, map_mtx );
+ my_thread_map.assist_cleanup( connection_traits<Server,Client>::assist_null_only );
+ connection_scavenger.add_request( this );
+#else
my_thread_map.unbind();
my_thread_map.assist_cleanup( connection_traits<Server,Client>::assist_null_only );
// Remove extra reference
remove_server_ref();
+#endif
+}
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+#pragma warning( pop )
+#endif
+
+#if RML_USE_WCRM
+
+template<typename Server, typename Client>
+void generic_connection<Server,Client>::add_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count )
+{}
+
+template<>
+void generic_connection<tbb_server,tbb_client>::add_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count )
+{
+ my_thread_map.add_virtual_processors( vproots, count, (tbb_connection_v2&)*this, map_mtx );
+}
+template<>
+void generic_connection<omp_server,omp_client>::add_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count )
+{
+ // For OMP, since it uses ScheudlerPolicy of MinThreads==MaxThreads, this is called once when
+ // RequestInitialVirtualProcessors() is called.
+ my_thread_map.add_virtual_processors( vproots, count, (omp_connection_v2&)*this, map_mtx );
}
template<typename Server, typename Client>
-void generic_connection<Server,Client>::make_job( server_thread& t, job_automaton& ja ) {
- if( ja.try_acquire() ) {
- rml::job& j = *client().create_one_job();
- __TBB_ASSERT( &j!=NULL, "client:::create_one_job returned NULL" );
- __TBB_ASSERT( (intptr_t(&j)&1)==0, "client::create_one_job returned misaligned job" );
- ja.set_and_release( j );
- __TBB_ASSERT( t.my_conn && t.my_ja && t.my_job==NULL, NULL );
- t.my_job = &j;
+void generic_connection<Server,Client>::remove_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count )
+{
+ __TBB_ASSERT( false, "should not be called" );
+}
+/* For OMP, RemoveVirtualProcessors() will never be called. */
+
+template<>
+void generic_connection<tbb_server,tbb_client>::remove_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count )
+{
+ my_thread_map.remove_virtual_processors( vproots, count, map_mtx );
+}
+
+void tbb_connection_v2::adjust_job_count_estimate( int delta ) {
+#if TBB_USE_ASSERT
+ my_job_count_estimate += delta;
+#endif /* TBB_USE_ASSERT */
+ // Atomically update slack.
+ int c = my_slack+=delta;
+ if( c>0 ) {
+ ++n_adjust_job_count_requests;
+ my_thread_map.wakeup_tbb_threads( c, map_mtx );
+ --n_adjust_job_count_requests;
}
}
+#endif /* RML_USE_WCRM */
-tbb_connection_v1::~tbb_connection_v1() {
+tbb_connection_v2::~tbb_connection_v2() {
#if TBB_USE_ASSERT
if( my_job_count_estimate!=0 ) {
fprintf(stderr, "TBB client tried to disconnect with non-zero net job count estimate of %d\n", int(my_job_count_estimate ));
abort();
}
__TBB_ASSERT( !my_slack, "attempt to destroy tbb_server with nonzero slack" );
- __TBB_ASSERT( this!=this_tbb_connection, "request_close_connection() must be called" );
+ __TBB_ASSERT( this!=static_cast<tbb_connection_v2*>(generic_connection<tbb_server,tbb_client >::get_addr(active_tbb_connections)), "request_close_connection() must be called" );
#endif /* TBB_USE_ASSERT */
- // if the next connection has unstarted threads, start one of them.
- wakeup_some_tbb_threads();
+#if !RML_USE_WCRM
+ // If there are other threads ready for work, give them coins
+ if( the_balance>0 )
+ wakeup_some_tbb_threads();
+#endif
+ // Someone might be accessing my data members
+ while( current_tbb_conn_readers>0 && (ptrdiff_t)(my_ec-current_tbb_conn_reader_epoch)>0 )
+ __TBB_Yield();
+}
+
+#if !RML_USE_WCRM
+template<typename Server, typename Client>
+void generic_connection<Server,Client>::make_job( server_thread& t, job_automaton& ja ) {
+ if( ja.try_acquire() ) {
+ rml::job& j = *client().create_one_job();
+ __TBB_ASSERT( &j!=NULL, "client:::create_one_job returned NULL" );
+ __TBB_ASSERT( (intptr_t(&j)&1)==0, "client::create_one_job returned misaligned job" );
+ ja.set_and_release( j );
+ __TBB_ASSERT( t.my_conn && t.my_ja && t.my_job==NULL, NULL );
+ t.my_job = &j;
+ set_scratch_ptr( j, (void*) &t );
+ }
}
-void tbb_connection_v1::adjust_job_count_estimate( int delta ) {
+void tbb_connection_v2::adjust_job_count_estimate( int delta ) {
#if TBB_USE_ASSERT
my_job_count_estimate += delta;
#endif /* TBB_USE_ASSERT */
@@ -754,7 +1541,7 @@ void tbb_connection_v1::adjust_job_count_estimate( int delta ) {
if( !k )
// No unrealized threads left.
break;
- // eagerly start the thread off.
+ // Eagerly start the thread off.
my_thread_map.bind_one_thread( *this, *k );
server_thread& t = k->thread();
__TBB_ASSERT( !t.link, NULL );
@@ -765,85 +1552,219 @@ void tbb_connection_v1::adjust_job_count_estimate( int delta ) {
thread_map::size_type j=0;
for( ; the_balance>0 && j<i; ++j ) {
if( --the_balance>=0 ) {
- // withdraw a coin from the bank
+ // Withdraw a coin from the bank
__TBB_ASSERT( new_threads_anchor, NULL );
server_thread* t = new_threads_anchor;
new_threads_anchor = t->link;
while( !t->try_grab_for( ts_tbb_busy ) )
__TBB_Yield();
- t->tbb_state = ts_started;
+ t->my_extra_state = ts_started;
} else {
- // overdraft. return it to the bank
+ // Overdraft. return it to the bank
++the_balance;
break;
}
}
__TBB_ASSERT( i-j!=0||new_threads_anchor==NULL, NULL );
- // mark the ones that did not get started as eligible for being snatched.
+ // Mark the ones that did not get started as eligible for being snatched.
if( new_threads_anchor )
my_thread_map.release_tbb_threads( new_threads_anchor );
--n_adjust_job_count_requests;
}
}
+#endif /* RML_USE_WCRM */
-//! wake some available tbb threads
-/**
- First, atomically grab the connection, then increase the server ref count to keep it from being released prematurely.
- Second, check if the balance is available for TBB and the tbb conneciton has slack to exploit.
- If the answer is true, go ahead and try to wake some up.
- */
+#if RML_USE_WCRM
+int omp_connection_v2::try_increase_load( size_type n, bool strict ) {
+ __TBB_ASSERT(int(n)>=0,NULL);
+ if( strict ) {
+ the_balance -= int(n);
+ } else {
+ int avail, old;
+ do {
+ avail = the_balance;
+ if( avail<=0 ) {
+ // No atomic read-write-modify operation necessary.
+ return avail;
+ }
+ // Don't read the_system_balance; if it changes, compare_and_swap will fail anyway.
+ old = the_balance.compare_and_swap( int(n)<avail ? avail-n : 0, avail );
+ } while( old!=avail );
+ if( int(n)>avail )
+ n=avail;
+ }
+#if TBB_USE_ASSERT
+ net_delta += n;
+#endif /* TBB_USE_ASSERT */
+ return n;
+}
+
+void omp_connection_v2::decrease_load( size_type /*n*/ ) {}
+
+void omp_connection_v2::get_threads( size_type request_size, void* cookie, job* array[] ) {
+ unsigned index = 0;
+ std::vector<omp_server_thread*> enlisted(request_size);
+ std::vector<thread_grab_t> to_activate(request_size);
+
+ if( request_size==0 ) return;
+
+ {
+ tbb::spin_mutex::scoped_lock lock(map_mtx);
+
+ __TBB_ASSERT( !is_closing(), "try to get threads while connection is being shutdown?" );
+
+ for( int scan=0; scan<2; ++scan ) {
+ for( thread_map::iterator i=my_thread_map.begin(); i!=my_thread_map.end(); ++i ) {
+ omp_server_thread* thr = (omp_server_thread*) (*i).second;
+ // in the first scan, skip VPs that are lent
+ if( scan==0 && thr->is_lent() ) continue;
+ thread_grab_t res = thr->try_grab_for();
+ if( res!=wk_failed ) {// && if is not busy by some other scheduler
+ to_activate[index] = res;
+ enlisted[index] = thr;
+ if( ++index==request_size )
+ goto activate_threads;
+ }
+ }
+ }
+ }
+
+activate_threads:
+
+ for( unsigned i=0; i<index; ++i ) {
+ omp_server_thread* thr = enlisted[i];
+ if( to_activate[i]==wk_from_asleep )
+ thr->get_virtual_processor()->Activate( thr );
+ job* j = thr->wait_for_job();
+ array[i] = j;
+ thr->omp_data.produce( client(), *j, cookie, i PRODUCE_ARG(*this) );
+ }
+
+ if( index==request_size )
+ return;
+
+ // If we come to this point, it must be becuase dynamic==false
+ // Create Oversubscribers..
+
+ // Note that our policy is such that MinConcurrency==MaxConcurrency.
+ // RM will deliver MaxConcurrency of VirtualProcessors and no more.
+ __TBB_ASSERT( request_size>index, NULL );
+ unsigned n = request_size - index;
+ std::vector<server_thread*> thr_vec(n);
+ typedef std::vector<server_thread*>::iterator iterator_thr;
+ my_thread_map.create_oversubscribers( n, thr_vec, *this, map_mtx );
+ for( iterator_thr ti=thr_vec.begin(); ti!=thr_vec.end(); ++ti ) {
+ omp_server_thread* thr = (omp_server_thread*) *ti;
+ __TBB_ASSERT( thr, "thread not created?" );
+ // Thread is already grabbed; since it is nrewly created, we need to activate it.
+ thr->get_virtual_processor()->Activate( thr );
+ job* j = thr->wait_for_job();
+ array[index] = j;
+ thr->omp_data.produce( client(), *j, cookie, index PRODUCE_ARG(*this) );
+ ++index;
+ }
+}
+
+#if _WIN32||_WIN64
+void omp_connection_v2::deactivate( rml::job* j )
+{
+ my_thread_map.adjust_balance(1);
+#if TBB_USE_ASSERT
+ net_delta -= 1;
+#endif
+ omp_server_thread* thr = (omp_server_thread*) scratch_ptr( *j );
+ (thr->get_virtual_processor())->Deactivate( thr );
+}
+
+void omp_connection_v2::reactivate( rml::job* j )
+{
+ // Should not adjust the_balance because OMP client is supposed to
+ // do try_increase_load() to reserve the threads to use.
+ omp_server_thread* thr = (omp_server_thread*) scratch_ptr( *j );
+ (thr->get_virtual_processor())->Activate( thr );
+}
+#endif /* !_WIN32||_WIN64 */
+
+#endif /* RML_USE_WCRM */
+
+//! Wake up some available tbb threads
void wakeup_some_tbb_threads()
{
- for( ;; ) {
- tbb_connection_v1* conn = this_tbb_connection;
- /*
- if( conn==0 or conn==tbb_connection_v1::c_init )
- the next connection will see my last change to the deposit; do nothing
- if( conn==tbb_connection_v1::c_locked )
- a thread is already in the region A-B below.
- it will read the change made by threads of my connection to the_balance;
- do nothing
-
- 0==c_empty, -1==c_init, -2==c_locked
+ /* First, atomically grab the connection, then increase the server ref count to keep
+ it from being released prematurely. Second, check if the balance is available for TBB
+ and the tbb conneciton has slack to exploit. If the answer is true, go ahead and
+ try to wake some up. */
+ if( generic_connection<tbb_server,tbb_client >::get_addr(active_tbb_connections)==0 )
+ // the next connection will see the change; return.
+ return;
+
+start_it_over:
+ int n_curr_readers = ++current_tbb_conn_readers;
+ if( n_curr_readers>1 ) // I lost
+ return;
+ // if n_curr_readers==1, i am the first one, so I will take responsibility for waking tbb threads up.
+
+ // update the current epoch
+ current_tbb_conn_reader_epoch = close_tbb_connection_event_count;
+
+ // read and clear
+ // Newly added connection will not invalidate the pointer, and it will
+ // compete with the current one to claim coins.
+ // One that is about to close the connection increments the event count
+ // after it removes the connection from the list. But it will keep around
+ // the connection until all readers including this one catch up. So, reading
+ // the head and clearing the lock bit should be o.k.
+ generic_connection<tbb_server,tbb_client>* next_conn_wake_up = generic_connection<tbb_server,tbb_client>::get_addr( active_tbb_connections );
+
+ for( ; next_conn_wake_up; ) {
+ /* some threads are creating tbb server threads; they may not see my changes made to the_balance */
+ /* When a thread is in adjust_job_count_estimate() to increase the slack
+ RML tries to activate worker threads on behalf of the requesting thread
+ by repeatedly drawing a coin from the bank optimistically and grabbing a
+ thread. If it finds the bank overdrafted, it returns the coin back to
+ the bank and returns the control to the thread (return from the method).
+ There lies a tiny timing hole.
+
+ When the overdraft occurs (note that multiple masters may be in
+ adjust_job_count_estimate() so the_balance can be any negative value) and
+ a worker returns from the TBB work at that moment, its returning the coin
+ does not bump up the_balance over 0, so it happily returns from
+ wakeup_some_tbb_threads() without attempting to give coins to worker threads
+ that are ready.
*/
- if( ((-ptrdiff_t(conn))&~3 )==0 )
- return;
+ while( ((tbb_connection_v2*)next_conn_wake_up)->n_adjust_job_count_requests>0 )
+ __TBB_Yield();
- // FIXME: place the_balance next to tbb_this_connection ? to save some cache moves ?
- /* region A: this is the only place to set this_tbb_connection to c_locked */
- tbb_connection_v1* old_ttc = this_tbb_connection.compare_and_swap( reinterpret_cast<tbb_connection_v1*>(tbb_connection_v1::c_locked), conn );
- if( old_ttc==conn ) {
-#if USE_TBB_ASSERT
- __TBB_ASSERT( conn->add_server_ref()>1, NULL );
-#else
- conn->add_server_ref();
-#endif
- /* region B: this is the only place to restore this_tbb_connection from c_locked */
- this_tbb_connection = conn; // restoring it means releasing it
+ int bal = the_balance;
+ n_curr_readers = current_tbb_conn_readers; // get the snapshot
+ if( bal<=0 ) break;
+ // if the connection is deleted, the following will immediately return because its slack would be 0 or less.
- /* some threads are creating tbb server threads; they may not see my changes made to the_balance */
- while( conn->n_adjust_job_count_requests>0 )
- __TBB_Yield();
+ tbb_connection_v2* tbb_conn = (tbb_connection_v2*)next_conn_wake_up;
+ int my_slack = tbb_conn->my_slack;
+ if( my_slack>0 ) tbb_conn->wakeup_tbb_threads( my_slack );
+ next_conn_wake_up = next_conn_wake_up->next_conn;
+ }
- int bal = the_balance;
- if( bal>0 && conn->has_slack() )
- conn->wakeup_tbb_threads( bal );
- conn->remove_server_ref();
- break;
- } else if( ((-ptrdiff_t(old_ttc))&~3)==0 ) {
- return; /* see above */
- } else {
- __TBB_Yield();
- }
+ int delta = current_tbb_conn_readers -= n_curr_readers;
+ //if delta>0, more threads entered the routine since this one took the snapshot
+ if( delta>0 ) {
+ current_tbb_conn_readers = 0;
+ if( the_balance>0 && generic_connection<tbb_server,tbb_client >::get_addr(active_tbb_connections)!=0 )
+ goto start_it_over;
}
+
+ // Signal any connection that is waiting for me to complete my access that I am done.
+ current_tbb_conn_reader_epoch = close_tbb_connection_event_count;
}
-int omp_connection_v1::try_increase_load( size_type n, bool strict ) {
+#if !RML_USE_WCRM
+int omp_connection_v2::try_increase_load( size_type n, bool strict ) {
__TBB_ASSERT(int(n)>=0,NULL);
if( strict ) {
- the_balance-=int(n);
+ the_balance -= int(n);
} else {
int avail, old;
do {
@@ -864,7 +1785,7 @@ int omp_connection_v1::try_increase_load( size_type n, bool strict ) {
return n;
}
-void omp_connection_v1::decrease_load( size_type n ) {
+void omp_connection_v2::decrease_load( size_type n ) {
__TBB_ASSERT(int(n)>=0,NULL);
my_thread_map.adjust_balance(int(n));
#if TBB_USE_ASSERT
@@ -872,7 +1793,7 @@ void omp_connection_v1::decrease_load( size_type n ) {
#endif /* TBB_USE_ASSERT */
}
-void omp_connection_v1::get_threads( size_type request_size, void* cookie, job* array[] ) {
+void omp_connection_v2::get_threads( size_type request_size, void* cookie, job* array[] ) {
if( !request_size )
return;
@@ -881,15 +1802,13 @@ void omp_connection_v1::get_threads( size_type request_size, void* cookie, job*
for(;;) { // don't return until all request_size threads are grabbed.
// Need to grab some threads
thread_map::iterator k_end=my_thread_map.end();
- // FIXME - this search is going to be *very* slow when there is a large number of threads and most are in use.
- // Consider starting search at random point, or high water mark of sorts.
for( thread_map::iterator k=my_thread_map.begin(); k!=k_end; ++k ) {
// If another thread added *k, there is a tiny timing window where thread() is invalid.
server_thread& t = k->wait_for_thread();
if( t.try_grab_for( ts_omp_busy ) ) {
// The preincrement instead of post-increment of index is deliberate.
job& j = k->wait_for_job();
- array[index] = &j;
+ array[index] = &j;
t.omp_dispatch.produce( client(), j, cookie, index PRODUCE_ARG(*this) );
if( ++index==request_size )
return;
@@ -899,11 +1818,12 @@ void omp_connection_v1::get_threads( size_type request_size, void* cookie, job*
for( unsigned i=index; i<request_size; ++i ) {
__TBB_ASSERT( index<request_size, NULL );
thread_map::value_type* k = my_thread_map.add_one_thread( true );
+#if TBB_USE_ASSERT
if( !k ) {
// Client erred
- fprintf(stderr,"server::get_threads: exceeded job_count\n");
- __TBB_ASSERT(false, NULL);
+ __TBB_ASSERT(false, "server::get_threads: exceeded job_count\n");
}
+#endif
my_thread_map.bind_one_thread( *this, *k );
server_thread& t = k->thread();
if( t.try_grab_for( ts_omp_busy ) ) {
@@ -917,19 +1837,22 @@ void omp_connection_v1::get_threads( size_type request_size, void* cookie, job*
}
}
}
+#endif /* !RML_USE_WCRM */
//------------------------------------------------------------------------
// Methods of omp_dispatch_type
//------------------------------------------------------------------------
void omp_dispatch_type::consume() {
- job_type* j;
+ job_type* j = job;
// Wait for short window between when master sets state of this thread to ts_omp_busy
// and master thread calls produce.
- // FIXME - this is a very short spin while the producer is setting fields of *this,
- // but nonetheless the loop should probably use exponential backoff, or at least pause instructions.
- do {
- j = job;
- } while( !j );
+ if( !j ) {
+ tbb::internal::atomic_backoff bo;
+ do {
+ bo.pause();
+ j = job;
+ } while( !j );
+ }
job = static_cast<job_type*>(NULL);
client->process(*j,cookie,index);
#if TBB_USE_ASSERT
@@ -939,13 +1862,35 @@ void omp_dispatch_type::consume() {
#endif /* TBB_USE_ASSERT */
}
+#if !RML_USE_WCRM
+#if _WIN32||_WIN64
+void omp_connection_v2::deactivate( rml::job* j )
+{
+#if TBB_USE_ASSERT
+ net_delta -= 1;
+#endif
+ __TBB_ASSERT( j, NULL );
+ server_thread* thr = (server_thread*) scratch_ptr( *j );
+ thr->deactivate();
+}
+
+void omp_connection_v2::reactivate( rml::job* j )
+{
+ // Should not adjust the_balance because OMP client is supposed to
+ // do try_increase_load() to reserve the threads to use.
+ __TBB_ASSERT( j, NULL );
+ server_thread* thr = (server_thread*) scratch_ptr( *j );
+ thr->reactivate();
+}
+#endif /* _WIN32||_WIN64 */
+
//------------------------------------------------------------------------
// Methods of server_thread
//------------------------------------------------------------------------
server_thread::server_thread() :
ref_count(0),
- link(NULL), // FIXME: remove when all fixes are done.
+ link(NULL),
my_map_pos(),
my_conn(NULL), my_job(NULL), my_ja(NULL)
{
@@ -973,7 +1918,7 @@ __RML_DECL_THREAD_ROUTINE server_thread::thread_routine( void* arg ) {
self->has_active_thread = true;
#endif /* TBB_USE_ASSERT */
self->loop();
- return NULL;
+ return 0;
}
#if _MSC_VER && !defined(__INTEL_COMPILER)
#pragma warning(pop)
@@ -995,9 +1940,6 @@ void server_thread::sleep_perhaps( thread_state_t asleep ) {
} else {
monitor.cancel_wait();
}
- // Following compare-and-swap logic tries to transition from asleep to idle while both ignoring the
- // preserving the reserved_flag bit in state, because some other thread may be asynchronously clearing
- // the reserved_flag bit within state.
thread_state_t s = read_state();
if( s==ts_asleep ) {
state.compare_and_swap( ts_idle, ts_asleep );
@@ -1005,7 +1947,7 @@ void server_thread::sleep_perhaps( thread_state_t asleep ) {
} else {
// Someone else woke me up; there the_balance is decremented by 1. -- tbb only
if( !is_omp_thread ) {
- __TBB_ASSERT( state==ts_tbb_busy||state==ts_idle, NULL );
+ __TBB_ASSERT( s==ts_tbb_busy||s==ts_idle, NULL );
}
}
} else {
@@ -1047,15 +1989,53 @@ bool server_thread::try_grab_for( thread_state_t target_state ) {
return success;
}
+#if _WIN32||_WIN64
+void server_thread::deactivate() {
+ thread_state_t es = (thread_state_t) my_extra_state.fetch_and_store( ts_deactivated );
+ __TBB_ASSERT( my_extra_state==ts_deactivated, "someone else tampered with my_extra_state?" );
+ if( es==ts_none )
+ state = ts_idle;
+ else
+ __TBB_ASSERT( es==ts_reactivated, "Cannot call deactivate() while in ts_deactivated" );
+ // only the thread can transition itself from ts_deactivted to ts_none
+ __TBB_ASSERT( my_extra_state==ts_deactivated, "someone else tampered with my_extra_state?" );
+ my_extra_state = ts_none; // release the critical section
+ int bal = ++the_balance;
+ if( bal>0 )
+ wakeup_some_tbb_threads();
+ if( es==ts_none )
+ sleep_perhaps( ts_asleep );
+}
+
+void server_thread::reactivate() {
+ thread_state_t es;
+ do {
+ while( (es=read_extra_state())==ts_deactivated )
+ __TBB_Yield();
+ if( es==ts_reactivated ) {
+ __TBB_ASSERT( false, "two Reactivate() calls in a row. Should not happen" );
+ return;
+ }
+ __TBB_ASSERT( es==ts_none, NULL );
+ } while( (thread_state_t)my_extra_state.compare_and_swap( ts_reactivated, ts_none )!=ts_none );
+ if( state!=ts_omp_busy ) {
+ my_extra_state = ts_none;
+ while( !try_grab_for( ts_omp_busy ) )
+ __TBB_Yield();
+ }
+}
+#endif /* _WIN32||_WIN64 */
+
+
template<typename Connection>
bool server_thread::destroy_job( Connection& c ) {
- __TBB_ASSERT( !is_omp_thread||state==ts_idle, NULL );
- __TBB_ASSERT( is_omp_thread||(state==ts_idle||state==ts_tbb_busy), NULL );
+ __TBB_ASSERT( !is_omp_thread||(state==ts_idle||state==ts_omp_busy), NULL );
+ __TBB_ASSERT( is_omp_thread||(state==ts_idle||state==ts_tbb_busy), NULL );
if( !is_omp_thread ) {
__TBB_ASSERT( state==ts_idle||state==ts_tbb_busy, NULL );
if( state==ts_idle )
state.compare_and_swap( ts_done, ts_idle );
- // 'state' may be set to ts_tbb_busy by another thread..
+ // 'state' may be set to ts_tbb_busy by another thread.
if( state==ts_tbb_busy ) { // return the coin to the deposit
// need to deposit first to let the next connection see the change
@@ -1073,7 +2053,8 @@ bool server_thread::destroy_job( Connection& c ) {
// Some other thread took responsibility for cleaning up the job.
}
}
- //! Must do remove client reference first, because execution of c.remove_ref() can cause *this to be destroyed.
+ // Must do remove client reference first, because execution of
+ // c.remove_ref() can cause *this to be destroyed.
int k = remove_ref();
__TBB_ASSERT_EX( k==0, "more than one references?" );
#if TBB_USE_ASSERT
@@ -1085,59 +2066,59 @@ bool server_thread::destroy_job( Connection& c ) {
bool server_thread::do_termination() {
if( is_omp_thread )
- return destroy_job( *static_cast<omp_connection_v1*>(my_conn) );
+ return destroy_job( *static_cast<omp_connection_v2*>(my_conn) );
else
- return destroy_job( *static_cast<tbb_connection_v1*>(my_conn) );
+ return destroy_job( *static_cast<tbb_connection_v2*>(my_conn) );
}
//! Loop that each thread executes
void server_thread::loop() {
if( is_omp_thread )
- static_cast<omp_connection_v1*>(my_conn)->make_job( *this, *my_ja );
- else
- static_cast<tbb_connection_v1*>(my_conn)->make_job( *this, *my_ja );
-
+ static_cast<omp_connection_v2*>(my_conn)->make_job( *this, *my_ja );
+ else
+ static_cast<tbb_connection_v2*>(my_conn)->make_job( *this, *my_ja );
for(;;) {
__TBB_Yield();
if( state==ts_idle )
sleep_perhaps( ts_asleep );
- // Drain mailbox before reading the state.
+ // Check whether I should quit.
if( terminate )
if( do_termination() )
return;
- // read the state after draining the mail box
+ // read the state
thread_state_t s = read_state();
__TBB_ASSERT( s==ts_idle||s==ts_omp_busy||s==ts_tbb_busy, NULL );
if( s==ts_omp_busy ) {
// Enslaved by OpenMP team.
omp_dispatch.consume();
- /* here wake a tbb thread up if feasible */
- int bal = ++the_balance;
- if( bal>0 )
+ /* here wake tbb threads up if feasible */
+ if( ++the_balance>0 )
wakeup_some_tbb_threads();
state = ts_idle;
} else if( s==ts_tbb_busy ) {
// do some TBB work.
__TBB_ASSERT( my_conn && my_job, NULL );
- tbb_connection_v1& conn = *static_cast<tbb_connection_v1*>(my_conn);
+ tbb_connection_v2& conn = *static_cast<tbb_connection_v2*>(my_conn);
// give openmp higher priority
bool has_coin = true;
- while( has_coin && conn.has_slack() && the_balance>=0 ) {
- if( conn.try_process(*this, *my_job) ) {
- if( conn.has_slack() && the_balance>=0 )
- has_coin = !conn.wakeup_next_thread( my_map_pos );
- }
+ if( conn.has_slack() ) {
+ // it has the coin, it should trip to the scheduler at least once as long as its slack is positive
+ do {
+ if( conn.try_process( *this, *my_job ) )
+ if( conn.has_slack() && the_balance>=0 )
+ has_coin = !conn.wakeup_next_thread( my_map_pos );
+ } while( has_coin && conn.has_slack() && the_balance>=0 );
}
state = ts_idle;
if( has_coin ) {
++the_balance; // return the coin back to the deposit
if( conn.has_slack() ) { // a new adjust_job_request_estimate() is in progress
// it may have missed my changes to state and/or the_balance
- int bal = --the_balance; // try to grab the coin back
- if( bal>=0 ) { // I got the coin
+ if( --the_balance>=0 ) { // try to grab the coin back
+ // I got the coin
if( state.compare_and_swap( ts_tbb_busy, ts_idle )!=ts_idle )
++the_balance; // someone else enlisted me.
} else {
@@ -1146,41 +2127,1110 @@ void server_thread::loop() {
}
} // else the new request will see my changes to state & the_balance.
}
+ /* here wake tbb threads up if feasible */
+ if( the_balance>0 )
+ wakeup_some_tbb_threads();
}
}
}
+#endif /* !RML_USE_WCRM */
+
+#if RML_USE_WCRM
+
+class tbb_connection_v2;
+class omp_connection_v2;
+
+#define CREATE_SCHEDULER_POLICY(policy,min_thrs,max_thrs,stack_size) \
+ try { \
+ policy = new SchedulerPolicy (7, \
+ SchedulerKind, RML_THREAD_KIND, /*defined in _rml_serer_msrt.h*/ \
+ MinConcurrency, min_thrs, \
+ MaxConcurrency, max_thrs, \
+ TargetOversubscriptionFactor, 1, \
+ ContextStackSize, stack_size/1000, /*ConcRT:kB, iRML:bytes*/ \
+ ContextPriority, THREAD_PRIORITY_NORMAL, \
+ DynamicProgressFeedback, ProgressFeedbackDisabled ); \
+ } catch ( invalid_scheduler_policy_key & ) { \
+ __TBB_ASSERT( false, "invalid scheduler policy key exception caught" );\
+ } catch ( invalid_scheduler_policy_value & ) { \
+ __TBB_ASSERT( false, "invalid scheduler policy value exception caught" );\
+ }
-template<typename Connection, typename Server, typename Client>
-static factory::status_type connect( factory& f, Server*& server, Client& client ) {
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-// Suppress "conditional expression is constant" warning.
-#pragma warning( push )
-#pragma warning( disable: 4127 )
-#endif
- if( connection_traits<Server,Client>::is_tbb )
- if( this_tbb_connection.compare_and_swap(reinterpret_cast<tbb_connection_v1*>(-1), reinterpret_cast<tbb_connection_v1*>(0))!=0 )
- return factory::st_connection_exists;
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-#pragma warning( pop )
-#endif
- server = new Connection(*static_cast<wait_counter*>(f.scratch_ptr),client);
- return factory::st_success;
-}
+static unsigned int core_count;
+static tbb::atomic<int> core_count_inited;
-extern "C" factory::status_type __RML_open_factory( factory& f, version_type& server_version, version_type client_version ) {
- // Hack to keep this library from being closed by causing the first client's dlopen to not have a corresponding dlclose.
+
+static unsigned int get_processor_count()
+{
+ if( core_count_inited!=2 ) {
+ if( core_count_inited.compare_and_swap( 1, 0 )==0 ) {
+ core_count = GetProcessorCount();
+ core_count_inited = 2;
+ } else {
+ tbb::internal::spin_wait_until_eq( core_count_inited, 2 );
+ }
+ }
+ return core_count;
+}
+
+template<typename Connection>
+scheduler<Connection>::scheduler( Connection& conn ) : uid(GetSchedulerId()), my_conn(conn) {}
+
+template<>
+scheduler<tbb_connection_v2>::scheduler( tbb_connection_v2& conn ) : uid(GetSchedulerId()), my_conn(conn)
+{
+ rml::client& cl = my_conn.client();
+ unsigned max_job_count = cl.max_job_count();
+ unsigned count = get_processor_count();
+ __TBB_ASSERT( max_job_count>0, "max job count must be positive" );
+ __TBB_ASSERT( count>1, "The processor count must be greater than 1" );
+ if( max_job_count>count-1) max_job_count = count-1;
+ CREATE_SCHEDULER_POLICY( my_policy, 0, max_job_count, cl.min_stack_size() );
+}
+
+#if __RML_REMOVE_VIRTUAL_PROCESSORS_DISABLED
+template<>
+void scheduler<tbb_connection_v2>::RemoveVirtualProcessors( IVirtualProcessorRoot**, unsigned int)
+{
+}
+#else
+template<>
+void scheduler<tbb_connection_v2>::RemoveVirtualProcessors( IVirtualProcessorRoot** vproots, unsigned int count )
+{
+ if( !my_conn.is_closing() )
+ my_conn.remove_virtual_processors( vproots, count );
+}
+#endif
+
+template<>
+void scheduler<tbb_connection_v2>::NotifyResourcesExternallyIdle( IVirtualProcessorRoot** /*vproots*/, unsigned int /*count*/)
+{
+ __TBB_ASSERT( false, "NotifyResourcesExternallyIdle() is not allowed for TBB" );
+}
+
+template<>
+void scheduler<tbb_connection_v2>::NotifyResourcesExternallyBusy( IVirtualProcessorRoot** /*vproots*/, unsigned int /*count*/ )
+{
+ __TBB_ASSERT( false, "NotifyResourcesExternallyBusy() is not allowed for TBB" );
+}
+
+template<>
+scheduler<omp_connection_v2>::scheduler( omp_connection_v2& conn ) : uid(GetSchedulerId()), my_conn(conn)
+{
+ unsigned count = get_processor_count();
+ rml::client& cl = my_conn.client();
+ __TBB_ASSERT( count>1, "The processor count must be greater than 1" );
+ CREATE_SCHEDULER_POLICY( my_policy, count-1, count-1, cl.min_stack_size() );
+}
+
+template<>
+void scheduler<omp_connection_v2>::RemoveVirtualProcessors( IVirtualProcessorRoot** /*vproots*/, unsigned int /*count*/ ) {
+ __TBB_ASSERT( false, "RemoveVirtualProcessors() is not allowed for OMP" );
+}
+
+template<>
+void scheduler<omp_connection_v2>::NotifyResourcesExternallyIdle( IVirtualProcessorRoot** vproots, unsigned int count ){
+ if( !my_conn.is_closing() )
+ my_conn.notify_resources_externally_idle( vproots, count );
+}
+
+template<>
+void scheduler<omp_connection_v2>::NotifyResourcesExternallyBusy( IVirtualProcessorRoot** vproots, unsigned int count ){
+ if( !my_conn.is_closing() )
+ my_conn.notify_resources_externally_busy( vproots, count );
+}
+
+/* ts_idle, ts_asleep, ts_busy */
+void tbb_server_thread::Dispatch( DispatchState* ) {
+ // Activate() will resume a thread right after Deactivate() as if it returns from the call
+ tbb_connection_v2* tbb_conn = static_cast<tbb_connection_v2*>(my_conn);
+ make_job( *tbb_conn, *this );
+
+ for( ;; ) {
+ // Try to wake some tbb threads if the balance is positive.
+ // When a thread is added by ConcRT and enter here for the first time,
+ // the thread may wake itself up (i.e., atomically change its state to ts_busy.
+ if( the_balance>0 )
+ wakeup_some_tbb_threads();
+ if( read_state()!=ts_busy )
+ if( sleep_perhaps() )
+ return;
+ if( terminate )
+ if( initiate_termination() )
+ return;
+ if( read_state()==ts_busy ) {
+ // this thread has a coin (i.e., state=ts_busy; it should trip to the scheduler at least once
+ if ( tbb_conn->has_slack() ) {
+ do {
+ tbb_conn->try_process( *wait_for_job() );
+ } while( tbb_conn->has_slack() && the_balance>=0 && !is_removed() );
+ }
+ __TBB_ASSERT( read_state()==ts_busy, "thread is not in busy state after returning from process()" );
+ // see remove_virtual_processors()
+ if( my_state.compare_and_swap( ts_idle, ts_busy )==ts_busy ) {
+ int bal = ++the_balance;
+ if( tbb_conn->has_slack() ) {
+ // slack is positive, volunteer to help
+ bal = --the_balance; // try to grab the coin back
+ if( bal>=0 ) { // got the coin back
+ if( my_state.compare_and_swap( ts_busy, ts_idle )!=ts_idle )
+ ++the_balance; // someone else enlisted me.
+ // else my_state is ts_busy, I will come back to tbb_conn->try_process().
+ } else {
+ // overdraft. return the coin
+ ++the_balance;
+ }
+ } // else the new request will see my changes to state & the_balance.
+ } else {
+ __TBB_ASSERT( false, "someone tampered with my state" );
+ }
+ } // someone else might set the state to somthing other than ts_idle
+ }
+}
+
+void omp_server_thread::Dispatch( DispatchState* ) {
+ // Activate() will resume a thread right after Deactivate() as if it returns from the call
+ make_job( *static_cast<omp_connection_v2*>(my_conn), *this );
+
+ for( ;; ) {
+ if( read_state()!=ts_busy )
+ sleep_perhaps();
+ if( terminate ) {
+ if( initiate_termination() )
+ return;
+ }
+ if( read_state()==ts_busy ) {
+ omp_data.consume();
+ __TBB_ASSERT( read_state()==ts_busy, "thread is not in busy state after returning from process()" );
+ my_thread_map.adjust_balance( 1 );
+ set_state( ts_idle );
+ }
+ // someone else might set the state to somthing other than ts_idle
+ }
+}
+
+//! Attempt to change a thread's state to ts_omp_busy, and waking it up if necessary.
+thread_grab_t server_thread_rep::try_grab_for() {
+ thread_grab_t res = wk_failed;
+ thread_state_t s = read_state();
+ switch( s ) {
+ case ts_asleep:
+ if( wakeup( ts_busy, ts_asleep ) )
+ res = wk_from_asleep;
+ __TBB_ASSERT( res==wk_failed||read_state()==ts_busy, NULL );
+ break;
+ case ts_idle:
+ if( my_state.compare_and_swap( ts_busy, ts_idle )==ts_idle )
+ res = wk_from_idle;
+ // At this point a thread is grabbed (i.e., its state has changed to ts_busy.
+ // It is possible that the thread 1) processes the job, returns from process() and
+ // sets its state ts_idle again. In some cases, it even sets its state to ts_asleep.
+ break;
+ default:
+ break;
+ }
+ return res;
+}
+
+bool tbb_server_thread::switch_out() {
+ thread_state_t s = read_state();
+ __TBB_ASSERT( s==ts_asleep||s==ts_busy, NULL );
+ // This thread comes back from the TBB scheduler, and changed its state to ts_asleep successfully.
+ // The master enlisted it and woke it up by Activate()'ing it; now it is emerging from Deactivated().
+ // ConcRT requested for removal of the vp associated with the thread, and RML marks it removed.
+ // Now, it has ts_busy, and removed. -- we should remove it.
+ IExecutionResource* old_vp = my_execution_resource;
+ if( s==ts_busy ) {
+ ++the_balance;
+ my_state = ts_asleep;
+ }
+ IThreadProxy* proxy = my_proxy;
+ __TBB_ASSERT( proxy, NULL );
+ my_execution_resource = (IExecutionResource*) c_remove_prepare;
+ old_vp->Remove( my_scheduler );
+ my_execution_resource = (IExecutionResource*) c_remove_returned;
+ int cnt = --activation_count;
+ __TBB_ASSERT_EX( cnt==0||cnt==1, "too many activations?" );
+ proxy->SwitchOut();
+ if( terminate ) {
+ bool activated = activation_count==1;
+#if TBB_USE_ASSERT
+ /* In a rare sequence of events, a thread comes out of SwitchOut with activation_count==1.
+ * 1) The thread is SwitchOut'ed.
+ * 2) AddVirtualProcessors() arrived and the thread is Activated.
+ * 3) The thread is coming out of SwitchOut().
+ * 4) request_close_connection arrives and inform the thread that it is time to terminate.
+ * 5) The thread hits the check and falls into the path with 'activated==true'.
+ * In that case, do the clean-up but do not switch to the thread scavenger; rather simply return to RM.
+ */
+ if( activated ) {
+ // thread is 'revived' in add_virtual_processors after being Activated().
+ // so, if the thread extra state is still marked 'removed', it will shortly change to 'none'
+ // i.e., !is_remove(). The thread state is changed to ts_idle before the extra state, so
+ // the thread's state should be either ts_idle or ts_done.
+ while( is_removed() )
+ __TBB_Yield();
+ thread_state_t s = read_state();
+ __TBB_ASSERT( s==ts_idle || s==ts_done, NULL );
+ }
+#endif
+ __TBB_ASSERT( my_state==ts_asleep||my_state==ts_idle, NULL );
+ // it is possible that in make_job() the thread may not have a chance to create a job.
+ // my_job may not be set if the thread did not get a chance to process client's job (i.e., call try_process())
+ rml::job* j;
+ if( my_job_automaton.try_plug(j) ) {
+ __TBB_ASSERT( j, NULL );
+ my_client.cleanup(*j);
+ my_conn->remove_client_ref();
+ }
+ // Must do remove client reference first, because execution of
+ // c.remove_ref() can cause *this to be destroyed.
+ if( !activated )
+ proxy->SwitchTo( my_thread_map.get_thread_scavenger(), Idle );
+ my_conn->remove_server_ref();
+ return true;
+ }
+ // We revive a thread in add_virtual_processors() after we Activate the thread on a new virtual processor.
+ // So briefly wait until the thread's my_execution_resource gets set.
+ while( get_virtual_processor()==c_remove_returned )
+ __TBB_Yield();
+ return false;
+}
+
+bool tbb_server_thread::sleep_perhaps () {
+ if( terminate ) return false;
+ thread_state_t s = read_state();
+ if( s==ts_idle ) {
+ if( my_state.compare_and_swap( ts_asleep, ts_idle )==ts_idle ) {
+ // If a thread is between read_state() and compare_and_swap(), and the master tries to terminate,
+ // the master's compare_and_swap() will fail because the thread's state is ts_idle.
+ // We need to check if terminate is true or not before letting the thread go to sleep oetherwise
+ // we will miss the terminate signal.
+ if( !terminate ) {
+ if( !is_removed() ) {
+ --activation_count;
+ get_virtual_processor()->Deactivate( this );
+ }
+ if( is_removed() ) {
+ if( switch_out() )
+ return true;
+ __TBB_ASSERT( my_execution_resource>c_remove_returned, NULL );
+ }
+ // in add_virtual_processors(), when we revive a thread, we change its state after Activate the thread
+ // in that case the state may be ts_asleep for a short period
+ while( read_state()==ts_asleep )
+ __TBB_Yield();
+ } else {
+ if( my_state.compare_and_swap( ts_done, ts_asleep )!=ts_asleep ) {
+ --activation_count;
+ // unbind() changed my state. It will call Activate(). So issue a matching Deactivate()
+ get_virtual_processor()->Deactivate( this );
+ }
+ }
+ }
+ } else {
+ __TBB_ASSERT( s==ts_busy, NULL );
+ }
+ return false;
+}
+
+void omp_server_thread::sleep_perhaps () {
+ if( terminate ) return;
+ thread_state_t s = read_state();
+ if( s==ts_idle ) {
+ if( my_state.compare_and_swap( ts_asleep, ts_idle )==ts_idle ) {
+ // If a thread is between read_state() and compare_and_swap(), and the master tries to terminate,
+ // the master's compare_and_swap() will fail because the thread's state is ts_idle.
+ // We need to check if terminate is true or not before letting the thread go to sleep oetherwise
+ // we will miss the terminate signal.
+ if( !terminate ) {
+ get_virtual_processor()->Deactivate( this );
+ __TBB_ASSERT( !is_removed(), "OMP threads should not be deprived of a virtual processor" );
+ __TBB_ASSERT( read_state()!=ts_asleep, NULL );
+ } else {
+ if( my_state.compare_and_swap( ts_done, ts_asleep )!=ts_asleep )
+ // unbind() changed my state. It will call Activate(). So issue a matching Deactivate()
+ get_virtual_processor()->Deactivate( this );
+ }
+ }
+ } else {
+ __TBB_ASSERT( s==ts_busy, NULL );
+ }
+}
+
+bool tbb_server_thread::initiate_termination() {
+ if( read_state()==ts_busy ) {
+ int bal = ++the_balance;
+ if( bal>0 ) wakeup_some_tbb_threads();
+ }
+ return destroy_job( (tbb_connection_v2*) my_conn );
+}
+
+template<typename Connection>
+bool server_thread_rep::destroy_job( Connection* c ) {
+ __TBB_ASSERT( my_state!=ts_asleep, NULL );
+ rml::job* j;
+ if( my_job_automaton.try_plug(j) ) {
+ __TBB_ASSERT( j, NULL );
+ my_client.cleanup(*j);
+ c->remove_client_ref();
+ }
+ // Must do remove client reference first, because execution of
+ // c.remove_ref() can cause *this to be destroyed.
+ c->remove_server_ref();
+ return true;
+}
+
+void thread_map::assist_cleanup( bool assist_null_only ) {
+ // To avoid deadlock, the current thread *must* help out with cleanups that have not started,
+ // becausd the thread that created the job may be busy for a long time.
+ for( iterator i = begin(); i!=end(); ++i ) {
+ rml::job* j=0;
+ server_thread* thr = (*i).second;
+ job_automaton& ja = thr->my_job_automaton;
+ if( assist_null_only ? ja.try_plug_null() : ja.try_plug(j) ) {
+ if( j ) {
+ my_client.cleanup(*j);
+ } else {
+ // server thread did not get a chance to create a job.
+ }
+ remove_client_ref();
+ }
+ }
+}
+
+void thread_map::add_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count, tbb_connection_v2& conn, ::tbb::spin_mutex& mtx )
+{
+#if TBB_USE_ASSERT
+ int req_cnt = ++n_add_vp_requests;
+ __TBB_ASSERT( req_cnt==1, NULL );
+#endif
+ std::vector<thread_map::iterator> vec(count);
+ std::vector<tbb_server_thread*> tvec(count);
+ iterator end;
+
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+ __TBB_ASSERT( my_map.size()==0||count==1, NULL );
+ end = my_map.end(); //remember 'end' at the time of 'find'
+ // find entries in the map for those VPs that were previosly added and then removed.
+ for( size_t i=0; i<count; ++i ) {
+ vec[i] = my_map.find( (key_type) vproots[i] );
+#if TBB_USE_DEBUG
+ if( vec[i]!=end ) {
+ tbb_server_thread* t = (tbb_server_thread*) (*vec[i]).second;
+ IVirtualProcessorRoot* v = t->get_virtual_processor();
+ __TBB_ASSERT( v==c_remove_prepare||v==c_remove_returned, NULL );
+ }
+#endif
+ }
+
+ iterator nxt = my_map.begin();
+ for( size_t i=0; i<count; ++i ) {
+ if( vec[i]!=end ) {
+#if TBB_USE_ASSERT
+ tbb_server_thread* t = (tbb_server_thread*) (*vec[i]).second;
+ __TBB_ASSERT( t->read_state()==ts_asleep, NULL );
+ IVirtualProcessorRoot* r = t->get_virtual_processor();
+ __TBB_ASSERT( r==c_remove_prepare||r==c_remove_returned, NULL );
+#endif
+ continue;
+ }
+
+ if( my_unrealized_threads>0 ) {
+ --my_unrealized_threads;
+ } else {
+ __TBB_ASSERT( nxt!=end, "nxt should not be thread_map::iterator::end" );
+ // find a removed thread context for i
+ for( ; nxt!=end; ++nxt ) {
+ tbb_server_thread* t = (tbb_server_thread*) (*nxt).second;
+ if( t->is_removed() && t->read_state()==ts_asleep && t->get_virtual_processor()==c_remove_returned ) {
+ vec[i] = nxt++;
+ break;
+ }
+ }
+ // break target
+ if( vec[i]==end ) // ignore excessive VP.
+ vproots[i] = NULL;
+ }
+ }
+ }
+
+ for( size_t i=0; i<count; ++i ) {
+ __TBB_ASSERT( !tvec[i], NULL );
+ if( vec[i]==end ) {
+ if( vproots[i] ) {
+ tvec[i] = my_tbb_allocator.allocate(1);
+ new ( tvec[i] ) tbb_server_thread( false, my_scheduler, (IExecutionResource*)vproots[i], &conn, *this, my_client );
+ }
+#if TBB_USE_ASSERT
+ } else {
+ tbb_server_thread* t = (tbb_server_thread*) (*vec[i]).second;
+ __TBB_ASSERT( t->GetProxy(), "Proxy is cleared?" );
+#endif
+ }
+ }
+
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ bool closing = is_closing();
+
+ for( size_t i=0; i<count; ++i ) {
+ if( vec[i]==end ) {
+ if( vproots[i] ) {
+ thread_map::key_type key = (thread_map::key_type) vproots[i];
+ vec[i] = insert( key, (server_thread*) tvec[i] );
+ my_client_ref_count.add_ref();
+ my_server_ref_count.add_ref();
+ }
+ } else if( !closing ) {
+ tbb_server_thread* t = (tbb_server_thread*) (*vec[i]).second;
+
+ if( (*vec[i]).first!=(thread_map::key_type)vproots[i] ) {
+ my_map.erase( vec[i] );
+ thread_map::key_type key = (thread_map::key_type) vproots[i];
+ __TBB_ASSERT( key, NULL );
+ vec[i] = insert( key, t );
+ }
+ __TBB_ASSERT( t->read_state()==ts_asleep, NULL );
+ // We did not decrement server/client ref count when a thread is removed.
+ // So, don't increment server/client ref count here.
+ }
+ }
+
+ // we could check is_closing() earlier. That requires marking the newly allocated server_thread objects
+ // that are not inserted into the thread_map, and deallocate them. Doing so seems more cumbersome
+ // than simply adding these to the thread_map and let thread_map's destructor take care of reclamation.
+ __TBB_ASSERT( closing==is_closing(), NULL );
+ if( closing ) return;
+ }
+
+ for( size_t i=0; i<count; ++i ) {
+ if( vproots[i] ) {
+ tbb_server_thread* t = (tbb_server_thread*) (*vec[i]).second;
+ __TBB_ASSERT( tvec[i]!=NULL||t->GetProxy(), "Proxy is cleared?" );
+ if( t->is_removed() )
+ __TBB_ASSERT( t->get_virtual_processor()==c_remove_returned, NULL );
+ int cnt = ++t->activation_count;
+ __TBB_ASSERT_EX( cnt==0||cnt==1, NULL );
+ vproots[i]->Activate( t );
+ if( t->is_removed() )
+ t->revive( my_scheduler, vproots[i], my_client );
+ }
+ }
+#if TBB_USE_ASSERT
+ req_cnt = --n_add_vp_requests;
+ __TBB_ASSERT( req_cnt==0, NULL );
+#endif
+}
+
+void thread_map::remove_virtual_processors( IVirtualProcessorRoot** vproots, unsigned count, ::tbb::spin_mutex& mtx ) {
+ if( my_map.size()==0 )
+ return;
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ if( is_closing() ) return;
+
+ for( unsigned int c=0; c<count; ++c ) {
+ iterator i = my_map.find( (key_type) vproots[c] );
+ if( i==my_map.end() ) {
+ thread_scavenger_thread* tst = my_thread_scavenger_thread;
+ if( !tst ) {
+ // Remove unknown vp from my scheduler;
+ vproots[c]->Remove( my_scheduler );
+ } else {
+ while( (tst=my_thread_scavenger_thread)==c_claimed )
+ __TBB_Yield();
+ if( vproots[c]!=tst->get_virtual_processor() )
+ vproots[c]->Remove( my_scheduler );
+ }
+ continue;
+ }
+ tbb_server_thread* thr = (tbb_server_thread*) (*i).second;
+ __TBB_ASSERT( thr->tbb_thread, "incorrect type of server_thread" );
+ thr->set_removed();
+ if( thr->read_state()==ts_asleep ) {
+ while( thr->activation_count>0 ) {
+ if( thr->get_virtual_processor()<=c_remove_returned )
+ break;
+ __TBB_Yield();
+ }
+ if( thr->get_virtual_processor()>c_remove_returned ) {
+ // the thread is in Deactivated state
+ ++thr->activation_count;
+ // wake the thread up so that it Switches Out itself.
+ thr->get_virtual_processor()->Activate( thr );
+ } // else, it is Switched Out
+ } // else the thread will see that it is removed and proceed to switch itself out without Deactivation
+ }
+}
+
+void thread_map::add_virtual_processors( IVirtualProcessorRoot** vproots, unsigned int count, omp_connection_v2& conn, ::tbb::spin_mutex& mtx )
+{
+ std::vector<thread_map::iterator> vec(count);
+ std::vector<server_thread*> tvec(count);
+ iterator end;
+
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+ // read the map
+ end = my_map.end(); //remember 'end' at the time of 'find'
+ for( size_t i=0; i<count; ++i )
+ vec[i] = my_map.find( (key_type) vproots[i] );
+ }
+
+ for( size_t i=0; i<count; ++i ) {
+ __TBB_ASSERT( !tvec[i], NULL );
+ if( vec[i]==end ) {
+ tvec[i] = my_omp_allocator.allocate(1);
+ new ( tvec[i] ) omp_server_thread( false, my_scheduler, (IExecutionResource*)vproots[i], &conn, *this, my_client );
+ }
+ }
+
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ for( size_t i=0; i<count; ++i ) {
+ if( vec[i]==my_map.end() ) {
+ thread_map::key_type key = (thread_map::key_type) vproots[i];
+ vec[i] = insert( key, tvec[i] );
+ my_client_ref_count.add_ref();
+ my_server_ref_count.add_ref();
+ }
+ }
+
+ // we could check is_closing() earlier. That requires marking the newly allocated server_thread objects
+ // that are not inserted into the thread_map, and deallocate them. Doing so seems more cumbersome
+ // than simply adding these to the thread_map and let thread_map's destructor take care of reclamation.
+ if( is_closing() ) return;
+ }
+
+ for( size_t i=0; i<count; ++i )
+ vproots[i]->Activate( (*vec[i]).second );
+
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+ for( size_t i=0; i<count; ++i )
+ original_exec_resources.push_back( vproots[i] );
+ }
+}
+
+void thread_map::mark_virtual_processors_as_lent( IVirtualProcessorRoot** vproots, unsigned count, ::tbb::spin_mutex& mtx ) {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ if( is_closing() ) return;
+
+ iterator end = my_map.end();
+ for( unsigned int c=0; c<count; ++c ) {
+ iterator i = my_map.find( (key_type) vproots[c] );
+ if( i==end ) {
+ // The vproc has not been added to the map in create_oversubscribers()
+ my_map.insert( hash_map_type::value_type( (key_type) vproots[c], (server_thread*)1 ) );
+ } else {
+ server_thread* thr = (*i).second;
+ if( ((uintptr_t)thr)&~(uintptr_t)1 ) {
+ __TBB_ASSERT( !thr->is_removed(), "incorrectly removed" );
+ ((omp_server_thread*)thr)->set_lent();
+ }
+ }
+ }
+}
+
+void thread_map::create_oversubscribers( unsigned n, std::vector<server_thread*>& thr_vec, omp_connection_v2& conn, ::tbb::spin_mutex& mtx ) {
+ std::vector<IExecutionResource*> curr_exec_rsc;
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+ curr_exec_rsc = original_exec_resources; // copy construct
+ }
+ typedef std::vector<IExecutionResource*>::iterator iterator_er;
+ typedef ::std::vector<std::pair<hash_map_type::key_type, hash_map_type::mapped_type> > hash_val_vector_t;
+ hash_val_vector_t v_vec(n);
+ iterator_er begin = curr_exec_rsc.begin();
+ iterator_er end = curr_exec_rsc.end();
+ iterator_er i = begin;
+ for( unsigned c=0; c<n; ++c ) {
+ IVirtualProcessorRoot* vpr = my_scheduler_proxy->CreateOversubscriber( *i );
+ omp_server_thread* t = new ( my_omp_allocator.allocate(1) ) omp_server_thread( true, my_scheduler, (IExecutionResource*)vpr, &conn, *this, my_client );
+ thr_vec[c] = t;
+ v_vec[c] = hash_map_type::value_type( (key_type) vpr, t );
+ if( ++i==end ) i = begin;
+ }
+
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ if( is_closing() ) return;
+
+ iterator end = my_map.end();
+ unsigned c = 0;
+ for( hash_val_vector_t::iterator vi=v_vec.begin(); vi!=v_vec.end(); ++vi, ++c ) {
+ iterator i = my_map.find( (key_type) (*vi).first );
+ if( i==end ) {
+ my_map.insert( *vi );
+ } else {
+ // the vproc has not been added to the map in mark_virtual_processors_as_returned();
+ unsigned lent = (unsigned) (*i).second;
+ __TBB_ASSERT( lent<=1, "vproc map entry added incorrectly?");
+ (*i).second = thr_vec[c];
+ if( lent )
+ ((omp_server_thread*)thr_vec[c])->set_lent();
+ else
+ ((omp_server_thread*)thr_vec[c])->set_returned();
+ }
+ my_client_ref_count.add_ref();
+ my_server_ref_count.add_ref();
+ }
+ }
+}
+
+void thread_map::wakeup_tbb_threads( int c, ::tbb::spin_mutex& mtx ) {
+ std::vector<tbb_server_thread*> vec(c);
+
+ size_t idx = 0;
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ if( is_closing() ) return;
+ // only one RML thread is in here to wake worker threads up.
+
+ int bal = the_balance;
+ int cnt = c<bal ? c : bal;
+
+ if( cnt<=0 ) { return; }
+
+ for( iterator i=begin(); i!=end(); ++i ) {
+ tbb_server_thread* thr = (tbb_server_thread*) (*i).second;
+ // ConcRT RM should take threads away from TBB scheduler instead of lending them to another scheduler
+ if( thr->is_removed() )
+ continue;
+
+ if( --the_balance>=0 ) {
+ thread_grab_t res;
+ while( (res=thr->try_grab_for())!=wk_from_idle ) {
+ if( res==wk_from_asleep ) {
+ vec[idx++] = thr;
+ break;
+ } else {
+ thread_state_t s = thr->read_state();
+ if( s==ts_busy ) {// failed because already assigned. move on.
+ ++the_balance;
+ goto skip;
+ }
+ }
+ }
+ thread_state_t s = thr->read_state();
+ __TBB_ASSERT_EX( s==ts_busy, "should have set the state to ts_busy" );
+ if( --cnt==0 )
+ break;
+ } else {
+ // overdraft
+ ++the_balance;
+ break;
+ }
+skip:
+ ;
+ }
+ }
+
+ for( size_t i=0; i<idx; ++i ) {
+ tbb_server_thread* thr = vec[i];
+ __TBB_ASSERT( thr, NULL );
+ thread_state_t s = thr->read_state();
+ __TBB_ASSERT_EX( s==ts_busy, "should have set the state to ts_busy" );
+ ++thr->activation_count;
+ thr->get_virtual_processor()->Activate( thr );
+ }
+
+}
+
+void thread_map::mark_virtual_processors_as_returned( IVirtualProcessorRoot** vprocs, unsigned int count, tbb::spin_mutex& mtx ) {
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+
+ if( is_closing() ) return;
+
+ iterator end = my_map.end();
+ for(unsigned c=0; c<count; ++c ) {
+ iterator i = my_map.find( (key_type) vprocs[c] );
+ if( i==end ) {
+ // the vproc has not been added to the map in create_oversubscribers()
+ my_map.insert( hash_map_type::value_type( (key_type) vprocs[c], static_cast<server_thread*>(0) ) );
+ } else {
+ omp_server_thread* thr = (omp_server_thread*) (*i).second;
+ if( ((uintptr_t)thr)&~(uintptr_t)1 ) {
+ __TBB_ASSERT( !thr->is_removed(), "incorrectly removed" );
+ // we shoud not make any assumption on the initial state of an added vproc.
+ thr->set_returned();
+ }
+ }
+ }
+ }
+}
+
+
+void thread_map::unbind( rml::server& /*server*/, tbb::spin_mutex& mtx ) {
+ {
+ tbb::spin_mutex::scoped_lock lck( mtx );
+ shutdown_in_progress = true; // ignore any callbacks from ConcRT RM
+
+ // Ask each server_thread to cleanup its job for this server.
+ for( iterator i = begin(); i!=end(); ++i ) {
+ server_thread* t = (*i).second;
+ t->terminate = true;
+ if( t->is_removed() ) {
+ // This is for TBB only as ConcRT RM does not request OMP schedulers to remove virtual processors
+ if( t->read_state()==ts_asleep ) {
+ __TBB_ASSERT( my_thread_scavenger_thread, "this is TBB connection; thread_scavenger_thread must be allocated" );
+ // thread is on its way to switch_out; see remove_virtual_processors() where
+ // the thread is Activated() to bring it back from 'Deactivated' in sleep_perhaps()
+ // now assume that the thread will go to SwitchOut()
+#if TBB_USE_ASSERT
+ while( t->get_virtual_processor()>c_remove_returned )
+ __TBB_Yield();
+#endif
+ // A removed thread is supposed to proceed to SwithcOut.
+ // There, we remove client&server references.
+ }
+ } else {
+ if( t->wakeup( ts_done, ts_asleep ) ) {
+ if( t->tbb_thread )
+ ++((tbb_server_thread*)t)->activation_count;
+ t->get_virtual_processor()->Activate( t );
+ // We mark in the thread_map such that when termination sequence started, we ignore
+ // all notification from ConcRT RM.
+ }
+ }
+ }
+ }
+ // Remove extra ref to client.
+ remove_client_ref();
+
+ if( my_thread_scavenger_thread ) {
+ thread_scavenger_thread* tst;
+ while( (tst=my_thread_scavenger_thread)==c_claimed )
+ __TBB_Yield();
+#if TBB_USE_ASSERT
+ ++my_thread_scavenger_thread->activation_count;
+#endif
+ tst->get_virtual_processor()->Activate( tst );
+ }
+}
+
+#if !__RML_REMOVE_VIRTUAL_PROCESSORS_DISABLED
+void thread_map::allocate_thread_scavenger( IExecutionResource* v )
+{
+ if( my_thread_scavenger_thread>c_claimed ) return;
+ thread_scavenger_thread* c = my_thread_scavenger_thread.fetch_and_store((thread_scavenger_thread*)c_claimed);
+ if( c==NULL ) { // successfully claimed
+ add_server_ref();
+#if TBB_USE_ASSERT
+ ++n_thread_scavengers_created;
+#endif
+ __TBB_ASSERT( v, NULL );
+ IVirtualProcessorRoot* vpr = my_scheduler_proxy->CreateOversubscriber( v );
+ my_thread_scavenger_thread = c = new ( my_scavenger_allocator.allocate(1) ) thread_scavenger_thread( my_scheduler, vpr, *this );
+#if TBB_USE_ASSERT
+ ++c->activation_count;
+#endif
+ vpr->Activate( c );
+ } else if( c>c_claimed ) {
+ my_thread_scavenger_thread = c;
+ }
+}
+#endif
+
+void thread_scavenger_thread::Dispatch( DispatchState* )
+{
+ __TBB_ASSERT( my_proxy, NULL );
+#if TBB_USE_ASSERT
+ --activation_count;
+#endif
+ get_virtual_processor()->Deactivate( this );
+ for( thread_map::iterator i=my_thread_map.begin(); i!=my_thread_map.end(); ++i ) {
+ tbb_server_thread* t = (tbb_server_thread*) (*i).second;
+ if( t->read_state()==ts_asleep && t->is_removed() ) {
+ while( t->get_execution_resource()!=c_remove_returned )
+ __TBB_Yield();
+ my_proxy->SwitchTo( t, Blocking );
+ }
+ }
+ get_virtual_processor()->Remove( my_scheduler );
+ my_thread_map.remove_server_ref();
+ // signal to the connection scavenger that i am done with the map.
+ __TBB_ASSERT( activation_count==1, NULL );
+ set_state( ts_done );
+}
+
+//! Windows "DllMain" that handles startup and shutdown of dynamic library.
+extern "C" bool WINAPI DllMain( HINSTANCE /*hinstDLL*/, DWORD fwdReason, LPVOID lpvReserved ) {
+ void assist_cleanup_connections();
+ if( fwdReason==DLL_PROCESS_DETACH ) {
+ // dll is being unloaded
+ if( !lpvReserved ) // if FreeLibrary has been called
+ assist_cleanup_connections();
+ }
+ return true;
+}
+
+void free_all_connections( uintptr_t conn_ex ) {
+ while( conn_ex ) {
+ bool is_tbb = (conn_ex&2)>0;
+ //clear extra bits
+ uintptr_t curr_conn = conn_ex & ~(uintptr_t)3;
+ __TBB_ASSERT( curr_conn, NULL );
+
+ // Wait for worker threads to return
+ if( is_tbb ) {
+ tbb_connection_v2* tbb_conn = reinterpret_cast<tbb_connection_v2*>(curr_conn);
+ conn_ex = reinterpret_cast<uintptr_t>(tbb_conn->next_conn);
+ while( tbb_conn->my_thread_map.remove_server_ref()>0 )
+ __TBB_Yield();
+ delete tbb_conn;
+ } else {
+ omp_connection_v2* omp_conn = reinterpret_cast<omp_connection_v2*>(curr_conn);
+ conn_ex = reinterpret_cast<uintptr_t>(omp_conn->next_conn);
+ while( omp_conn->my_thread_map.remove_server_ref()>0 )
+ __TBB_Yield();
+ delete omp_conn;
+ }
+ }
+}
+
+void assist_cleanup_connections()
+{
+ //signal to connection_scavenger_thread to terminate
+ uintptr_t tail = connections_to_reclaim.tail;
+ while( connections_to_reclaim.tail.compare_and_swap( garbage_connection_queue::plugged, tail )!=tail ) {
+ __TBB_Yield();
+ tail = connections_to_reclaim.tail;
+ }
+
+ __TBB_ASSERT( connection_scavenger.state==ts_busy || connection_scavenger.state==ts_asleep, NULL );
+ // Scavenger thread may be busy freeing connections
+ DWORD thr_exit_code = STILL_ACTIVE;
+ while( connection_scavenger.state==ts_busy ) {
+ if( GetExitCodeThread( connection_scavenger.thr_handle, &thr_exit_code )>0 )
+ if( thr_exit_code!=STILL_ACTIVE )
+ break;
+ __TBB_Yield();
+ thr_exit_code = STILL_ACTIVE;
+ }
+ if( connection_scavenger.state==ts_asleep && thr_exit_code==STILL_ACTIVE )
+ connection_scavenger.wakeup(); // wake the connection scavenger thread up
+
+ // it is possible that the connection scavenger thread already exited. Take over its responsibility.
+ if( tail && connections_to_reclaim.tail!=garbage_connection_queue::plugged_acked ) {
+ // atomically claim the head of the list.
+ uintptr_t head = connections_to_reclaim.head.fetch_and_store( garbage_connection_queue::empty );
+ if( head==garbage_connection_queue::empty )
+ head = tail;
+ connection_scavenger.process_requests( head );
+ }
+ __TBB_ASSERT( connections_to_reclaim.tail==garbage_connection_queue::plugged||connections_to_reclaim.tail==garbage_connection_queue::plugged_acked, "someone else added a request after termination has initiated" );
+ __TBB_ASSERT( the_balance==connection_scavenger.default_concurrency, NULL );
+}
+
+void connection_scavenger_thread::sleep_perhaps() {
+ uintptr_t tail = connections_to_reclaim.tail;
+ // connections_to_reclaim.tail==garbage_connection_queue::plugged --> terminate,
+ // connections_to_reclaim.tail>garbage_connection_queue::plugged : we got work to do
+ if( tail>=garbage_connection_queue::plugged ) return;
+ __TBB_ASSERT( !tail, NULL );
+ thread_monitor::cookie c;
+ monitor.prepare_wait(c);
+ if( state.compare_and_swap( ts_asleep, ts_busy )==ts_busy ) {
+ if( connections_to_reclaim.tail!=garbage_connection_queue::plugged ) {
+ monitor.commit_wait(c);
+ // Someone else woke me up. The compare_and_swap further below deals with spurious wakeups.
+ } else {
+ monitor.cancel_wait();
+ }
+ thread_state_t s = state;
+ if( s==ts_asleep ) // if spurious wakeup.
+ state.compare_and_swap( ts_busy, ts_asleep );
+ // I woke myself up, either because I cancelled the wait or suffered a spurious wakeup.
+ } else {
+ __TBB_ASSERT( false, "someone else tampered with my state" );
+ }
+ __TBB_ASSERT( state==ts_busy, "a thread can only put itself to sleep" );
+}
+
+void connection_scavenger_thread::process_requests( uintptr_t conn_ex )
+{
+ __TBB_ASSERT( conn_ex>1, NULL );
+ __TBB_ASSERT( n_scavenger_threads==1||connections_to_reclaim.tail==garbage_connection_queue::plugged, "more than one connection_scavenger_thread being active?" );
+
+ bool done = false;
+ while( !done ) {
+ bool is_tbb = (conn_ex&2)>0;
+ //clear extra bits
+ uintptr_t curr_conn = conn_ex & ~(uintptr_t)3;
+
+ // no contention. there is only one connection_scavenger_thread!!
+ uintptr_t next_conn;
+ tbb_connection_v2* tbb_conn = NULL;
+ omp_connection_v2* omp_conn = NULL;
+ // Wait for worker threads to return
+ if( is_tbb ) {
+ tbb_conn = reinterpret_cast<tbb_connection_v2*>(curr_conn);
+ next_conn = reinterpret_cast<uintptr_t>(tbb_conn->next_conn);
+ while( tbb_conn->my_thread_map.get_server_ref_count()>1 )
+ __TBB_Yield();
+ } else {
+ omp_conn = reinterpret_cast<omp_connection_v2*>(curr_conn);
+ next_conn = reinterpret_cast<uintptr_t>(omp_conn->next_conn);
+ while( omp_conn->my_thread_map.get_server_ref_count()>1 )
+ __TBB_Yield();
+ }
+
+ //someone else may try to write into this connection object.
+ //So access next_conn field first before remove the extra server ref count.
+
+ if( next_conn==0 ) {
+ uintptr_t tail = connections_to_reclaim.tail;
+ if( tail==garbage_connection_queue::plugged ) {
+ tail = garbage_connection_queue::plugged_acked; // connection scavenger saw the flag, and it freed all connections.
+ done = true;
+ } else if( tail==conn_ex ) {
+ if( connections_to_reclaim.tail.compare_and_swap( garbage_connection_queue::empty, tail )==tail ) {
+ __TBB_ASSERT( !connections_to_reclaim.head, NULL );
+ done = true;
+ }
+ }
+
+ if( !done ) {
+ // A new connection to close is added to connections_to_reclaim.tail;
+ // Wait for curr_conn->next_conn to be set.
+ if( is_tbb ) {
+ while( !tbb_conn->next_conn )
+ __TBB_Yield();
+ conn_ex = reinterpret_cast<uintptr_t>(tbb_conn->next_conn);
+ } else {
+ while( !omp_conn->next_conn )
+ __TBB_Yield();
+ conn_ex = reinterpret_cast<uintptr_t>(omp_conn->next_conn);
+ }
+ }
+ } else {
+ conn_ex = next_conn;
+ }
+ __TBB_ASSERT( conn_ex, NULL );
+ if( is_tbb )
+ // remove extra srever ref count; this will trigger Shutdown/Release of ConcRT RM
+ tbb_conn->remove_server_ref();
+ else
+ // remove extra srever ref count; this will trigger Shutdown/Release of ConcRT RM
+ omp_conn->remove_server_ref();
+ }
+}
+
+__RML_DECL_THREAD_ROUTINE connection_scavenger_thread::thread_routine( void* arg ) {
+ connection_scavenger_thread* thr = (connection_scavenger_thread*) arg;
+ thr->state = ts_busy;
+ thr->thr_handle = GetCurrentThread();
+#if TBB_USE_ASSERT
+ ++thr->n_scavenger_threads;
+#endif
+ for(;;) {
+ __TBB_Yield();
+ thr->sleep_perhaps();
+ if( connections_to_reclaim.tail==garbage_connection_queue::plugged || connections_to_reclaim.tail==garbage_connection_queue::plugged_acked ) {
+ thr->state = ts_asleep;
+ return 0;
+ }
+
+ __TBB_ASSERT( connections_to_reclaim.tail!=garbage_connection_queue::plugged_acked, NULL );
+ __TBB_ASSERT( connections_to_reclaim.tail>garbage_connection_queue::plugged && (connections_to_reclaim.tail&garbage_connection_queue::plugged)==0 , NULL );
+ while( connections_to_reclaim.head==garbage_connection_queue::empty )
+ __TBB_Yield();
+ uintptr_t head = connections_to_reclaim.head.fetch_and_store( garbage_connection_queue::empty );
+ thr->process_requests( head );
+ wakeup_some_tbb_threads();
+ }
+}
+
+template<typename Server, typename Client>
+void connection_scavenger_thread::add_request( generic_connection<Server,Client>* conn_to_close )
+{
+ uintptr_t conn_ex = (uintptr_t)conn_to_close | (connection_traits<Server,Client>::is_tbb<<1);
+ __TBB_ASSERT( !conn_to_close->next_conn, NULL );
+ uintptr_t old_tail_ex = connections_to_reclaim.tail;
+ __TBB_ASSERT( old_tail_ex==0||old_tail_ex>garbage_connection_queue::plugged_acked, "Unloading DLL called while this connection is being closed?" );
+ tbb::internal::atomic_backoff backoff;
+ while( connections_to_reclaim.tail.compare_and_swap( conn_ex, old_tail_ex )!=old_tail_ex ) {
+ backoff.pause();
+ old_tail_ex = connections_to_reclaim.tail;
+ }
+
+ if( old_tail_ex==garbage_connection_queue::empty )
+ connections_to_reclaim.head = conn_ex;
+ else {
+ bool is_tbb = (old_tail_ex&2)>0;
+ uintptr_t old_tail = old_tail_ex & ~(uintptr_t)3;
+ if( is_tbb )
+ reinterpret_cast<tbb_connection_v2*>(old_tail)->next_conn = reinterpret_cast<tbb_connection_v2*>(conn_ex);
+ else
+ reinterpret_cast<omp_connection_v2*>(old_tail)->next_conn = reinterpret_cast<omp_connection_v2*>(conn_ex);
+ }
+
+ if( state==ts_asleep )
+ wakeup();
+}
+
+template<>
+uintptr_t connection_scavenger_thread::grab_and_prepend( generic_connection<tbb_server,tbb_client>* /*last_conn_to_close*/ ) { return 0;}
+
+template<>
+uintptr_t connection_scavenger_thread::grab_and_prepend( generic_connection<omp_server,omp_client>* last_conn_to_close )
+{
+ uintptr_t conn_ex = (uintptr_t)last_conn_to_close;
+ uintptr_t head = connections_to_reclaim.head.fetch_and_store( garbage_connection_queue::empty );
+ reinterpret_cast<omp_connection_v2*>(last_conn_to_close)->next_conn = reinterpret_cast<omp_connection_v2*>(head);
+ return conn_ex;
+}
+
+extern "C" ULONGLONG NTAPI VerSetConditionMask( ULONGLONG, DWORD, BYTE);
+
+bool is_windows7_or_later ()
+{
+ try {
+ return GetOSVersion()>=IResourceManager::Win7OrLater;
+ } catch( ... ) {
+ return false;
+ }
+}
+
+#endif /* RML_USE_WCRM */
+
+template<typename Connection, typename Server, typename Client>
+static factory::status_type connect( factory& f, Server*& server, Client& client ) {
+ server = new Connection(*static_cast<wait_counter*>(f.scratch_ptr),client);
+ return factory::st_success;
+}
+
+extern "C" factory::status_type __RML_open_factory( factory& f, version_type& server_version, version_type client_version ) {
+ // Hack to keep this library from being closed by causing the first client's dlopen to not have a corresponding dlclose.
// This code will be removed once we figure out how to do shutdown of the RML perfectly.
static tbb::atomic<bool> one_time_flag;
if( one_time_flag.compare_and_swap(true,false)==false) {
- f.library_handle = NULL;
+ __TBB_ASSERT( (size_t)f.library_handle!=factory::c_dont_unload, NULL );
+#if _WIN32||_WIN64
+ f.library_handle = reinterpret_cast<HMODULE>(factory::c_dont_unload);
+#else
+ f.library_handle = reinterpret_cast<void*>(factory::c_dont_unload);
+#endif
}
// End of hack
- // initialize the_balance only once
- if( the_balance_inited==0 ) {
+ // Initialize the_balance only once
+ if( the_balance_inited!=2 ) {
if( the_balance_inited.compare_and_swap( 1, 0 )==0 ) {
the_balance = hardware_concurrency()-1;
the_balance_inited = 2;
+#if RML_USE_WCRM
+ connection_scavenger.launch( the_balance );
+#endif
} else {
tbb::internal::spin_wait_until_eq( the_balance_inited, 2 );
}
@@ -1190,7 +3240,18 @@ extern "C" factory::status_type __RML_open_factory( factory& f, version_type& se
f.scratch_ptr = 0;
if( client_version==0 ) {
return factory::st_incompatible;
+#if RML_USE_WCRM
+ } else if ( !is_windows7_or_later() ) {
+#if TBB_USE_DEBUG
+ fprintf(stderr, "This version of the RML library requires Windows 7 to run on.\nConnection request denied.\n");
+#endif
+ return factory::st_incompatible;
+#endif
} else {
+#if TBB_USE_DEBUG
+ if( client_version<EARLIEST_COMPATIBLE_CLIENT_VERSION )
+ fprintf(stderr, "This client library is too old for the current RML server.\nThe connection request is granted but oversubscription/undersubscription may occur.\n");
+#endif
f.scratch_ptr = new wait_counter;
return factory::st_success;
}
@@ -1200,6 +3261,8 @@ extern "C" void __RML_close_factory( factory& f ) {
if( wait_counter* fc = static_cast<wait_counter*>(f.scratch_ptr) ) {
f.scratch_ptr = 0;
fc->wait();
+ size_t bal = the_balance;
+ f.scratch_ptr = (void*)bal;
delete fc;
}
}
@@ -1213,7 +3276,7 @@ namespace internal {
namespace rml {
extern "C" tbb_factory::status_type __TBB_make_rml_server( tbb_factory& f, tbb_server*& server, tbb_client& client ) {
- return ::rml::internal::connect< ::rml::internal::tbb_connection_v1>(f,server,client);
+ return ::rml::internal::connect< ::rml::internal::tbb_connection_v2>(f,server,client);
}
extern "C" void __TBB_call_with_my_server_info( ::rml::server_info_callback_t cb, void* arg ) {
@@ -1226,7 +3289,7 @@ namespace __kmp {
namespace rml {
extern "C" omp_factory::status_type __KMP_make_rml_server( omp_factory& f, omp_server*& server, omp_client& client ) {
- return ::rml::internal::connect< ::rml::internal::omp_connection_v1>(f,server,client);
+ return ::rml::internal::connect< ::rml::internal::omp_connection_v2>(f,server,client);
}
extern "C" void __KMP_call_with_my_server_info( ::rml::server_info_callback_t cb, void* arg ) {
@@ -1244,16 +3307,25 @@ extern "C" void __KMP_call_with_my_server_info( ::rml::server_info_callback_t cb
#pragma message("Warning: version_string.tmp isn't generated properly by version_info.sh script!")
#endif
-// We pass the build time as the RML server info. TBB is required to build RML, so we make it the same as the TBB build time.
+// We use the build time as the RML server info. TBB is required to build RML, so we make it the same as the TBB build time.
#ifndef __TBB_DATETIME
#define __TBB_DATETIME __DATE__ " " __TIME__
#endif
-#define RML_SERVER_INFO "Intel(R) RML library built: " __TBB_DATETIME
+
+#if !RML_USE_WCRM
+#define RML_SERVER_BUILD_TIME "Intel(R) RML library built: " __TBB_DATETIME
+#define RML_SERVER_VERSION_ST "Intel(R) RML library version: v" TOSTRING(SERVER_VERSION)
+#else
+#define RML_SERVER_BUILD_TIME "Intel(R) RML library built: " __TBB_DATETIME
+#define RML_SERVER_VERSION_ST "Intel(R) RML library version: v" TOSTRING(SERVER_VERSION) " on ConcRT RM with " RML_THREAD_KIND_STRING
+#endif
namespace rml {
namespace internal {
+
void call_with_build_date_str( ::rml::server_info_callback_t cb, void* arg )
{
- (*cb)( arg, RML_SERVER_INFO );
+ (*cb)( arg, RML_SERVER_BUILD_TIME );
+ (*cb)( arg, RML_SERVER_VERSION_ST );
}
}} // rml::internal
diff --git a/src/rml/server/thread_monitor.h b/src/rml/server/thread_monitor.h
index 804ed48..ea04465 100644
--- a/src/rml/server/thread_monitor.h
+++ b/src/rml/server/thread_monitor.h
@@ -45,6 +45,7 @@
#include <stdio.h>
#include "tbb/itt_notify.h"
+
// All platform-specific threading support is in this header.
#if (_WIN32||_WIN64)&&!__TBB_ipf
@@ -113,6 +114,8 @@ public:
static void launch( thread_routine_type thread_routine, void* arg, size_t stack_size );
static void yield();
+
+
private:
cookie my_cookie;
#if USE_WINTHREAD
@@ -127,6 +130,7 @@ private:
};
+
#if USE_WINTHREAD
#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
@@ -199,8 +203,7 @@ inline void thread_monitor::check( int error_code, const char* routine ) {
inline void thread_monitor::launch( void* (*thread_routine)(void*), void* arg, size_t stack_size ) {
// FIXME - consider more graceful recovery than just exiting if a thread cannot be launched.
// Note that there are some tricky situations to deal with, such that the thread is already
- // grabbed as part of an OpenMP team, or is being launched as a replacement for a thread with
- // too small a stack.
+ // grabbed as part of an OpenMP team.
pthread_attr_t s;
check(pthread_attr_init( &s ), "pthread_attr_init");
if( stack_size>0 ) {
diff --git a/src/rml/test/test_rml_mixed.cpp b/src/rml/test/test_rml_mixed.cpp
index b31cd16..32c2f25 100644
--- a/src/rml/test/test_rml_mixed.cpp
+++ b/src/rml/test/test_rml_mixed.cpp
@@ -72,6 +72,9 @@ public:
Factory factory;
Client* client;
typename Factory::server_type* server;
+#if _WIN32||_WIN64
+ ::rml::server::execution_resource_t me;
+#endif
RunTime() {
factory.open();
}
@@ -152,10 +155,16 @@ void RunTime<Factory,Client>::create_connection() {
client = new Client;
typename Factory::status_type status = factory.make_server( server, *client );
ASSERT( status==Factory::st_success, NULL );
+#if _WIN32||_WIN64
+ server->register_master( me );
+#endif /* _WIN32||_WIN64 */
}
template<typename Factory, typename Client>
void RunTime<Factory,Client>::destroy_connection() {
+#if _WIN32||_WIN64
+ server->unregister_master( me );
+#endif /* _WIN32||_WIN64 */
server->request_close_connection();
server = NULL;
}
diff --git a/src/rml/test/test_rml_omp.cpp b/src/rml/test/test_rml_omp.cpp
index df885be..bbd3650 100644
--- a/src/rml/test/test_rml_omp.cpp
+++ b/src/rml/test/test_rml_omp.cpp
@@ -26,9 +26,8 @@
the GNU General Public License.
*/
-#define HARNESS_DEFAULT_MIN_THREADS 0
-
#include "rml_omp.h"
+#define HARNESS_DEFAULT_MIN_THREADS 0
#include "test_server.h"
#include "tbb/tbb_misc.h"
@@ -78,6 +77,23 @@ public:
DoOneConnection<MyFactory,MyClient> doc(MaxThread,Nesting(nesting.level+1,nesting.limit),0,false);
doc(0);
}
+#if _WIN32||_WIN64
+ // test activate/deactivate
+ if( t.n_thread>1 && t.n_thread%2==0 ) {
+ if( nesting.level==0 ) {
+ if( index&1 ) {
+ size_type target = index-1;
+ ASSERT( target<t.max_thread, NULL );
+ // wait until t.info[target].job is defined
+ tbb::internal::spin_wait_until_eq( t.info[target].ran, true );
+ server->try_increase_load( 1, true );
+ server->reactivate( t.info[target].job );
+ } else {
+ server->deactivate( &j );
+ }
+ }
+ }
+#endif /* _WIN32||_WIN64 */
++t.barrier;
}
static const bool is_omp = true;
@@ -86,11 +102,15 @@ public:
void FireUpJobs( MyServer& server, MyClient& client, int max_thread, int n_extra, Checker* checker ) {
ASSERT( max_thread>=0, NULL );
+#if _WIN32||_WIN64
+ ::rml::server::execution_resource_t me;
+ server.register_master( me );
+#endif /* _WIN32||_WIN64 */
client.server = &server;
MyTeam team(server,size_t(max_thread));
MyServer::size_type n_thread = 0;
for( int iteration=0; iteration<4; ++iteration ) {
- for( size_t i=0; i<team.max_thread; ++i )
+ for( size_t i=0; i<team.max_thread; ++i )
team.info[i].ran = false;
switch( iteration ) {
default:
@@ -113,36 +133,45 @@ void FireUpJobs( MyServer& server, MyClient& client, int max_thread, int n_extra
MilliSleep(1);
}
int n_delivered = server.try_increase_load( n_thread, StrictTeam );
- team.n_thread = n_delivered;
- ::rml::job* job_array[JobArraySize];
- job_array[n_delivered] = (::rml::job*)intptr_t(-1);
- server.get_threads( n_delivered, &team, job_array );
- __TBB_ASSERT( job_array[n_delivered]== (::rml::job*)intptr_t(-1), NULL );
- for( int i=0; i<n_delivered; ++i ) {
- MyJob* j = static_cast<MyJob*>(job_array[i]);
- int s = j->state;
- ASSERT( s==MyJob::idle||s==MyJob::busy, NULL );
- }
- server.independent_thread_number_changed( -n_extra );
- REMARK("client %d: team size is %d\n", client.client_id(), n_delivered);
- if( checker ) {
- checker->check_number_of_threads_delivered( n_delivered, n_thread, n_extra );
- }
- // Protocol requires that master wait until workers have called "done_processing"
- while( team.barrier!=n_delivered ) {
- ASSERT( team.barrier>=0, NULL );
- ASSERT( team.barrier<=n_delivered, NULL );
- __TBB_Yield();
- }
- REMARK("client %d: team completed\n", client.client_id() );
- for( int i=0; i<n_delivered; ++i ) {
- ASSERT( team.info[i].ran, "thread on team allegedly delivered, but did not run?" );
+ ASSERT( !StrictTeam || n_delivered==int(n_thread), "server failed to satisfy strict request" );
+ if( n_delivered<0 ) {
+ REMARK( "client %d: oversubscription occurred (by %d)\n", client.client_id(), -n_delivered );
+ server.independent_thread_number_changed( -n_extra );
+ n_delivered = 0;
+ } else {
+ team.n_thread = n_delivered;
+ ::rml::job* job_array[JobArraySize];
+ job_array[n_delivered] = (::rml::job*)intptr_t(-1);
+ server.get_threads( n_delivered, &team, job_array );
+ __TBB_ASSERT( job_array[n_delivered]== (::rml::job*)intptr_t(-1), NULL );
+ for( int i=0; i<n_delivered; ++i ) {
+ MyJob* j = static_cast<MyJob*>(job_array[i]);
+ int s = j->state;
+ ASSERT( s==MyJob::idle||s==MyJob::busy, NULL );
+ }
+ server.independent_thread_number_changed( -n_extra );
+ REMARK("client %d: team size is %d\n", client.client_id(), n_delivered);
+ if( checker ) {
+ checker->check_number_of_threads_delivered( n_delivered, n_thread, n_extra );
+ }
+ // Protocol requires that master wait until workers have called "done_processing"
+ while( team.barrier!=n_delivered ) {
+ ASSERT( team.barrier>=0, NULL );
+ ASSERT( team.barrier<=n_delivered, NULL );
+ __TBB_Yield();
+ }
+ REMARK("client %d: team completed\n", client.client_id() );
+ for( int i=0; i<n_delivered; ++i ) {
+ ASSERT( team.info[i].ran, "thread on team allegedly delivered, but did not run?" );
+ }
}
for( MyServer::size_type i=n_delivered; i<MyServer::size_type(max_thread); ++i ) {
ASSERT( !team.info[i].ran, "thread on team ran with illegal index" );
}
- ASSERT( !StrictTeam || n_delivered==int(n_thread), "server failed to satisfy strict request" );
}
+#if _WIN32||_WIN64
+ server.unregister_master( me );
+#endif
}
void DoClientSpecificVerification( MyServer& server, int /*n_thread*/ )
@@ -150,7 +179,6 @@ void DoClientSpecificVerification( MyServer& server, int /*n_thread*/ )
ASSERT( server.current_balance()==int(tbb::internal::DetectNumberOfWorkers())-1, NULL );
}
-
int TestMain () {
StrictTeam = true;
VerifyInitialization<MyFactory,MyClient>( MaxThread );
diff --git a/src/rml/test/test_rml_tbb.cpp b/src/rml/test/test_rml_tbb.cpp
index eb423a7..247e2b3 100644
--- a/src/rml/test/test_rml_tbb.cpp
+++ b/src/rml/test/test_rml_tbb.cpp
@@ -26,70 +26,130 @@
the GNU General Public License.
*/
-#define HARNESS_DEFAULT_MIN_THREADS 0
-
#include "rml_tbb.h"
+#define HARNESS_DEFAULT_MIN_THREADS 0
#include "test_server.h"
typedef tbb::internal::rml::tbb_server MyServer;
typedef tbb::internal::rml::tbb_factory MyFactory;
+tbb::atomic<int> n_available_hw_threads;
+
class MyClient: public ClientBase<tbb::internal::rml::tbb_client> {
tbb::atomic<int> counter;
+ tbb::atomic<int> gate;
/*override*/void process( job& j ) {
do_process(j);
+ //wait until the gate is open.
+ while( gate==0 )
+ MilliSleep(1);
+
+ __TBB_ASSERT( nesting.limit<=2, NULL );
+ if( nesting.level>=nesting.limit )
+ return;
+
+ size_type max_outstanding_connections = max_job_count(); // if nesting.level==0
+ if( nesting.level==1 )
+ max_outstanding_connections *= (1+max_outstanding_connections);
+
+ if( default_concurrency()<=max_outstanding_connections+2 )
+ // i.e., if it is not guaranteed that at least two connections may be made without depleting the_balance
+ return;
+
+ // at this point, ( nesting.level<nesting.limit ) && ( my_server->default_concurrency()-max_outstanding_connections>2 )
+ for( ;; ) {
+ while( n_available_hw_threads<=1 )
+ MilliSleep(1);
+
+ int n = --n_available_hw_threads;
+ if( n>0 ) break;
+ // else I lost
+ ++n_available_hw_threads;
+ }
+
+ DoOneConnection<MyFactory,MyClient> doc(max_job_count(),Nesting(nesting.level+1,nesting.limit),0,false);
+ doc(0);
+
+ ++n_available_hw_threads;
}
public:
MyClient() {counter=1;}
static const bool is_omp = false;
bool is_strict() const {return false;}
+ void open_the_gate() { gate = 1; }
+ void close_the_gate() { gate = 0; }
};
void FireUpJobs( MyServer& server, MyClient& client, int n_thread, int n_extra, Checker* checker ) {
REMARK("client %d: calling adjust_job_count_estimate(%d)\n", client.client_id(),n_thread);
// Exercise independent_thread_number_changed, even for zero values.
server.independent_thread_number_changed( n_extra );
+#if _WIN32||_WIN64
+ ::rml::server::execution_resource_t me;
+ server.register_master( me );
+#endif /* _WIN32||_WIN64 */
// Experiments indicate that when oversubscribing, the main thread should wait a little
// while for the RML worker threads to do some work.
- int delay = n_thread>int(server.default_concurrency()) ? 50 : 1;
if( checker ) {
// Give RML time to respond to change in number of threads.
- MilliSleep(delay);
+ MilliSleep(1);
for( int k=0; k<n_thread; ++k )
client.job_array[k].processing_count = 0;
}
+ //close the gate to keep worker threads from returning to RML until a snapshot is taken
+ client.close_the_gate();
server.adjust_job_count_estimate( n_thread );
int n_used = 0;
if( checker ) {
- MilliSleep(delay);
+ MilliSleep(100);
for( int k=0; k<n_thread; ++k )
if( client.job_array[k].processing_count )
++n_used;
}
+ // open the gate
+ client.open_the_gate();
// Logic further below presumes that jobs never starve, so undo previous call
// to independent_thread_number_changed before waiting on those jobs.
server.independent_thread_number_changed( -n_extra );
REMARK("client %d: wait for each job to be processed at least once\n",client.client_id());
// Calculate the number of jobs that are expected to get threads.
- // Typically this is equal to n_thread. But if nested, subtract 1 to account for the fact
- // that this thread itself cannot process the job.
- int expected = client.nesting.level==0 ? n_thread : n_thread-1;
+ int expected = n_thread;
// Wait for expected number of jobs to be processed.
- if( client.nesting.level==0 ) {
- for(;;) {
- int n = 0;
- for( int k=0; k<n_thread; ++k )
- if( client.job_array[k].processing_count!=0 )
- ++n;
- if( n>=expected ) break;
- server.yield();
+#if RML_USE_WCRM
+ int default_concurrency = server.default_concurrency();
+ if( N_TestConnections>0 ) {
+ if( default_concurrency+1>=8 && n_thread<=3 && N_TestConnections<=3 && (default_concurrency/int(N_TestConnections)-1)>=n_thread ) {
+#endif /* RML_USE_WCRM */
+ for(;;) {
+ int n = 0;
+ for( int k=0; k<n_thread; ++k )
+ if( client.job_array[k].processing_count!=0 )
+ ++n;
+ if( n>=expected ) break;
+ server.yield();
+ }
+#if RML_USE_WCRM
+ } else if( n_thread>0 ) {
+ for( int m=0; m<20; ++m ) {
+ int n = 0;
+ for( int k=0; k<n_thread; ++k )
+ if( client.job_array[k].processing_count!=0 )
+ ++n;
+ if( n>=expected ) break;
+ MilliSleep(1);
+ }
}
- } else {
- REPORT("testing of nested tbb execution is yet to be supported\n");
}
+#endif /* RML_USE_WCRM */
server.adjust_job_count_estimate(-n_thread);
- if( checker )
+#if _WIN32||_WIN64
+ server.unregister_master( me );
+#endif
+ // Give RML some time to respond
+ if( checker ) {
+ MilliSleep(1);
checker->check_number_of_threads_delivered( n_used, n_thread, n_extra );
+ }
}
void DoClientSpecificVerification( MyServer&, int n_thread )
@@ -104,14 +164,34 @@ void DoClientSpecificVerification( MyServer&, int n_thread )
ASSERT( status==MyFactory::st_success, NULL );
MyFactory::server_type* server;
status = factory.make_server( server, *client );
- ASSERT( status==MyFactory::st_connection_exists, "Did the first connection get lost?" );
+ ASSERT( status==MyFactory::st_success, NULL );
+ client->set_server( server );
+ client->expect_close_connection = true;
+ server->request_close_connection();
+ // Client deletes itself when it sees call to acknowledge_close_connection from server.
+ factory.close();
+}
+
+void Initialize()
+{
+ MyClient* client = new MyClient;
+ client->initialize( 1, Nesting(), ClientStackSize[0] );
+ MyFactory factory;
+ memset( &factory, 0, sizeof(factory) );
+ factory.open();
+ MyFactory::server_type* server;
+ factory.make_server( server, *client );
+ client->set_server( server );
+ n_available_hw_threads = server->default_concurrency();
+ client->expect_close_connection = true;
+ server->request_close_connection();
+ // Client deletes itself when it sees call to acknowledge_close_connection from server.
factory.close();
- client->update(MyClient::destroyed, MyClient::live);
- delete client;
}
int TestMain () {
VerifyInitialization<MyFactory,MyClient>( MaxThread );
+ Initialize();
SimpleTest<MyFactory,MyClient>();
return Harness::Done;
}
diff --git a/src/rml/test/test_server.h b/src/rml/test/test_server.h
index 64866f7..1c24eef 100644
--- a/src/rml/test/test_server.h
+++ b/src/rml/test/test_server.h
@@ -38,6 +38,8 @@
#include "tbb/tbb_thread.h"
#include "harness.h"
#include "harness_memory.h"
+#include "harness_concurrency_tracker.h"
+
//! Define TRIVIAL as 1 to test only a single client, no nesting, no extra threads.
#define TRIVIAL 0
@@ -62,6 +64,10 @@ const size_t OverheadStackSize = 500000;
const size_t JobArraySize = 1000;
+static bool TestSingleConnection;
+
+static size_t N_TestConnections;
+
#if _WIN32||_WIN64
#include <Windows.h> /* Need Sleep */
#else
@@ -90,7 +96,7 @@ public:
clean
};
tbb::atomic<int> state;
- volatile int processing_count;
+ tbb::atomic<int> processing_count;
void update( state_t new_state, state_t old_state ) {
int o = state.compare_and_swap(new_state,old_state);
ASSERT( o==old_state, "illegal transition" );
@@ -188,6 +194,8 @@ public:
REMARK("client %d: cleanup(%p) called\n",client_id(),&j_);
ASSERT( state==live, NULL );
MyJob& j = static_cast<MyJob&>(j_);
+ while( j.state==MyJob::busy )
+ my_server->yield();
j.update(MyJob::clean,MyJob::idle);
REMARK("client %d: cleanup(%p) returns\n",client_id(),&j_);
}
@@ -200,14 +208,16 @@ protected:
MyJob& j = static_cast<MyJob&>(j_);
ASSERT( &j, NULL );
j.update(MyJob::busy,MyJob::idle);
- ++j.processing_count;
+ // use of the plain addition (not the atomic increment) is intentonial
+ j.processing_count = j.processing_count + 1;
ASSERT( my_stack_size>OverheadStackSize, NULL );
#ifdef __ia64__
// Half of the stack is reserved for RSE, so test only remaining half.
UseStackSpace( (my_stack_size-OverheadStackSize)/2 );
#else
+ // XNMetaScheduler does not expose API for changing stack size.
UseStackSpace( my_stack_size-OverheadStackSize );
-#endif
+#endif
j.update(MyJob::idle,MyJob::busy);
my_server->yield();
}
@@ -232,6 +242,8 @@ public:
void set_server( rml::server* s ) {my_server=s;}
+ unsigned default_concurrency() const { ASSERT( my_server, NULL); return my_server->default_concurrency(); }
+
virtual ~ClientBase() {
ASSERT( state==destroyed, NULL );
++ClientDestructions;
@@ -254,6 +266,18 @@ typename Client::job* ClientBase<Client>::create_one_job() {
return &j;
}
+struct warning_tracker {
+ tbb::atomic<int> n_more_than_available;
+ tbb::atomic<int> n_too_many_threads;
+ tbb::atomic<int> n_system_overload;
+ warning_tracker() {
+ n_more_than_available = 0;
+ n_too_many_threads = 0;
+ n_system_overload = 0;
+ }
+ bool all_set() { return n_more_than_available>0 && n_too_many_threads>0 && n_system_overload>0; }
+} tracker;
+
class Checker {
public:
int default_concurrency;
@@ -263,26 +287,32 @@ public:
void Checker::check_number_of_threads_delivered( int n_delivered, int n_requested, int n_extra ) const {
ASSERT( default_concurrency>=0, NULL );
+ if( tracker.all_set() ) return;
// Check that number of threads delivered is reasonable.
int n_avail = default_concurrency;
if( n_extra>0 )
n_avail-=n_extra;
if( n_avail<0 )
n_avail=0;
- // If the client asked for more threads than the hardware provides, the difference becomes private threads
- // that are available regardless of what else is running.
if( n_requested>default_concurrency )
n_avail += n_requested-default_concurrency;
int n_expected = n_requested;
if( n_expected>n_avail )
n_expected=n_avail;
const char* msg = NULL;
- if( n_delivered>n_avail )
+ if( n_delivered>n_avail ) {
+ if( ++tracker.n_more_than_available>1 )
+ return;
msg = "server delivered more threads than were theoretically available";
- else if( n_delivered>n_expected )
+ } else if( n_delivered>n_expected ) {
+ if( ++tracker.n_too_many_threads>1 )
+ return;
msg = "server delivered more threads than expected";
- else if( n_delivered<n_expected )
- msg = "server delivered fewer threads than ideal";
+ } else if( n_delivered<n_expected ) {
+ if( ++tracker.n_system_overload>1 )
+ return;
+ msg = "server delivered fewer threads than ideal; or, the system is overloaded?";
+ }
if( msg ) {
REPORT("Warning: %s (n_delivered=%d n_avail=%d n_requested=%d n_extra=%d default_concurrency=%d)\n",
msg, n_delivered, n_avail, n_requested, n_extra, default_concurrency );
@@ -320,12 +350,14 @@ void DoOneConnection<Factory,Client>::operator()( size_t i ) const {
Factory factory;
memset( &factory, 0, sizeof(factory) );
typename Factory::status_type status = factory.open();
+ ASSERT( status==Factory::st_success, NULL );
typename Factory::server_type* server;
status = factory.make_server( server, *client );
+ ASSERT( status==Factory::st_success, NULL );
+ Harness::ConcurrencyTracker ct;
REMARK("client %d: opened server n_thread=%d nesting=(%d,%d)\n",
client->client_id(), n_thread, nesting.level, nesting.limit);
-
client->set_server( server );
Checker checker( *server );
@@ -334,23 +366,55 @@ void DoOneConnection<Factory,Client>::operator()( size_t i ) const {
// Close the connection
client->expect_close_connection = true;
REMARK("client %d: calling request_close_connection\n", client->client_id());
+#if !RML_USE_WCRM
+ int default_concurrency = server->default_concurrency();
+#endif
server->request_close_connection();
// Client deletes itself when it sees call to acknowledge_close_connection from server.
factory.close();
+#if !RML_USE_WCRM
+ if( TestSingleConnection )
+ __TBB_ASSERT_EX( uintptr_t(factory.scratch_ptr)==uintptr_t(default_concurrency), "under/over subscription?" );
+#endif
}
//! Test with n_threads threads and n_client clients.
template<typename Factory, typename Client>
void SimpleTest() {
+ Harness::ConcurrencyTracker::Reset();
+ TestSingleConnection = true;
+ N_TestConnections = 1;
+ for( int n_thread=MinThread; n_thread<=MaxThread; ++n_thread ) {
+ // Test a single connection, no nesting, no extra threads
+ DoOneConnection<Factory,Client> doc(n_thread,Nesting(0,0),0,false);
+ doc(0);
+ }
+#if !TRIVIAL
+ TestSingleConnection = false;
for( int n_thread=MinThread; n_thread<=MaxThread; ++n_thread ) {
+ // Test parallel connections
+ for( int n_client=1; n_client<=int(MaxClient); ++n_client ) {
+ N_TestConnections = n_client;
+ REMARK("SimpleTest: n_thread=%d n_client=%d\n",n_thread,n_client);
+ NativeParallelFor( n_client, DoOneConnection<Factory,Client>(n_thread,Nesting(0,0),0,false) );
+ }
+ // Test server::independent_thread_number_changed
+ N_TestConnections = 1;
+ for( int n_extra=-4; n_extra<=32; n_extra=n_extra+1+n_extra/5 ) {
+ DoOneConnection<Factory,Client> doc(n_thread,Nesting(0,0),n_extra,true);
+ doc(0);
+ }
+#if !RML_USE_WCRM
// Test nested connections
- DoOneConnection<Factory,Client> doc(n_thread,Nesting(0,1),0,false);
+ DoOneConnection<Factory,Client> doc(n_thread,Nesting(0,2),0,false);
doc(0);
+#endif
}
+ ASSERT( Harness::ConcurrencyTracker::PeakParallelism()>1, "No multiple connections exercised?" );
+#endif /* !TRIVIAL */
// Let RML catch up.
- while( ClientConstructions!=ClientDestructions ) {
+ while( ClientConstructions!=ClientDestructions )
MilliSleep(1);
- }
}
static void check_server_info( void* arg, const char* server_info )
@@ -368,7 +432,7 @@ void VerifyInitialization( int n_thread ) {
ASSERT( status!=Factory::st_not_found, "could not find RML library" );
ASSERT( status!=Factory::st_incompatible, NULL );
ASSERT( status==Factory::st_success, NULL );
- factory.call_with_server_info( check_server_info, (void*)"Intel(R) RML library built:" );
+ factory.call_with_server_info( check_server_info, (void*)"Intel(R) RML library" );
typename Factory::server_type* server;
status = factory.make_server( server, *client );
ASSERT( status!=Factory::st_incompatible, NULL );
@@ -380,7 +444,7 @@ void VerifyInitialization( int n_thread ) {
client->set_server( server );
DoClientSpecificVerification( *server, n_thread );
-
+
// Close the connection
client->expect_close_connection = true;
REMARK("client %d: calling request_close_connection\n", client->client_id());
diff --git a/src/rml/test/test_thread_monitor.cpp b/src/rml/test/test_thread_monitor.cpp
index 2854861..6a168e9 100644
--- a/src/rml/test/test_thread_monitor.cpp
+++ b/src/rml/test/test_thread_monitor.cpp
@@ -43,9 +43,10 @@ public:
volatile int ack;
volatile unsigned clock;
volatile unsigned stamp;
- ThreadState() : request(-1), ack(-1) {}
+ ThreadState() : request(-1), ack(-1), clock(0) {}
};
+
void ThreadState::loop() {
for(;;) {
++clock;
diff --git a/src/tbb/arena.cpp b/src/tbb/arena.cpp
new file mode 100644
index 0000000..8838043
--- /dev/null
+++ b/src/tbb/arena.cpp
@@ -0,0 +1,386 @@
+/*
+ Copyright 2005-2010 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 "arena.h"
+#include "governor.h"
+#include "scheduler.h"
+#include "itt_notify.h"
+
+#include <stdlib.h> // for rand()
+
+namespace tbb {
+namespace internal {
+
+#if !__TBB_ARENA_PER_MASTER
+//------------------------------------------------------------------------
+// UnpaddedArenaPrefix
+//------------------------------------------------------------------------
+inline arena& UnpaddedArenaPrefix::Arena() {
+ return *static_cast<tbb::internal::arena*>(static_cast<void*>( static_cast<ArenaPrefix*>(this)+1 ));
+}
+
+void UnpaddedArenaPrefix::process( job& j ) {
+ generic_scheduler& s = static_cast<generic_scheduler&>(j);
+ __TBB_ASSERT( governor::is_set(&s), NULL );
+ __TBB_ASSERT( !s.innermost_running_task, NULL );
+ // Try to steal a task.
+ // Passing reference count is technically unnecessary in this context,
+ // but omitting it here would add checks inside the function.
+ task* t = s.receive_or_steal_task( s.dummy_task->prefix().ref_count, /*return_if_no_work=*/true );
+ if (t) {
+ // A side effect of receive_or_steal_task is that innermost_running_task can be set.
+ // But for the outermost dispatch loop of a worker it has to be NULL.
+ s.innermost_running_task = NULL;
+ s.local_wait_for_all(*s.dummy_task,t);
+ }
+ __TBB_ASSERT( s.inbox.assert_is_idle(true), NULL );
+ __TBB_ASSERT( !s.innermost_running_task, NULL );
+}
+
+void UnpaddedArenaPrefix::cleanup( job& j ) {
+ generic_scheduler& s = static_cast<generic_scheduler&>(j);
+ if( !governor::is_set( &s ) ) {
+ bool is_master = governor::is_set( NULL );
+ governor::assume_scheduler( &s );
+ generic_scheduler::cleanup_worker( &s, !is_master );
+ governor::assume_scheduler( NULL );
+ } else {
+ generic_scheduler::cleanup_worker( &s, true );
+ }
+}
+
+void UnpaddedArenaPrefix::acknowledge_close_connection() {
+ Arena().free_arena();
+}
+
+::rml::job* UnpaddedArenaPrefix::create_one_job() {
+ generic_scheduler* s = generic_scheduler::create_worker( Arena(), next_job_index++ );
+ governor::sign_on(s);
+ return s;
+}
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+//------------------------------------------------------------------------
+// arena
+//------------------------------------------------------------------------
+
+#if __TBB_ARENA_PER_MASTER
+
+void arena::process( generic_scheduler& s ) {
+ __TBB_ASSERT( governor::is_set(&s), NULL );
+ __TBB_ASSERT( !s.innermost_running_task, NULL );
+
+ __TBB_ASSERT( my_num_slots != 1, NULL );
+ // Start search for an empty slot from the one we occupied the last time
+ unsigned index = s.arena_index < my_num_slots ? s.arena_index : s.random.get() % (my_num_slots - 1) + 1,
+ end = index;
+ __TBB_ASSERT( index != 0, "A worker cannot occupy slot 0" );
+ __TBB_ASSERT( index < my_num_slots, NULL );
+
+ // Find a vacant slot
+ for ( ;; ) {
+ if ( !slot[index].my_scheduler && __TBB_CompareAndSwapW( &slot[index].my_scheduler, (intptr_t)&s, 0 ) == 0 )
+ break;
+ if ( ++index == my_num_slots )
+ index = 1;
+ if ( index == end ) {
+ // Likely this arena is already saturated
+ if ( --my_num_threads_active == 0 )
+ close_arena();
+ return;
+ }
+ }
+ ITT_NOTIFY(sync_acquired, &slot[index]);
+ s.my_arena = this;
+ s.arena_index = index;
+ s.attach_mailbox( affinity_id(index+1) );
+
+ slot[index].hint_for_push = index ^ unsigned(&s-(generic_scheduler*)NULL)>>16; // randomizer seed
+ slot[index].hint_for_pop = index; // initial value for round-robin
+
+ unsigned new_limit = index + 1;
+ unsigned old_limit = my_limit;
+ while ( new_limit > old_limit ) {
+ if ( my_limit.compare_and_swap(new_limit, old_limit) == old_limit )
+ break;
+ old_limit = my_limit;
+ }
+
+ unsigned num_threads_left;
+ for ( ;; ) {
+ // Try to steal a task.
+ // Passing reference count is technically unnecessary in this context,
+ // but omitting it here would add checks inside the function.
+ task* t = s.receive_or_steal_task( s.dummy_task->prefix().ref_count, /*return_if_no_work=*/true );
+ if (t) {
+ // A side effect of receive_or_steal_task is that innermost_running_task can be set.
+ // But for the outermost dispatch loop of a worker it has to be NULL.
+ s.innermost_running_task = NULL;
+ s.local_wait_for_all(*s.dummy_task,t);
+ }
+ num_threads_left = --my_num_threads_active;
+ __TBB_ASSERT ( slot[index].head == slot[index].tail, "Worker cannot leave arena when the task pool is not empty" );
+ __TBB_ASSERT( slot[index].task_pool == EmptyTaskPool, "Worker cannot leave arena when the task pool is not empty" );
+ // Revalidate quitting condition
+ // This check prevents relinquishing more than necessary workers because
+ // of the non-atomicity of the decision making procedure
+ if ( num_workers_active() >= my_num_workers_allotted || !my_num_workers_requested )
+ break;
+ // Restore ref count
+ __TBB_ASSERT( !slot[0].my_scheduler || my_num_threads_active > 0, "Who requested more workers after the last one left the dispatch loop and the master's gone?" );
+ ++my_num_threads_active;
+ }
+ __TBB_store_with_release( slot[index].my_scheduler, (generic_scheduler*)NULL );
+ s.inbox.detach();
+ __TBB_ASSERT( s.inbox.assert_is_idle(true), NULL );
+ __TBB_ASSERT( !s.innermost_running_task, NULL );
+ if ( !num_threads_left )
+ close_arena();
+}
+
+arena::arena ( market& m, unsigned max_num_workers ) {
+ __TBB_ASSERT( sizeof(slot[0]) % NFS_GetLineSize()==0, "arena::slot size not multiple of cache line size" );
+ __TBB_ASSERT( (uintptr_t)this % NFS_GetLineSize()==0, "arena misaligned" );
+ my_market = &m;
+ my_limit = 1;
+ // Two slots are mandatory: for the master, and for 1 worker (required to support starvation resistant tasks).
+ my_num_slots = max(2u, max_num_workers + 1);
+ my_max_num_workers = max_num_workers;
+ my_num_threads_active = 1; // accounts for the master
+ __TBB_ASSERT ( my_max_num_workers < my_num_slots, NULL );
+ // Construct mailboxes. Mark internal synchronization elements for the tools.
+ for( unsigned i = 0; i < my_num_slots; ++i ) {
+ __TBB_ASSERT( !slot[i].my_scheduler && !slot[i].task_pool, NULL );
+ ITT_SYNC_CREATE(slot + i, SyncType_Scheduler, SyncObj_WorkerTaskPool);
+ mailbox(i+1).construct();
+ ITT_SYNC_CREATE(&mailbox(i+1), SyncType_Scheduler, SyncObj_Mailbox);
+ }
+ my_task_stream.initialize(my_num_slots);
+ ITT_SYNC_CREATE(&my_task_stream, SyncType_Scheduler, SyncObj_TaskStream);
+ my_mandatory_concurrency = false;
+#if __TBB_TASK_GROUP_CONTEXT
+ my_master_default_ctx = NULL;
+#endif
+}
+
+arena& arena::allocate_arena( market& m, unsigned max_num_workers ) {
+ __TBB_ASSERT( sizeof(base_type) + sizeof(arena_slot) == sizeof(arena), "All arena data fields must go to arena_base" );
+ __TBB_ASSERT( sizeof(base_type) % NFS_GetLineSize() == 0, "arena slots area misaligned: wrong padding" );
+ __TBB_ASSERT( sizeof(mail_outbox) == NFS_MaxLineSize, "Mailbox padding is wrong" );
+
+ unsigned num_slots = max(2u, max_num_workers + 1);
+ size_t n = sizeof(base_type) + num_slots * (sizeof(mail_outbox) + sizeof(arena_slot));
+
+ unsigned char* storage = (unsigned char*)NFS_Allocate( n, 1, NULL );
+ // Zero all slots to indicate that they are empty
+ memset( storage, 0, n );
+ return *new( storage + num_slots * sizeof(mail_outbox) ) arena(m, max_num_workers);
+}
+
+void arena::free_arena () {
+ __TBB_ASSERT( !my_num_threads_active, "There are threads in the dying arena" );
+ intptr_t drained = 0;
+ for ( unsigned i = 1; i <= my_num_slots; ++i )
+ drained += mailbox(i).drain();
+ __TBB_ASSERT(my_task_stream.empty() && my_task_stream.drain()==0, "Not all enqueued tasks were executed");
+#if __TBB_COUNT_TASK_NODES
+ my_market->update_task_node_count( -drained );
+#endif /* __TBB_COUNT_TASK_NODES */
+ my_market->release();
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT( my_master_default_ctx, "Master thread never entered the arena?" );
+ my_master_default_ctx->~task_group_context();
+ NFS_Free(my_master_default_ctx);
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ void* storage = &mailbox(my_num_slots);
+ this->~arena();
+ NFS_Free( storage );
+}
+
+#else /* !__TBB_ARENA_PER_MASTER */
+
+arena* arena::allocate_arena( unsigned number_of_slots, unsigned number_of_workers, stack_size_type stack_size ) {
+ __TBB_ASSERT( sizeof(ArenaPrefix) % NFS_GetLineSize()==0, "ArenaPrefix not multiple of cache line size" );
+ __TBB_ASSERT( sizeof(mail_outbox)==NFS_MaxLineSize, NULL );
+ __TBB_ASSERT( stack_size>0, NULL );
+
+ size_t n = sizeof(ArenaPrefix) + number_of_slots*(sizeof(mail_outbox)+sizeof(arena_slot));
+
+ unsigned char* storage = (unsigned char*)NFS_Allocate( n, 1, NULL );
+ // Zero all slots to indicate that they are empty
+ memset( storage, 0, n );
+ arena* a = (arena*)(storage + sizeof(ArenaPrefix)+ number_of_slots*(sizeof(mail_outbox)));
+ __TBB_ASSERT( sizeof(a->slot[0]) % NFS_GetLineSize()==0, "arena::slot size not multiple of cache line size" );
+ __TBB_ASSERT( (uintptr_t)a % NFS_GetLineSize()==0, NULL );
+ new( &a->prefix() ) ArenaPrefix( number_of_slots, number_of_workers );
+
+ // Allocate the worker_list
+ WorkerDescriptor * w = new WorkerDescriptor[number_of_workers];
+ memset( w, 0, sizeof(WorkerDescriptor)*(number_of_workers));
+ a->prefix().worker_list = w;
+
+ // Construct mailboxes.
+ for( unsigned j=1; j<=number_of_slots; ++j )
+ a->mailbox(j).construct();
+
+ a->prefix().stack_size = stack_size;
+ size_t k;
+ // Mark each internal sync element for the tools
+ for( k=0; k<number_of_workers; ++k ) {
+ ITT_SYNC_CREATE(a->slot + k, SyncType_Scheduler, SyncObj_WorkerTaskPool);
+ ITT_SYNC_CREATE(&w[k].scheduler, SyncType_Scheduler, SyncObj_WorkerLifeCycleMgmt);
+ ITT_SYNC_CREATE(&a->mailbox(k+1), SyncType_Scheduler, SyncObj_Mailbox);
+ }
+ for( ; k<number_of_slots; ++k ) {
+ ITT_SYNC_CREATE(a->slot + k, SyncType_Scheduler, SyncObj_MasterTaskPool);
+ ITT_SYNC_CREATE(&a->mailbox(k+1), SyncType_Scheduler, SyncObj_Mailbox);
+ }
+
+ return a;
+}
+
+void arena::free_arena () {
+ // Drain mailboxes
+ // TODO: each scheduler should plug-and-drain its own mailbox when it terminates.
+ intptr_t drain_count = 0;
+ for( unsigned i=1; i<=prefix().number_of_slots; ++i )
+ drain_count += mailbox(i).drain();
+#if __TBB_COUNT_TASK_NODES
+ prefix().task_node_count -= drain_count;
+ if( prefix().task_node_count ) {
+ runtime_warning( "Leaked %ld task objects\n", long(prefix().task_node_count) );
+ }
+#endif /* __TBB_COUNT_TASK_NODES */
+ void* storage = &mailbox(prefix().number_of_slots);
+ delete[] prefix().worker_list;
+ prefix().~ArenaPrefix();
+ NFS_Free( storage );
+}
+
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+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().pool_state;
+ switch( snapshot ) {
+ case SNAPSHOT_EMPTY:
+#if !__TBB_ARENA_PER_MASTER
+ case SNAPSHOT_SERVER_GOING_AWAY:
+#endif /* !__TBB_ARENA_PER_MASTER */
+ return true;
+ case SNAPSHOT_FULL: {
+ // 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().pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {
+ // Got permission. Take the snapshot.
+#if __TBB_ARENA_PER_MASTER
+ size_t n = my_limit;
+#else /* !__TBB_ARENA_PER_MASTER */
+ size_t n = prefix().limit;
+#endif /* !__TBB_ARENA_PER_MASTER */
+ size_t k;
+ for( k=0; k<n; ++k )
+ if( slot[k].task_pool != EmptyTaskPool && slot[k].head < slot[k].tail )
+ break;
+ bool work_absent = k>=n;
+#if __TBB_ARENA_PER_MASTER
+ work_absent = work_absent && my_task_stream.empty();
+#endif /* __TBB_ARENA_PER_MASTER */
+ // Test and test-and-set.
+ if( prefix().pool_state==busy ) {
+ if( work_absent ) {
+#if __TBB_ARENA_PER_MASTER
+ // save current demand value before setting SNAPSHOT_EMPTY,
+ // to avoid race with advertise_new_work.
+ int current_demand = (int)my_max_num_workers;
+#endif
+ if( prefix().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.
+#if __TBB_ARENA_PER_MASTER
+ my_market->adjust_demand( *this, -current_demand );
+#else /* !__TBB_ARENA_PER_MASTER */
+ prefix().server->adjust_job_count_estimate( -int(prefix().number_of_workers) );
+#endif /* !__TBB_ARENA_PER_MASTER */
+ return true;
+ }
+ } else {
+ // Undo previous transition SNAPSHOT_FULL-->busy, unless another thread undid it.
+ prefix().pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
+ }
+ }
+ }
+ return false;
+ }
+ default:
+ // Another thread is taking a snapshot.
+ return false;
+ }
+ }
+}
+
+void arena::close_arena () {
+#if __TBB_ARENA_PER_MASTER
+ my_market->detach_arena( *this );
+ free_arena();
+#else /* !__TBB_ARENA_PER_MASTER */
+ for(;;) {
+ pool_state_t snapshot = prefix().pool_state;
+ if( snapshot==SNAPSHOT_SERVER_GOING_AWAY )
+ break;
+ if( prefix().pool_state.compare_and_swap( SNAPSHOT_SERVER_GOING_AWAY, snapshot )==snapshot ) {
+ if( snapshot!=SNAPSHOT_EMPTY )
+ prefix().server->adjust_job_count_estimate( -int(prefix().number_of_workers) );
+ break;
+ }
+ }
+ prefix().server->request_close_connection();
+#endif /* !__TBB_ARENA_PER_MASTER */
+}
+
+#if __TBB_COUNT_TASK_NODES
+intptr_t arena::workers_task_node_count() {
+ intptr_t result = 0;
+#if __TBB_ARENA_PER_MASTER
+ for( unsigned i = 1; i < my_num_slots; ++i ) {
+ generic_scheduler* s = slot[i].my_scheduler;
+#else /* !__TBB_ARENA_PER_MASTER */
+ for( unsigned i=0; i<prefix().number_of_workers; ++i ) {
+ generic_scheduler* s = prefix().worker_list[i].scheduler;
+#endif /* !__TBB_ARENA_PER_MASTER */
+ if( s )
+ result += s->task_node_count;
+ }
+ return result;
+}
+#endif /* __TBB_COUNT_TASK_NODES */
+
+} // namespace internal
+} // namespace tbb
diff --git a/src/tbb/arena.h b/src/tbb/arena.h
new file mode 100644
index 0000000..806c192
--- /dev/null
+++ b/src/tbb/arena.h
@@ -0,0 +1,482 @@
+/*
+ Copyright 2005-2010 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_arena_H
+#define _TBB_arena_H
+
+#include "tbb/tbb_stddef.h"
+#include "tbb/atomic.h"
+
+#if __TBB_ARENA_PER_MASTER
+#include "market.h"
+#include "intrusive_list.h"
+#include "task_stream.h"
+#else /* !__TBB_ARENA_PER_MASTER */
+#include "../rml/include/rml_tbb.h"
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+#include "mailbox.h"
+
+namespace tbb {
+
+#if __TBB_ARENA_PER_MASTER
+class task_group_context;
+class allocate_root_with_context_proxy;
+#endif /* __TBB_ARENA_PER_MASTER */
+
+namespace internal {
+
+class governor;
+class arena;
+class generic_scheduler;
+template<typename SchedulerTraits> class custom_scheduler;
+
+#if !__TBB_ARENA_PER_MASTER
+//------------------------------------------------------------------------
+// UnpaddedArenaPrefix
+//------------------------------------------------------------------------
+
+struct WorkerDescriptor {
+ //! NULL until worker is published. -1 if worker should not be published.
+ generic_scheduler* scheduler;
+};
+
+//! The useful contents of an ArenaPrefix
+class UnpaddedArenaPrefix: no_copy, rml::tbb_client {
+ friend class generic_scheduler;
+ template<typename SchedulerTraits> friend class custom_scheduler;
+ friend class arena;
+ friend class governor;
+ friend struct WorkerDescriptor;
+
+ //! Arena slot to try to acquire first for the next new master.
+ unsigned limit;
+
+ //! Number of masters that own this arena.
+ /** This may be smaller than the number of masters who have entered the arena. */
+ unsigned number_of_masters;
+
+ //! Total number of slots in the arena
+ const unsigned number_of_slots;
+
+ //! Number of workers that belong to this arena
+ const unsigned number_of_workers;
+
+ //! Pointer to the RML server object that services requests for this arena.
+ rml::tbb_server* server;
+
+ //! Counter used to allocate job indices
+ tbb::atomic<size_t> next_job_index;
+
+ //! Stack size of worker threads
+ size_t stack_size;
+
+ //! Array of workers.
+ WorkerDescriptor* worker_list;
+
+#if __TBB_COUNT_TASK_NODES
+ //! Net number of nodes that have been allocated from heap.
+ /** Updated each time a scheduler is destroyed. */
+ atomic<intptr_t> task_node_count;
+#endif /* __TBB_COUNT_TASK_NODES */
+
+ //! Estimate of number of available tasks.
+ /** The estimate is either 0 (SNAPSHOT_EMPTY), infinity (SNAPSHOT_FULL), or a special value.
+ The implementation of arena::is_busy_or_empty requires that pool_state_t be unsigned. */
+ typedef uintptr_t pool_state_t;
+
+ //! Current estimate of number of available tasks.
+ tbb::atomic<pool_state_t> pool_state;
+
+protected:
+ UnpaddedArenaPrefix( unsigned number_of_slots_, unsigned number_of_workers_ ) :
+ number_of_masters(1),
+ number_of_slots(number_of_slots_),
+ number_of_workers(number_of_workers_)
+ {
+#if __TBB_COUNT_TASK_NODES
+ task_node_count = 0;
+#endif /* __TBB_COUNT_TASK_NODES */
+ limit = number_of_workers_;
+ server = NULL;
+ stack_size = 0;
+ next_job_index = 0;
+ }
+
+private:
+ //! Return reference to corresponding arena.
+ arena& Arena();
+
+ /*override*/ version_type version() const {
+ return 0;
+ }
+
+ /*override*/ unsigned max_job_count() const {
+ return number_of_workers;
+ }
+
+ /*override*/ size_t min_stack_size() const {
+ return stack_size;
+ }
+
+ /*override*/ policy_type policy() const {
+ return throughput;
+ }
+
+ /*override*/ job* create_one_job();
+
+ /*override*/ void cleanup( job& j );
+
+ /*override*/ void acknowledge_close_connection();
+
+ /*override*/ void process( job& j );
+}; // class UnpaddedArenaPrefix
+
+//------------------------------------------------------------------------
+// ArenaPrefix
+//------------------------------------------------------------------------
+
+//! The prefix to arena with padding.
+class ArenaPrefix: public UnpaddedArenaPrefix {
+ //! Padding to fill out to multiple of cache line size.
+ char pad[(sizeof(UnpaddedArenaPrefix)/NFS_MaxLineSize+1)*NFS_MaxLineSize-sizeof(UnpaddedArenaPrefix)];
+
+public:
+ ArenaPrefix( unsigned number_of_slots_, unsigned number_of_workers_ ) :
+ UnpaddedArenaPrefix(number_of_slots_,number_of_workers_)
+ {
+ }
+}; // class ArenaPrefix
+
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+//------------------------------------------------------------------------
+// arena_slot
+//------------------------------------------------------------------------
+
+struct arena_slot {
+#if __TBB_ARENA_PER_MASTER
+ //! Scheduler of the thread attached to the slot
+ /** Marks the slot as busy, and is used to iterate through the schedulers belonging to this arena **/
+ generic_scheduler* my_scheduler;
+#endif /* __TBB_ARENA_PER_MASTER */
+
+ // Task pool (the deque of task pointers) of the scheduler that owns this slot
+ /** Also is used to specify if the slot is empty or locked:
+ 0 - empty
+ -1 - locked **/
+ task** task_pool;
+
+ //! Index of the first ready task in the deque.
+ /** Modified by thieves, and by the owner during compaction/reallocation **/
+ size_t head;
+
+ //! Padding to avoid false sharing caused by the thieves accessing this slot
+ char pad1[NFS_MaxLineSize - sizeof(size_t) - sizeof(task**)
+#if __TBB_ARENA_PER_MASTER
+ - sizeof(generic_scheduler*)
+#endif /* __TBB_ARENA_PER_MASTER */
+ ];
+
+ //! Index of the element following the last ready task in the deque.
+ /** Modified by the owner thread. **/
+ size_t tail;
+
+#if __TBB_ARENA_PER_MASTER
+ //! Hints provided for operations with the container of starvation-resistant tasks.
+ /** Modified by the owner thread (during these operations). **/
+ unsigned hint_for_push, hint_for_pop;
+
+#endif /* __TBB_ARENA_PER_MASTER */
+ //! Padding to avoid false sharing caused by the thieves accessing the next slot
+ char pad2[NFS_MaxLineSize - sizeof(size_t)
+#if __TBB_ARENA_PER_MASTER
+ - 2*sizeof(unsigned)
+#endif /* __TBB_ARENA_PER_MASTER */
+ ];
+}; // class arena_slot
+
+//------------------------------------------------------------------------
+// arena
+//------------------------------------------------------------------------
+
+#if __TBB_ARENA_PER_MASTER
+
+//! arena data except the array of slots
+/** Separated in order to simplify padding.
+ Intrusive list node base class is used by market to form a list of arenas. **/
+struct arena_base : intrusive_list_node {
+ //! Market owning this arena
+ market* my_market;
+
+ //! Maximal currently busy slot.
+ atomic<unsigned> my_limit;
+
+ //! Number of slots in the arena
+ unsigned my_num_slots;
+
+ //! Number of workers requested by the master thread owning the arena
+ unsigned my_max_num_workers;
+
+ //! Number of workers that are currently requested from the resource manager
+ atomic<int> my_num_workers_requested;
+
+ //! Number of workers that have been marked out by the resource manager to service the arena
+ unsigned my_num_workers_allotted;
+
+ //! Number of threads in the arena at the moment
+ /** Consists of the workers servicing the arena and one master until it starts
+ arena shutdown and detaches from it. Plays the role of the arena's ref count. **/
+ atomic<unsigned> my_num_threads_active;
+
+ //! Current task pool state and estimate of available tasks amount.
+ /** The estimate is either 0 (SNAPSHOT_EMPTY) or infinity (SNAPSHOT_FULL).
+ Special state is "busy" (any other unsigned value).
+ Note that the implementation of arena::is_busy_or_empty() requires
+ pool_state to be unsigned. */
+ tbb::atomic<uintptr_t> pool_state;
+
+#if __TBB_TASK_GROUP_CONTEXT
+ //! Pointer to the "default" task_group_context allocated by the arena's master.
+ task_group_context* my_master_default_ctx;
+#endif
+
+ //! The task pool that guarantees eventual execution even if new tasks are constantly coming.
+ task_stream my_task_stream;
+
+ bool my_mandatory_concurrency;
+}; // struct arena_base
+
+#endif /* __TBB_ARENA_PER_MASTER */
+
+class arena
+#if __TBB_ARENA_PER_MASTER
+#if (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__==0) && !__INTEL_COMPILER
+ : public padded<arena_base>
+#else
+ : padded<arena_base>
+#endif
+#endif /* __TBB_ARENA_PER_MASTER */
+{
+ friend class generic_scheduler;
+ template<typename SchedulerTraits> friend class custom_scheduler;
+ friend class governor;
+
+#if __TBB_ARENA_PER_MASTER
+ friend class market;
+ friend class tbb::task_group_context;
+ friend class allocate_root_with_context_proxy;
+ friend class intrusive_list<arena>;
+
+ typedef padded<arena_base> base_type;
+
+ //! 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 );
+
+#if __TBB_TASK_GROUP_CONTEXT
+ //! Propagates cancellation request to all descendants of the context.
+ /** The propagation is relayed to the market because tasks created by one
+ master thread can be passed to and executed by other masters. This means
+ that context trees can span several arenas at once and thus cancellation
+ propagation cannot be generally localized to one arena only. **/
+ void propagate_cancellation ( task_group_context& ctx ) {
+ my_market->propagate_cancellation( ctx );
+ }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#else /* !__TBB_ARENA_PER_MASTER */
+
+ friend class UnpaddedArenaPrefix;
+ friend struct WorkerDescriptor;
+
+ //! Get reference to prefix portion
+ ArenaPrefix& prefix() const {return ((ArenaPrefix*)(void*)this)[-1];}
+
+ //! Allocate an instance of arena, and prepare everything to start workers.
+ static arena* allocate_arena( unsigned num_slots, unsigned num_workers, size_t stack_size );
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Get reference to mailbox corresponding to given affinity_id.
+ mail_outbox& mailbox( affinity_id id ) {
+ __TBB_ASSERT( 0<id, "affinity id must be positive integer" );
+#if __TBB_ARENA_PER_MASTER
+ __TBB_ASSERT( id <= my_num_slots, "affinity id out of bounds" );
+#else /* !__TBB_ARENA_PER_MASTER */
+ __TBB_ASSERT( id <= prefix().number_of_slots, "id out of bounds" );
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ return ((mail_outbox*)&prefix())[-(int)id];
+ }
+
+ //! Completes arena shutdown, destructs and deallocates it.
+ void free_arena ();
+
+ typedef uintptr_t pool_state_t;
+
+ //! No tasks to steal since last snapshot was taken
+ static const pool_state_t SNAPSHOT_EMPTY = 0;
+
+ //! At least one task has been offered for stealing since the last snapshot started
+ static const pool_state_t SNAPSHOT_FULL = pool_state_t(-1);
+
+#if __TBB_ARENA_PER_MASTER
+ //! No tasks to steal or snapshot is being taken.
+ static bool is_busy_or_empty( pool_state_t s ) { return s < SNAPSHOT_FULL; }
+
+ //! The number of workers active in the arena.
+ unsigned num_workers_active( ) {
+ return my_num_threads_active - (slot[0].my_scheduler? 1: 0);
+ }
+
+ //! If necessary, raise a flag that there is new job in arena.
+ template<bool Spawned> void advertise_new_work();
+#else /*__TBB_ARENA_PER_MASTER*/
+ //! Server is going away and hence further calls to adjust_job_count_estimate are unsafe.
+ static const pool_state_t SNAPSHOT_SERVER_GOING_AWAY = pool_state_t(-2);
+
+ //! No tasks to steal or snapshot is being taken.
+ static bool is_busy_or_empty( pool_state_t s ) { return s < SNAPSHOT_SERVER_GOING_AWAY; }
+
+ //! If necessary, raise a flag that task was added to pool recently.
+ inline void mark_pool_full();
+#endif /* __TBB_ARENA_PER_MASTER */
+
+ //! Check if there is job anywhere in arena.
+ /** Return true if no job or if arena is being cleaned up. */
+ bool is_out_of_work();
+
+ //! Initiates arena shutdown.
+ void close_arena ();
+
+#if __TBB_ARENA_PER_MASTER
+ void process( generic_scheduler& s );
+#endif
+
+#if __TBB_COUNT_TASK_NODES
+ //! Returns the number of task objects "living" in worker threads
+ intptr_t workers_task_node_count();
+#endif
+
+ /** Must be the last data field */
+ arena_slot slot[1];
+}; // class arena
+
+
+#if __TBB_ARENA_PER_MASTER
+template<bool Spawned> void arena::advertise_new_work() {
+ if( !Spawned ) { // i.e. the work was enqueued
+ if( my_max_num_workers==0 ) {
+ my_max_num_workers = 1;
+ my_mandatory_concurrency = true;
+ prefix().pool_state = SNAPSHOT_FULL;
+ my_market->adjust_demand( *this, 1 );
+ return;
+ }
+ // Local memory fence is required to avoid missed wakeups; see the comment below.
+ // Starvation resistant tasks require mandatory concurrency, so missed wakeups are unacceptable.
+ __TBB_rel_acq_fence();
+ }
+ // Double-check idiom that, in case of spawning, is deliberately sloppy about memory fences.
+ // Technically, to avoid missed wakeups, there should be a full memory fence between the point we
+ // released the task pool (i.e. spawned task) and read the arena's state. However, adding such a
+ // 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().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().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
+ // pool_state to "empty" in the meantime, which caused the compare_and_swap above
+ // to fail. Attempt to transition pool_state from "empty" to "full".
+ if( prefix().pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
+ // Some other thread transitioned pool_state from "empty", and hence became
+ // responsible for waking up workers.
+ return;
+ }
+ }
+ // This thread transitioned pool from empty to full state, and thus is responsible for
+ // telling RML that there is work to do.
+ if( Spawned ) {
+ if( my_mandatory_concurrency ) {
+ __TBB_ASSERT(my_max_num_workers==1, "");
+ // There was deliberate oversubscription on 1 core for sake of starvation-resistant tasks.
+ // Now a single active thread (must be the master) supposedly starts a new parallel region
+ // with relaxed sequential semantics, and oversubscription should be avoided.
+ // Demand for workers has been decreased to 0 during SNAPSHOT_EMPTY, so just keep it.
+ my_max_num_workers = 0;
+ my_mandatory_concurrency = false;
+ return;
+ }
+ }
+ my_market->adjust_demand( *this, my_max_num_workers );
+ }
+ }
+}
+#else /* !__TBB_ARENA_PER_MASTER */
+inline void arena::mark_pool_full() {
+ // Double-check idiom that is deliberately sloppy about memory fences.
+ // Technically, to avoid missed wakeups, there should be a full memory fence between the point we
+ // released the task pool (i.e. spawned task) and read the arena's state. However, adding such a
+ // 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().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().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
+ // pool_state to "empty" in the meantime, which caused the compare_and_swap above
+ // to fail. Attempt to transition pool_state from "empty" to "full".
+ if( prefix().pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
+ // Some other thread transitioned pool_state from "empty", and hence became
+ // responsible for waking up workers.
+ return;
+ }
+ }
+ // This thread transitioned pool from empty to full state, and thus is responsible for
+ // telling RML that there is work to do.
+ prefix().server->adjust_job_count_estimate( int(prefix().number_of_workers) );
+ }
+ }
+}
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* _TBB_arena_H */
diff --git a/src/tbb/cache_aligned_allocator.cpp b/src/tbb/cache_aligned_allocator.cpp
index 8d8df6b..3c1464c 100644
--- a/src/tbb/cache_aligned_allocator.cpp
+++ b/src/tbb/cache_aligned_allocator.cpp
@@ -34,7 +34,13 @@
#include <cstdlib>
#if _WIN32||_WIN64
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
#include <windows.h>
+#endif // _XBOX
#else
#include <dlfcn.h>
#endif /* _WIN32||_WIN64 */
@@ -216,9 +222,9 @@ void* NFS_Allocate( size_t n, size_t element_size, void* /*hint*/ ) {
throw_exception(eid_bad_alloc);
}
// Round up to next line
- unsigned char* result = (unsigned char*)((uintptr)(base+m)&-m);
+ unsigned char* result = (unsigned char*)((uintptr_t)(base+m)&-m);
// Record where block actually starts. Use low order bit to record whether we used malloc or MallocHandler.
- ((uintptr*)result)[-1] = uintptr(base)|(bytes>=BigSize);
+ ((uintptr_t*)result)[-1] = uintptr_t(base)|(bytes>=BigSize);
#endif // __TBB_IS_SCALABLE_MALLOC_FIX_READY
/** The test may fail with TBB_IS_SCALABLE_MALLOC_FIX_READY = 1
because scalable_malloc returns addresses aligned to 64 when large block is allocated */
@@ -231,11 +237,11 @@ void NFS_Free( void* p ) {
(*padded_free_handler)( p );
#else
if( p ) {
- __TBB_ASSERT( (uintptr)p>=0x4096, "attempt to free block not obtained from cache_aligned_allocator" );
+ __TBB_ASSERT( (uintptr_t)p>=0x4096, "attempt to free block not obtained from cache_aligned_allocator" );
// Recover where block actually starts
unsigned char* base = ((unsigned char**)p)[-1];
- __TBB_ASSERT( (void*)((uintptr)(base+NFS_LineSize)&-NFS_LineSize)==p, "not allocated by NFS_Allocate?" );
- if( uintptr(base)&1 ) {
+ __TBB_ASSERT( (void*)((uintptr_t)(base+NFS_LineSize)&-NFS_LineSize)==p, "not allocated by NFS_Allocate?" );
+ if( uintptr_t(base)&1 ) {
// Is a big block - use free
free(base-1);
} else {
@@ -261,18 +267,18 @@ static void* padded_allocate( size_t bytes, size_t alignment ) {
throw_exception(eid_bad_alloc);
}
// Round up to the next line
- unsigned char* result = (unsigned char*)((uintptr)(base+alignment)&-alignment);
+ unsigned char* result = (unsigned char*)((uintptr_t)(base+alignment)&-alignment);
// Record where block actually starts.
- ((uintptr*)result)[-1] = uintptr(base);
+ ((uintptr_t*)result)[-1] = uintptr_t(base);
return result;
}
static void padded_free( void* p ) {
if( p ) {
- __TBB_ASSERT( (uintptr)p>=0x4096, "attempt to free block not obtained from cache_aligned_allocator" );
+ __TBB_ASSERT( (uintptr_t)p>=0x4096, "attempt to free block not obtained from cache_aligned_allocator" );
// Recover where block actually starts
unsigned char* base = ((unsigned char**)p)[-1];
- __TBB_ASSERT( (void*)((uintptr)(base+NFS_LineSize)&-NFS_LineSize)==p, "not allocated by NFS_Allocate?" );
+ __TBB_ASSERT( (void*)((uintptr_t)(base+NFS_LineSize)&-NFS_LineSize)==p, "not allocated by NFS_Allocate?" );
free(base);
}
}
diff --git a/src/tbb/concurrent_monitor.cpp b/src/tbb/concurrent_monitor.cpp
new file mode 100644
index 0000000..c53ef96
--- /dev/null
+++ b/src/tbb/concurrent_monitor.cpp
@@ -0,0 +1,109 @@
+/*
+ Copyright 2005-2010 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 "concurrent_monitor.h"
+
+namespace tbb {
+namespace internal {
+
+void concurrent_monitor::prepare_wait( thread_context& thr, void* ctx ) {
+ // this is good place to pump previous spurious wakeup
+ if( thr.spurious ) {
+ thr.spurious = false;
+ thr.sema.P();
+ }
+ thr.context = ctx;
+ thr.in_waitset = true;
+ {
+ tbb::spin_mutex::scoped_lock l( mutex_ec );
+ thr.epoch = epoch;
+ waitset_ec.add( (waitset_t::node_t*)&thr );
+ }
+ __TBB_rel_acq_fence();
+}
+
+void concurrent_monitor::cancel_wait( thread_context& thr ) {
+ // spurious wakeup will be pumped in the following prepare_wait()
+ thr.spurious = true;
+ // try to remove node from waitset
+ bool th_in_waitset = thr.in_waitset;
+ if( th_in_waitset ) {
+ tbb::spin_mutex::scoped_lock l( mutex_ec );
+ if (thr.in_waitset) {
+ // successfully removed from waitset,
+ // so there will be no spurious wakeup
+ thr.in_waitset = false;
+ thr.spurious = false;
+ waitset_ec.remove( (waitset_t::node_t&)thr );
+ }
+ }
+}
+
+void concurrent_monitor::notify_one_relaxed() {
+ if( waitset_ec.size()==0 )
+ return;
+ waitset_node_t* n;
+ const waitset_node_t* end = waitset_ec.end();
+ {
+ tbb::spin_mutex::scoped_lock l( mutex_ec );
+ epoch = epoch + 1;
+ n = waitset_ec.front();
+ if( n!=end ) {
+ waitset_ec.remove( *n );
+ to_thread_context(n)->in_waitset = false;
+ }
+ }
+ if( n!=end )
+ to_thread_context(n)->sema.V();
+}
+
+void concurrent_monitor::notify_all_relaxed() {
+ if( waitset_ec.size()==0 )
+ return;
+ dllist_t temp;
+ const waitset_node_t* end;
+ {
+ tbb::spin_mutex::scoped_lock l( mutex_ec );
+ epoch = epoch + 1;
+ waitset_ec.flush_to( temp );
+ end = temp.end();
+ for( waitset_node_t* n=temp.front(); n!=end; n=n->next )
+ to_thread_context(n)->in_waitset = false;
+ }
+ waitset_node_t* nxt;
+ for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {
+ nxt = n->next;
+ to_thread_context(n)->sema.V();
+ }
+#if TBB_USE_DEBUG
+ temp.clear();
+#endif
+}
+
+} // namespace internal
+} // namespace tbb
diff --git a/src/tbb/concurrent_monitor.h b/src/tbb/concurrent_monitor.h
new file mode 100644
index 0000000..379cbeb
--- /dev/null
+++ b/src/tbb/concurrent_monitor.h
@@ -0,0 +1,295 @@
+/*
+ Copyright 2005-2010 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_concurrent_monitor_H
+#define __TBB_concurrent_monitor_H
+
+#include "tbb/tbb_stddef.h"
+#include "tbb/atomic.h"
+#include "tbb/spin_mutex.h"
+
+#if _WIN32||_WIN64
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
+#include <windows.h>
+#endif
+#elif __APPLE__
+#include <pthread.h>
+#include <mach/semaphore.h>
+#include <mach/task.h>
+#include <mach/mach_init.h>
+#include <mach/error.h>
+#else
+#include <pthread.h>
+#include <semaphore.h>
+#ifdef TBB_USE_DEBUG
+#include <errno.h>
+#endif
+#endif /*_WIN32||_WIN64*/
+
+namespace tbb {
+namespace internal {
+
+
+#if _WIN32||_WIN64
+typedef LONG sem_count_t;
+//! semaphore for concurrent_monitor
+class semaphore : no_copy {
+public:
+ //! ctor
+ semaphore() {sem = CreateSemaphore( NULL, 0, 1, NULL );}
+ //! dtor
+ ~semaphore() {CloseHandle( sem );}
+ //! wait/acquire
+ void P() {WaitForSingleObject( sem, INFINITE );}
+ //! post/release
+ void V() {ReleaseSemaphore( sem, 1, NULL );}
+private:
+ HANDLE sem;
+};
+#elif __APPLE__
+//! semaphore for concurrent monitor
+class semaphore : no_copy {
+public:
+ //! ctor
+ semaphore() : sem(0) {
+ kern_return_t ret = semaphore_create( mach_task_self(), &sem, SYNC_POLICY_FIFO, 0 );
+ __TBB_ASSERT_EX( ret==err_none, "failed to create a semaphore" );
+ }
+ //! dtor
+ ~semaphore() {
+ kern_return_t ret = semaphore_destroy( mach_task_self(), sem );
+ __TBB_ASSERT_EX( ret==err_none, NULL );
+ }
+ //! wait/acquire
+ void P() {
+ int ret;
+ do {
+ ret = semaphore_wait( sem );
+ } while( ret==KERN_ABORTED );
+ __TBB_ASSERT( ret==KERN_SUCCESS, "semaphore_wait() failed" );
+ }
+ //! post/release
+ void V() { semaphore_signal( sem ); }
+private:
+ semaphore_t sem;
+};
+#else /* Linux/Unix */
+typedef uint32_t sem_count_t;
+//! semaphore for concurrent monitor
+class semaphore : no_copy {
+public:
+ //! ctor
+ semaphore() {
+ int ret = sem_init( &sem, /*shared among threads*/ 0, 0 );
+ __TBB_ASSERT_EX( !ret, NULL );
+ }
+ //! dtor
+ ~semaphore() {
+ int ret = sem_destroy( &sem );
+ __TBB_ASSERT_EX( !ret, NULL );
+ }
+ //! wait/acquire
+ void P() {
+ while( sem_wait( &sem )!=0 )
+ __TBB_ASSERT( errno==EINTR, NULL );
+ }
+ //! post/release
+ void V() { sem_post( &sem ); }
+private:
+ sem_t sem;
+};
+#endif /* _WIN32||_WIN64 */
+
+//! Circular doubly-linked list with sentinel
+/** head.next points to the front and head.prev points to the back */
+class circular_doubly_linked_list_with_sentinel : no_copy {
+public:
+ struct node_t {
+ node_t* next;
+ node_t* prev;
+ node_t() : next(NULL), prev(NULL) {}
+ };
+
+ // 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 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;
+ head.prev = n;
+ }
+
+ //! remove node 'n' from the 'this' list
+ inline void remove( node_t& n ) {
+ count = count - 1;
+ n.prev->next = n.next;
+ n.next->prev = n.prev;
+ }
+
+ //! move all elements to 'lst' and initiallize 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;
+ lst.head.prev = head.prev;
+ head.next->prev = &lst.head;
+ head.prev->next = &lst.head;
+ clear();
+ }
+ }
+
+#if !TBB_USE_DEBUG
+private:
+#endif
+ atomic<size_t> count;
+ node_t head;
+ void clear() {count = 0; head.next = &head; head.prev = &head;}
+};
+
+typedef circular_doubly_linked_list_with_sentinel waitset_t;
+typedef circular_doubly_linked_list_with_sentinel dllist_t;
+typedef circular_doubly_linked_list_with_sentinel::node_t waitset_node_t;
+
+class concurrent_monitor;
+
+//! concurrent_monitor
+/** fine-grained concurrent_monitor implementation */
+class concurrent_monitor : no_copy {
+public:
+ /** per-thread descriptor for concurrent_monitor */
+ class thread_context : waitset_node_t, no_copy {
+ friend class concurrent_monitor;
+ 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;
+ tbb::atomic<bool> in_waitset;
+ bool spurious;
+ void* context;
+ };
+
+ //! ctor
+ concurrent_monitor() {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. */
+ inline bool commit_wait( thread_context& thr ) {
+ bool do_it = thr.epoch==epoch;
+ // this check is just an optimization
+ if( do_it ) {
+ thr.sema.P();
+ __TBB_ASSERT( !thr.in_waitset, "still in the queue?" );
+ } else {
+ cancel_wait( thr );
+ }
+ return do_it;
+ }
+ //! Cancel the wait. Removes the thread from the wait queue if not removed yet.
+ void cancel_wait( thread_context& thr );
+
+ //! Notify one thread about the event
+ void notify_one() {__TBB_rel_acq_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() {__TBB_rel_acq_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 ) {__TBB_rel_acq_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;
+ thread_context* to_thread_context( waitset_node_t* n ) { return static_cast<thread_context*>(n); }
+};
+
+template<typename P>
+void concurrent_monitor::notify_relaxed( const P& predicate ) {
+ if( waitset_ec.size()==0 )
+ 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;
+ for( waitset_node_t* n=waitset_ec.last(); n!=end; n=nxt ) {
+ nxt = n->prev;
+ thread_context* thr = to_thread_context( n );
+ if( predicate( thr->context ) ) {
+ waitset_ec.remove( *n );
+ thr->in_waitset = false;
+ temp.add( n );
+ }
+ }
+ }
+
+ end = temp.end();
+ for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {
+ nxt = n->next;
+ to_thread_context(n)->sema.V();
+ }
+#if TBB_USE_DEBUG
+ temp.clear();
+#endif
+}
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* __TBB_concurrent_monitor_H */
diff --git a/src/tbb/concurrent_queue.cpp b/src/tbb/concurrent_queue.cpp
index 3674e30..6089660 100644
--- a/src/tbb/concurrent_queue.cpp
+++ b/src/tbb/concurrent_queue.cpp
@@ -26,20 +26,27 @@
the GNU General Public License.
*/
-#include <cstring> // for memset()
#include "tbb/tbb_stddef.h"
#include "tbb/tbb_machine.h"
#include "tbb/tbb_exception.h"
#include "tbb/_concurrent_queue_internal.h"
+#include "concurrent_monitor.h"
#include "itt_notify.h"
#include <new>
-#if _WIN32||_WIN64
-#include <windows.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
-using namespace std;
-// enable sleep support
-#define __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE 1
+#include <cstring> // for memset()
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+using namespace std;
#if defined(_MSC_VER) && defined(_Wp64)
// Workaround for overzealous compiler warnings in /Wp64 mode
@@ -49,12 +56,6 @@ using namespace std;
#define RECORD_EVENTS 0
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
-#if !_WIN32&&!_WIN64
-#include <pthread.h>
-#endif
-#endif
-
namespace tbb {
namespace internal {
@@ -117,20 +118,17 @@ public:
}
};
+struct predicate_leq {
+ ticket t;
+ predicate_leq( ticket t_ ) : t(t_) {}
+ bool operator() ( void* p ) const {return (ticket)p<=t;}
+};
+
//! Internal representation of a ConcurrentQueue.
/** For efficient, this class has no constructor.
The caller is expected to zero-initialize it. */
class concurrent_queue_rep {
public:
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
-# if _WIN32||_WIN64
- typedef HANDLE waitvar_t;
- typedef CRITICAL_SECTION mutexvar_t;
-# else
- typedef pthread_cond_t waitvar_t;
- typedef pthread_mutex_t mutexvar_t;
-# endif
-#endif /* __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
private:
friend struct micro_queue;
@@ -146,38 +144,14 @@ public:
return k*phi%n_queue;
}
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
atomic<ticket> head_counter;
- waitvar_t var_wait_for_items;
- mutexvar_t mtx_items_avail;
+ concurrent_monitor items_avail;
atomic<size_t> n_invalid_entries;
- atomic<uint32_t> n_waiting_consumers;
-#if _WIN32||_WIN64
- uint32_t consumer_wait_generation;
- uint32_t n_consumers_to_wakeup;
- char pad1[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(waitvar_t)+sizeof(mutexvar_t)+sizeof(atomic<size_t>)+sizeof(atomic<uint32_t>)+sizeof(uint32_t)+sizeof(uint32_t))&(NFS_MaxLineSize-1))];
-#else
- char pad1[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(waitvar_t)+sizeof(mutexvar_t)+sizeof(atomic<size_t>)+sizeof(atomic<uint32_t>))&(NFS_MaxLineSize-1))];
-#endif
+ char pad1[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(concurrent_monitor)+sizeof(atomic<size_t>))&(NFS_MaxLineSize-1))];
atomic<ticket> tail_counter;
- waitvar_t var_wait_for_slots;
- mutexvar_t mtx_slots_avail;
- atomic<uint32_t> n_waiting_producers;
-#if _WIN32||_WIN64
- uint32_t producer_wait_generation;
- uint32_t n_producers_to_wakeup;
- char pad2[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(waitvar_t)+sizeof(mutexvar_t)+sizeof(atomic<uint32_t>)+sizeof(uint32_t)+sizeof(uint32_t))&(NFS_MaxLineSize-1))];
-#else
- char pad2[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(waitvar_t)+sizeof(mutexvar_t)+sizeof(atomic<uint32_t>))&(NFS_MaxLineSize-1))];
-#endif
-#else /* !__TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
- atomic<ticket> head_counter;
- atomic<size_t> n_invalid_entries;
- char pad1[NFS_MaxLineSize-sizeof(atomic<ticket>)-sizeof(atomic<size_t>)];
- atomic<ticket> tail_counter;
- char pad2[NFS_MaxLineSize-sizeof(atomic<ticket>)];
-#endif /* __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
+ concurrent_monitor slots_avail;
+ char pad2[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(concurrent_monitor))&(NFS_MaxLineSize-1))];
micro_queue array[n_queue];
micro_queue& choose( ticket k ) {
@@ -205,9 +179,9 @@ void micro_queue::push( const void* item, ticket k, concurrent_queue_base& base
page* p = NULL;
size_t index = k/concurrent_queue_rep::n_queue & (base.items_per_page-1);
if( !index ) {
- try {
+ __TBB_TRY {
p = base.allocate_page();
- } catch (...) {
+ } __TBB_CATCH(...) {
++base.my_rep->n_invalid_entries;
make_invalid( k );
}
@@ -239,16 +213,16 @@ void micro_queue::push( const void* item, ticket k, concurrent_queue_base& base
}
ITT_NOTIFY( sync_acquired, p );
- try {
+ __TBB_TRY {
base.copy_item( *p, index, item );
ITT_NOTIFY( sync_releasing, p );
// If no exception was thrown, mark item as present.
- p->mask |= uintptr(1)<<index;
+ p->mask |= uintptr_t(1)<<index;
tail_counter += concurrent_queue_rep::n_queue;
- } catch (...) {
+ } __TBB_CATCH(...) {
++base.my_rep->n_invalid_entries;
tail_counter += concurrent_queue_rep::n_queue;
- throw;
+ __TBB_RETHROW();
}
}
@@ -262,7 +236,7 @@ bool micro_queue::pop( void* dst, ticket k, concurrent_queue_base& base ) {
bool success = false;
{
micro_queue_pop_finalizer finalizer( *this, base, k+concurrent_queue_rep::n_queue, index==base.items_per_page-1 ? &p : NULL );
- if( p.mask & uintptr(1)<<index ) {
+ if( p.mask & uintptr_t(1)<<index ) {
success = true;
ITT_NOTIFY( sync_acquired, dst );
ITT_NOTIFY( sync_acquired, head_page );
@@ -284,7 +258,7 @@ micro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base&
const page* srcp = src.head_page;
if( srcp ) {
ticket g_index = head_counter;
- try {
+ __TBB_TRY {
size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep::n_queue;
size_t index = head_counter/concurrent_queue_rep::n_queue & (base.items_per_page-1);
size_t end_in_first_page = (index+n_items<base.items_per_page)?(index+n_items):base.items_per_page;
@@ -307,7 +281,7 @@ micro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base&
cur_page = cur_page->next;
}
tail_page = cur_page;
- } catch (...) {
+ } __TBB_CATCH(...) {
make_invalid( g_index );
}
} else {
@@ -322,7 +296,7 @@ concurrent_queue_base::page* micro_queue::make_copy( concurrent_queue_base& base
new_page->next = NULL;
new_page->mask = src_page->mask;
for( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
- if( new_page->mask & uintptr(1)<<begin_in_page )
+ if( new_page->mask & uintptr_t(1)<<begin_in_page )
base.copy_page_item( *new_page, begin_in_page, *src_page, begin_in_page );
return new_page;
}
@@ -341,7 +315,7 @@ void micro_queue::make_invalid( ticket k )
head_page = static_cast<page*>(invalid_page);
tail_page = static_cast<page*>(invalid_page);
}
- throw;
+ __TBB_RETHROW();
}
#if _MSC_VER && !defined(__INTEL_COMPILER)
@@ -365,75 +339,27 @@ concurrent_queue_base_v3::concurrent_queue_base_v3( size_t item_size ) {
__TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, "alignment error" );
__TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, "alignment error" );
memset(my_rep,0,sizeof(concurrent_queue_rep));
+ new ( &my_rep->items_avail ) concurrent_monitor();
+ new ( &my_rep->slots_avail ) concurrent_monitor();
this->item_size = item_size;
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
-#if _WIN32||_WIN64
- my_rep->var_wait_for_items = CreateEvent( NULL, TRUE/*manual reset*/, FALSE/*not signalled initially*/, NULL);
- my_rep->var_wait_for_slots = CreateEvent( NULL, TRUE/*manual reset*/, FALSE/*not signalled initially*/, NULL);
- InitializeCriticalSection( &my_rep->mtx_items_avail );
- InitializeCriticalSection( &my_rep->mtx_slots_avail );
-#else
- // initialize pthread_mutex_t, and pthread_cond_t
- pthread_mutexattr_t m_attr;
- pthread_mutexattr_init( &m_attr );
-#if defined(PTHREAD_PRIO_INHERIT) && !__TBB_PRIO_INHERIT_BROKEN
- pthread_mutexattr_setprotocol( &m_attr, PTHREAD_PRIO_INHERIT );
-#endif
- pthread_mutex_init( &my_rep->mtx_items_avail, &m_attr );
- pthread_mutex_init( &my_rep->mtx_slots_avail, &m_attr );
- pthread_mutexattr_destroy( &m_attr );
-
- pthread_condattr_t c_attr;
- pthread_condattr_init( &c_attr );
- pthread_cond_init( &my_rep->var_wait_for_items, &c_attr );
- pthread_cond_init( &my_rep->var_wait_for_slots, &c_attr );
- pthread_condattr_destroy( &c_attr );
-#endif
-#endif /* __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
}
concurrent_queue_base_v3::~concurrent_queue_base_v3() {
size_t nq = my_rep->n_queue;
for( size_t i=0; i<nq; i++ )
__TBB_ASSERT( my_rep->array[i].tail_page==NULL, "pages were not freed properly" );
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
-# if _WIN32||_WIN64
- CloseHandle( my_rep->var_wait_for_items );
- CloseHandle( my_rep->var_wait_for_slots );
- DeleteCriticalSection( &my_rep->mtx_items_avail );
- DeleteCriticalSection( &my_rep->mtx_slots_avail );
-# else
- pthread_mutex_destroy( &my_rep->mtx_items_avail );
- pthread_mutex_destroy( &my_rep->mtx_slots_avail );
- pthread_cond_destroy( &my_rep->var_wait_for_items );
- pthread_cond_destroy( &my_rep->var_wait_for_slots );
-# endif
-#endif /* __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
cache_aligned_allocator<concurrent_queue_rep>().deallocate(my_rep,1);
}
void concurrent_queue_base_v3::internal_push( const void* src ) {
concurrent_queue_rep& r = *my_rep;
-#if !__TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
- ticket k = r.tail_counter++;
- ptrdiff_t e = my_capacity;
- if( e<concurrent_queue_rep::infinite_capacity ) {
- atomic_backoff backoff;
- for(;;) {
- if( (ptrdiff_t)(k-r.head_counter)<e ) break;
- backoff.pause();
- e = const_cast<volatile ptrdiff_t&>(my_capacity);
- }
- }
- r.choose(k).push(src,k,*this);
-#elif _WIN32||_WIN64
ticket k = r.tail_counter++;
ptrdiff_t e = my_capacity;
atomic_backoff backoff;
+ concurrent_monitor::thread_context thr_ctx;
#if DO_ITT_NOTIFY
bool sync_prepare_done = false;
#endif
-
while( (ptrdiff_t)(k-r.head_counter)>=e ) {
#if DO_ITT_NOTIFY
if( !sync_prepare_done ) {
@@ -442,92 +368,29 @@ void concurrent_queue_base_v3::internal_push( const void* src ) {
}
#endif
if( !backoff.bounded_pause() ) {
- EnterCriticalSection( &r.mtx_slots_avail );
- r.n_waiting_producers++;
- while( (ptrdiff_t)(k-r.head_counter)>=const_cast<volatile ptrdiff_t&>(my_capacity) ) {
- uint32_t my_generation = r.producer_wait_generation;
- for( ;; ) {
- LeaveCriticalSection( &r.mtx_slots_avail );
- WaitForSingleObject( r.var_wait_for_slots, INFINITE );
- EnterCriticalSection( &r.mtx_slots_avail );
- if( r.n_producers_to_wakeup > 0 && r.producer_wait_generation != my_generation )
- break;
- }
- if( --r.n_producers_to_wakeup == 0 )
- ResetEvent( r.var_wait_for_slots );
+ bool slept = false;
+ r.slots_avail.prepare_wait( thr_ctx, (void*) ((ptrdiff_t)(k-e)) );
+ while( (ptrdiff_t)(k-r.head_counter)>=const_cast<volatile ptrdiff_t&>(e = my_capacity) ) {
+ if( (slept = r.slots_avail.commit_wait( thr_ctx ) )==true )
+ break;
+ r.slots_avail.prepare_wait( thr_ctx, (void*) ((ptrdiff_t)(k-e)) );
}
- --r.n_waiting_producers;
- LeaveCriticalSection( &r.mtx_slots_avail );
- break;
- }
- e = const_cast<volatile ptrdiff_t&>(my_capacity);
- }
-#if DO_ITT_NOTIFY
- if( sync_prepare_done )
- ITT_NOTIFY( sync_acquired, &sync_prepare_done );
-#endif
-
- r.choose( k ).push( src, k, *this );
-
- if( r.n_waiting_consumers>0 ) {
- EnterCriticalSection( &r.mtx_items_avail );
- if( r.n_waiting_consumers>0 ) {
- r.consumer_wait_generation++;
- r.n_consumers_to_wakeup = r.n_waiting_consumers;
- SetEvent( r.var_wait_for_items );
- }
- LeaveCriticalSection( &r.mtx_items_avail );
- }
-#else
- ticket k = r.tail_counter++;
- ptrdiff_t e = my_capacity;
- atomic_backoff backoff;
-#if DO_ITT_NOTIFY
- bool sync_prepare_done = false;
-#endif
- while( (ptrdiff_t)(k-r.head_counter)>=e ) {
-#if DO_ITT_NOTIFY
- if( !sync_prepare_done ) {
- ITT_NOTIFY( sync_prepare, &sync_prepare_done );
- sync_prepare_done = true;
- }
-#endif
- if( !backoff.bounded_pause() ) {
- // queue is full. go to sleep. let them go to sleep in order.
- pthread_mutex_lock( &r.mtx_slots_avail );
- r.n_waiting_producers++;
- while( (ptrdiff_t)(k-r.head_counter)>=const_cast<volatile ptrdiff_t&>(my_capacity) ) {
- pthread_cond_wait( &r.var_wait_for_slots, &r.mtx_slots_avail );
- }
- --r.n_waiting_producers;
- pthread_mutex_unlock( &r.mtx_slots_avail );
+ if( !slept )
+ r.slots_avail.cancel_wait( thr_ctx );
break;
}
e = const_cast<volatile ptrdiff_t&>(my_capacity);
}
ITT_NOTIFY( sync_acquired, &sync_prepare_done );
r.choose( k ).push( src, k, *this );
-
- if( r.n_waiting_consumers>0 ) {
- pthread_mutex_lock( &r.mtx_items_avail );
- // pthread_cond_broadcast() wakes up all consumers.
- if( r.n_waiting_consumers>0 )
- pthread_cond_broadcast( &r.var_wait_for_items );
- pthread_mutex_unlock( &r.mtx_items_avail );
- }
-#endif /* !__TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
+ r.items_avail.notify( predicate_leq(k) );
}
void concurrent_queue_base_v3::internal_pop( void* dst ) {
concurrent_queue_rep& r = *my_rep;
-#if !__TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
- ticket k;
- do {
- k = r.head_counter++;
- } while( !r.choose(k).pop(dst,k,*this) );
-#elif _WIN32||_WIN64
ticket k;
atomic_backoff backoff;
+ concurrent_monitor::thread_context thr_ctx;
#if DO_ITT_NOTIFY
bool sync_prepare_done = false;
#endif
@@ -542,76 +405,22 @@ void concurrent_queue_base_v3::internal_pop( void* dst ) {
#endif
// Queue is empty; pause and re-try a few times
if( !backoff.bounded_pause() ) {
- // it is really empty.. go to sleep
- EnterCriticalSection( &r.mtx_items_avail );
- r.n_waiting_consumers++;
+ bool slept = false;
+ r.items_avail.prepare_wait( thr_ctx, (void*)k );
while( r.tail_counter<=k ) {
- uint32_t my_generation = r.consumer_wait_generation;
- for( ;; ) {
- LeaveCriticalSection( &r.mtx_items_avail );
- WaitForSingleObject( r.var_wait_for_items, INFINITE );
- EnterCriticalSection( &r.mtx_items_avail );
- if( r.n_consumers_to_wakeup > 0 && r.consumer_wait_generation != my_generation )
- break;
- }
- if( --r.n_consumers_to_wakeup == 0 )
- ResetEvent( r.var_wait_for_items );
+ if( (slept = r.items_avail.commit_wait( thr_ctx ) )==true )
+ break;
+ r.items_avail.prepare_wait( thr_ctx, (void*)k );
}
- --r.n_waiting_consumers;
- LeaveCriticalSection( &r.mtx_items_avail );
- backoff.reset();
+ if( !slept )
+ r.items_avail.cancel_wait( thr_ctx );
break; // break from inner while
}
} // break to here
} while( !r.choose(k).pop(dst,k,*this) );
// wake up a producer..
- if( r.n_waiting_producers>0 ) {
- EnterCriticalSection( &r.mtx_slots_avail );
- if( r.n_waiting_producers>0 ) {
- r.producer_wait_generation++;
- r.n_producers_to_wakeup = r.n_waiting_producers;
- SetEvent( r.var_wait_for_slots );
- }
- LeaveCriticalSection( &r.mtx_slots_avail );
- }
-#else
- ticket k;
- atomic_backoff backoff;
-#if DO_ITT_NOTIFY
- bool sync_prepare_done = false;
-#endif
- do {
- k = r.head_counter++;
- while( r.tail_counter<=k ) {
-#if DO_ITT_NOTIFY
- if( !sync_prepare_done ) {
- ITT_NOTIFY( sync_prepare, dst );
- sync_prepare_done = true;
- }
-#endif
- // Queue is empty; pause and re-try a few times
- if( !backoff.bounded_pause() ) {
- // it is really empty.. go to sleep
- pthread_mutex_lock( &r.mtx_items_avail );
- r.n_waiting_consumers++;
- while( r.tail_counter<=k )
- pthread_cond_wait( &r.var_wait_for_items, &r.mtx_items_avail );
- --r.n_waiting_consumers;
- pthread_mutex_unlock( &r.mtx_items_avail );
- backoff.reset();
- break;
- }
- }
- } while( !r.choose(k).pop(dst,k,*this) );
-
- if( r.n_waiting_producers>0 ) {
- pthread_mutex_lock( &r.mtx_slots_avail );
- if( r.n_waiting_producers>0 )
- pthread_cond_broadcast( &r.var_wait_for_slots );
- pthread_mutex_unlock( &r.mtx_slots_avail );
- }
-#endif /* !__TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
+ r.slots_avail.notify( predicate_leq(k) );
}
bool concurrent_queue_base_v3::internal_pop_if_present( void* dst ) {
@@ -633,27 +442,7 @@ bool concurrent_queue_base_v3::internal_pop_if_present( void* dst ) {
}
} while( !r.choose( k ).pop( dst, k, *this ) );
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
-#if _WIN32||_WIN64
- // wake up a producer..
- if( r.n_waiting_producers>0 ) {
- EnterCriticalSection( &r.mtx_slots_avail );
- if( r.n_waiting_producers>0 ) {
- r.producer_wait_generation++;
- r.n_producers_to_wakeup = r.n_waiting_producers;
- SetEvent( r.var_wait_for_slots );
- }
- LeaveCriticalSection( &r.mtx_slots_avail );
- }
-#else /* including MacOS */
- if( r.n_waiting_producers>0 ) {
- pthread_mutex_lock( &r.mtx_slots_avail );
- if( r.n_waiting_producers>0 )
- pthread_cond_broadcast( &r.var_wait_for_slots );
- pthread_mutex_unlock( &r.mtx_slots_avail );
- }
-#endif
-#endif /* __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
+ r.slots_avail.notify( predicate_leq(k) );
return true;
}
@@ -675,26 +464,7 @@ bool concurrent_queue_base_v3::internal_push_if_not_full( const void* src ) {
}
r.choose(k).push(src,k,*this);
-#if __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE
-#if _WIN32||_WIN64
- if( r.n_waiting_consumers>0 ) {
- EnterCriticalSection( &r.mtx_items_avail );
- if( r.n_waiting_consumers>0 ) {
- r.consumer_wait_generation++;
- r.n_consumers_to_wakeup = r.n_waiting_consumers;
- SetEvent( r.var_wait_for_items );
- }
- LeaveCriticalSection( &r.mtx_items_avail );
- }
-#else /* including MacOS */
- if( r.n_waiting_consumers>0 ) {
- pthread_mutex_lock( &r.mtx_items_avail );
- if( r.n_waiting_consumers>0 )
- pthread_cond_broadcast( &r.var_wait_for_items );
- pthread_mutex_unlock( &r.mtx_items_avail );
- }
-#endif
-#endif /* __TBB_NO_BUSY_WAIT_IN_CONCURRENT_QUEUE */
+ r.items_avail.notify( predicate_leq(k) );
return true;
}
@@ -754,10 +524,12 @@ class concurrent_queue_iterator_rep: no_assign {
public:
ticket head_counter;
const concurrent_queue_base& my_queue;
+ const size_t offset_of_last;
concurrent_queue_base::page* array[concurrent_queue_rep::n_queue];
- concurrent_queue_iterator_rep( const concurrent_queue_base& queue ) :
+ concurrent_queue_iterator_rep( const concurrent_queue_base& queue, size_t offset_of_last_ ) :
head_counter(queue.my_rep->head_counter),
- my_queue(queue)
+ my_queue(queue),
+ offset_of_last(offset_of_last_)
{
const concurrent_queue_rep& rep = *queue.my_rep;
for( size_t k=0; k<concurrent_queue_rep::n_queue; ++k )
@@ -772,8 +544,8 @@ public:
concurrent_queue_base::page* p = array[concurrent_queue_rep::index(k)];
__TBB_ASSERT(p,NULL);
size_t i = k/concurrent_queue_rep::n_queue & (my_queue.items_per_page-1);
- item = static_cast<unsigned char*>(static_cast<void*>(p+1)) + my_queue.item_size*i;
- return (p->mask & uintptr(1)<<i)!=0;
+ item = static_cast<unsigned char*>(static_cast<void*>(p)) + offset_of_last + my_queue.item_size*i;
+ return (p->mask & uintptr_t(1)<<i)!=0;
}
}
};
@@ -781,13 +553,22 @@ public:
//------------------------------------------------------------------------
// concurrent_queue_iterator_base
//------------------------------------------------------------------------
-concurrent_queue_iterator_base_v3::concurrent_queue_iterator_base_v3( const concurrent_queue_base& queue ) {
+
+void concurrent_queue_iterator_base_v3::initialize( const concurrent_queue_base& queue, size_t offset_of_last ) {
my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep>().allocate(1);
- new( my_rep ) concurrent_queue_iterator_rep(queue);
+ new( my_rep ) concurrent_queue_iterator_rep(queue,offset_of_last);
size_t k = my_rep->head_counter;
if( !my_rep->get_item(my_item, k) ) advance();
}
+concurrent_queue_iterator_base_v3::concurrent_queue_iterator_base_v3( const concurrent_queue_base& queue ) {
+ initialize(queue,0);
+}
+
+concurrent_queue_iterator_base_v3::concurrent_queue_iterator_base_v3( const concurrent_queue_base& queue, size_t offset_of_last ) {
+ initialize(queue,offset_of_last);
+}
+
void concurrent_queue_iterator_base_v3::assign( const concurrent_queue_iterator_base& other ) {
if( my_rep!=other.my_rep ) {
if( my_rep ) {
diff --git a/src/tbb/concurrent_vector.cpp b/src/tbb/concurrent_vector.cpp
index 5b7adad..aa90c3f 100644
--- a/src/tbb/concurrent_vector.cpp
+++ b/src/tbb/concurrent_vector.cpp
@@ -31,8 +31,19 @@
#include "tbb/tbb_exception.h"
#include "tbb_misc.h"
#include "itt_notify.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 <cstring>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#if defined(_MSC_VER) && defined(_Wp64)
// Workaround for overzealous compiler warnings in /Wp64 mode
#pragma warning (disable: 4267)
@@ -222,10 +233,11 @@ concurrent_vector_base_v3::size_type concurrent_vector_base_v3::helper::enable_s
__TBB_ASSERT( s[k].array <= internal::vector_allocation_error_flag, "concurrent operation during growth?" );
if( !k ) {
assign_first_segment_if_neccessary(v, default_initial_segments-1);
- try {
+ __TBB_TRY {
publish_segment(s[0], allocate_segment(v, segment_size(v.my_first_block) ) );
- } catch(...) { // intercept exception here, assign internal::vector_allocation_error_flag value, re-throw exception
- publish_segment(s[0], internal::vector_allocation_error_flag); throw;
+ } __TBB_CATCH(...) { // intercept exception here, assign internal::vector_allocation_error_flag value, re-throw exception
+ publish_segment(s[0], internal::vector_allocation_error_flag);
+ __TBB_RETHROW();
}
return 2;
}
@@ -250,10 +262,11 @@ concurrent_vector_base_v3::size_type concurrent_vector_base_v3::helper::enable_s
static_cast<void*>( static_cast<char*>(array0) + segment_base(k)*element_size )
);
} else {
- try {
+ __TBB_TRY {
publish_segment(s[k], allocate_segment(v, m));
- } catch(...) { // intercept exception here, assign internal::vector_allocation_error_flag value, re-throw exception
- publish_segment(s[k], internal::vector_allocation_error_flag); throw;
+ } __TBB_CATCH(...) { // intercept exception here, assign internal::vector_allocation_error_flag value, re-throw exception
+ publish_segment(s[k], internal::vector_allocation_error_flag);
+ __TBB_RETHROW();
}
}
return m;
@@ -319,20 +332,20 @@ void concurrent_vector_base_v3::internal_throw_exception(size_type t) const {
}
void concurrent_vector_base_v3::internal_reserve( size_type n, size_type element_size, size_type max_size ) {
- if( n>max_size ) {
- throw length_error("argument to concurrent_vector::reserve exceeds concurrent_vector::max_size()");
- }
+ if( n>max_size )
+ throw_exception(eid_reservation_length_error);
__TBB_ASSERT( n, NULL );
helper::assign_first_segment_if_neccessary(*this, segment_index_of(n-1));
segment_index_t k = helper::find_segment_end(*this);
- try {
+ __TBB_TRY {
for( ; segment_base(k)<n; ++k ) {
helper::extend_table_if_necessary(*this, k, 0);
if(my_segment[k].array <= internal::vector_allocation_error_flag)
helper::enable_segment(*this, k, element_size);
}
- } catch(...) {
- my_segment[k].array = NULL; throw; // repair and rethrow
+ } __TBB_CATCH(...) {
+ my_segment[k].array = NULL;
+ __TBB_RETHROW(); // repair and rethrow
}
}
@@ -400,7 +413,7 @@ void concurrent_vector_base_v3::internal_assign( const concurrent_vector_base_v3
}
void* concurrent_vector_base_v3::internal_push_back( size_type element_size, size_type& index ) {
- __TBB_ASSERT( sizeof(my_early_size)==sizeof(uintptr), NULL );
+ __TBB_ASSERT( sizeof(my_early_size)==sizeof(uintptr_t), NULL );
size_type tmp = __TBB_FetchAndIncrementWacquire(&my_early_size);
index = tmp;
segment_index_t k_old = segment_index_of( tmp );
@@ -524,13 +537,13 @@ void *concurrent_vector_base_v3::internal_compact( size_type element_size, void
void *s = static_cast<void*>(
static_cast<char*>(seg) + segment_base(i)*element_size );
if(j + my_segment_size >= my_size) my_segment_size = my_size - j;
- try { // exception can occur here
+ __TBB_TRY { // exception can occur here
copy( s, segment_table[i].array, my_segment_size );
- } catch(...) { // destroy all the already copied items
+ } __TBB_CATCH(...) { // destroy all the already copied items
helper for_each(reinterpret_cast<segment_t*>(&old.table[0]), old.first_block, element_size,
0, 0, segment_base(i)+my_segment_size);
for_each.apply( helper::destroy_body(destroy) );
- throw;
+ __TBB_RETHROW();
}
my_segment_size = i? segment_size( ++i ) : segment_size( i = first_block );
}
diff --git a/src/tbb/condition_variable.cpp b/src/tbb/condition_variable.cpp
new file mode 100644
index 0000000..d4b63ec
--- /dev/null
+++ b/src/tbb/condition_variable.cpp
@@ -0,0 +1,213 @@
+/*
+ Copyright 2005-2010 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/compat/condition_variable"
+#include "tbb/atomic.h"
+#include "dynamic_link.h"
+#include "itt_notify.h"
+
+namespace tbb {
+
+namespace internal {
+
+//condition_variable
+#if _WIN32||_WIN64
+using tbb::interface5::internal::condition_variable_using_event;
+
+static atomic<int> condvar_module_inited;
+
+void WINAPI init_condvar_using_event( condition_variable_using_event* cv_event )
+{
+ cv_event->event = CreateEvent( NULL, TRUE/*manual reset*/, FALSE/*not signalled initially*/, NULL);
+ InitializeCriticalSection( &cv_event->mutex );
+ cv_event->n_waiters = 0;
+ cv_event->release_count = 0;
+ cv_event->epoch = 0;
+}
+
+BOOL WINAPI sleep_condition_variable_cs_using_event( condition_variable_using_event* cv_event, LPCRITICAL_SECTION cs, DWORD dwMilliseconds )
+{
+ EnterCriticalSection( &cv_event->mutex );
+ ++cv_event->n_waiters;
+ unsigned my_generation = cv_event->epoch;
+ LeaveCriticalSection( &cv_event->mutex );
+ LeaveCriticalSection( cs );
+ for (;;) {
+ // should come here at least once
+ DWORD rc = WaitForSingleObject( cv_event->event, dwMilliseconds );
+ EnterCriticalSection( &cv_event->mutex );
+ if( rc!=WAIT_OBJECT_0 ) {
+ --cv_event->n_waiters;
+ LeaveCriticalSection( &cv_event->mutex );
+ if( rc==WAIT_TIMEOUT ) {
+ SetLastError( WAIT_TIMEOUT );
+ EnterCriticalSection( cs );
+ }
+ return false;
+ }
+ __TBB_ASSERT( rc==WAIT_OBJECT_0, NULL );
+ if( cv_event->release_count>0 && cv_event->epoch!=my_generation )
+ break;
+ LeaveCriticalSection( &cv_event->mutex );
+ }
+
+ // still in the critical section
+ --cv_event->n_waiters;
+ int count = --cv_event->release_count;
+ LeaveCriticalSection( &cv_event->mutex );
+
+ if( count==0 ) {
+ __TBB_ASSERT( cv_event->event, "Premature destruction of condition variable?" );
+ ResetEvent( cv_event->event );
+ }
+ EnterCriticalSection( cs );
+ return true;
+}
+
+void WINAPI wake_condition_variable_using_event( condition_variable_using_event* cv_event )
+{
+ EnterCriticalSection( &cv_event->mutex );
+ if( cv_event->n_waiters>cv_event->release_count ) {
+ SetEvent( cv_event->event ); // Signal the manual-reset event.
+ ++cv_event->release_count;
+ ++cv_event->epoch;
+ }
+ LeaveCriticalSection( &cv_event->mutex );
+}
+
+void WINAPI wake_all_condition_variable_using_event( condition_variable_using_event* cv_event )
+{
+ EnterCriticalSection( &cv_event->mutex );
+ if( cv_event->n_waiters>0 ) {
+ SetEvent( cv_event->event );
+ cv_event->release_count = cv_event->n_waiters;
+ ++cv_event->epoch;
+ }
+ LeaveCriticalSection( &cv_event->mutex );
+}
+
+void WINAPI destroy_condvar_using_event( condition_variable_using_event* cv_event )
+{
+ HANDLE my_event = cv_event->event;
+ EnterCriticalSection( &cv_event->mutex );
+ // NULL is an invalid HANDLE value
+ cv_event->event = NULL;
+ if( cv_event->n_waiters>0 ) {
+ LeaveCriticalSection( &cv_event->mutex );
+ spin_wait_until_eq( cv_event->n_waiters, 0 );
+ // make sure the last thread completes its access to cv
+ EnterCriticalSection( &cv_event->mutex );
+ }
+ LeaveCriticalSection( &cv_event->mutex );
+ CloseHandle( my_event );
+}
+
+void WINAPI destroy_condvar_noop( CONDITION_VARIABLE* /*cv*/ ) { /*no op*/ }
+
+static void (WINAPI *__TBB_init_condvar)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&init_condvar_using_event;
+static BOOL (WINAPI *__TBB_condvar_wait)( PCONDITION_VARIABLE, LPCRITICAL_SECTION, DWORD ) = (BOOL (WINAPI *)(PCONDITION_VARIABLE,LPCRITICAL_SECTION, DWORD))&sleep_condition_variable_cs_using_event;
+static void (WINAPI *__TBB_condvar_notify_one)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&wake_condition_variable_using_event;
+static void (WINAPI *__TBB_condvar_notify_all)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&wake_all_condition_variable_using_event;
+static void (WINAPI *__TBB_destroy_condvar)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&destroy_condvar_using_event;
+
+//! Table describing the how to link the handlers.
+static const dynamic_link_descriptor CondVarLinkTable[] = {
+ DLD(InitializeConditionVariable, __TBB_init_condvar),
+ DLD(SleepConditionVariableCS, __TBB_condvar_wait),
+ DLD(WakeConditionVariable, __TBB_condvar_notify_one),
+ DLD(WakeAllConditionVariable, __TBB_condvar_notify_all)
+};
+
+void init_condvar_module()
+{
+ __TBB_ASSERT( (uintptr_t)__TBB_init_condvar==(uintptr_t)&init_condvar_using_event, NULL );
+ if( dynamic_link( "Kernel32.dll", CondVarLinkTable, 4 ) )
+ __TBB_destroy_condvar = (void (WINAPI *)(PCONDITION_VARIABLE))&destroy_condvar_noop;
+}
+#endif /* _WIN32||_WIN64 */
+
+} // namespace internal
+
+#if _WIN32||_WIN64
+
+namespace interface5 {
+namespace internal {
+
+using tbb::internal::condvar_module_inited;
+using tbb::internal::__TBB_init_condvar;
+using tbb::internal::__TBB_condvar_wait;
+using tbb::internal::__TBB_condvar_notify_one;
+using tbb::internal::__TBB_condvar_notify_all;
+using tbb::internal::__TBB_destroy_condvar;
+using tbb::internal::init_condvar_module;
+
+void internal_initialize_condition_variable( condvar_impl_t& cv )
+{
+ if( condvar_module_inited!=2 ) {
+ if( condvar_module_inited==0 ) {
+ if( condvar_module_inited.compare_and_swap( 1, 0 )==0 ) {
+ init_condvar_module();
+ condvar_module_inited = 2;
+ }
+ }
+
+ spin_wait_until_eq( condvar_module_inited, 2 );
+ }
+ __TBB_init_condvar( &cv.cv_native );
+}
+
+void internal_destroy_condition_variable( condvar_impl_t& cv )
+{
+ __TBB_destroy_condvar( &cv.cv_native );
+}
+
+void internal_condition_variable_notify_one( condvar_impl_t& cv )
+{
+ __TBB_condvar_notify_one ( &cv.cv_native );
+}
+
+void internal_condition_variable_notify_all( condvar_impl_t& cv )
+{
+ __TBB_condvar_notify_all( &cv.cv_native );
+}
+
+bool internal_condition_variable_wait( condvar_impl_t& cv, mutex* mtx, const tick_count::interval_t* i )
+{
+ DWORD duration = i ? DWORD((i->seconds()*1000)) : INFINITE;
+ mtx->set_state( mutex::INITIALIZED );
+ BOOL res = __TBB_condvar_wait( &cv.cv_native, mtx->native_handle(), duration );
+ mtx->set_state( mutex::HELD );
+ return res?true:false;
+}
+
+} // namespace internal
+} // nameespace interface5
+
+#endif /* _WIN32||_WIN64 */
+
+} // namespace tbb
diff --git a/src/tbb/custom_scheduler.h b/src/tbb/custom_scheduler.h
new file mode 100644
index 0000000..3674096
--- /dev/null
+++ b/src/tbb/custom_scheduler.h
@@ -0,0 +1,473 @@
+/*
+ Copyright 2005-2010 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_custom_scheduler_H
+#define _TBB_custom_scheduler_H
+
+#include "scheduler.h"
+#include "observer_proxy.h"
+#include "itt_notify.h"
+
+namespace tbb {
+namespace internal {
+
+//! Amount of time to pause between steals.
+/** The default values below were found to be best empirically for K-Means
+ on the 32-way Altix and 4-way (*2 for HT) fxqlin04. */
+#if __TBB_ipf
+static const long PauseTime = 1500;
+#else
+static const long PauseTime = 80;
+#endif
+
+//------------------------------------------------------------------------
+//! Traits classes for scheduler
+//------------------------------------------------------------------------
+
+struct DefaultSchedulerTraits {
+ static const bool itt_possible = true;
+ static const bool has_slow_atomic = false;
+};
+
+struct IntelSchedulerTraits {
+ static const bool itt_possible = false;
+#if __TBB_x86_32||__TBB_x86_64
+ static const bool has_slow_atomic = true;
+#else
+ static const bool has_slow_atomic = false;
+#endif /* __TBB_x86_32||__TBB_x86_64 */
+};
+
+//------------------------------------------------------------------------
+// custom_scheduler
+//------------------------------------------------------------------------
+
+//! A scheduler with a customized evaluation loop.
+/** The customization can use SchedulerTraits to make decisions without needing a run-time check. */
+template<typename SchedulerTraits>
+class custom_scheduler: private generic_scheduler {
+ typedef custom_scheduler<SchedulerTraits> scheduler_type;
+
+ //! Scheduler loop that dispatches tasks.
+ /** If child is non-NULL, it is dispatched first.
+ Then, until "parent" has a reference count of 1, other task are dispatched or stolen. */
+ /*override*/
+ void local_wait_for_all( task& parent, task* child );
+
+ //! 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*/
+ void wait_for_all( task& parent, task* child ) {
+ static_cast<custom_scheduler*>(governor::local_scheduler())->scheduler_type::local_wait_for_all( parent, child );
+ }
+
+ //! Construct a custom_scheduler
+ custom_scheduler( arena* a, size_t index ) : generic_scheduler(a, index) {}
+
+ //! Decrements ref_count of a predecessor.
+ /** If it achieves 0, the predecessor is scheduled for execution.
+ When changing, remember that this is a hot path function. */
+ void tally_completion_of_predecessor( task& s, task*& bypass_slot ) {
+ task_prefix& p = s.prefix();
+ if( SchedulerTraits::itt_possible )
+ ITT_NOTIFY(sync_releasing, &p.ref_count);
+ if( SchedulerTraits::has_slow_atomic && p.ref_count==1 ) {
+ p.ref_count=0;
+ } else {
+ if( __TBB_FetchAndDecrementWrelease(&p.ref_count) > 1 ) // more references exist
+ return;
+ }
+ __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);
+#if TBB_USE_ASSERT
+ p.extra_state &= ~es_ref_count_active;
+#endif /* TBB_USE_ASSERT */
+
+ if( bypass_slot==NULL )
+ bypass_slot = &s;
+ else
+ local_spawn( s, s.prefix().next );
+ }
+
+public:
+ static generic_scheduler* allocate_scheduler( arena* a, size_t index ) {
+#if !__TBB_ARENA_PER_MASTER
+ __TBB_ASSERT( a, "missing arena" );
+#endif /* !__TBB_ARENA_PER_MASTER */
+ scheduler_type* s = (scheduler_type*)NFS_Allocate(sizeof(scheduler_type),1,NULL);
+ new( s ) scheduler_type( a, index );
+ __TBB_ASSERT( s->assert_okay(), NULL );
+ ITT_SYNC_CREATE(s, SyncType_Scheduler, SyncObj_TaskPoolSpinning);
+ return s;
+ }
+
+ //! 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 );
+
+}; // class custom_scheduler<>
+
+//------------------------------------------------------------------------
+// custom_scheduler methods
+//------------------------------------------------------------------------
+
+template<typename SchedulerTraits>
+task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count& completion_ref_count,
+ bool return_if_no_work ) {
+ task* t = NULL;
+ inbox.set_is_idle( true );
+ // 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) {
+ if( completion_ref_count==1 ) {
+ if( SchedulerTraits::itt_possible ) {
+ if( failure_count!=-1 ) {
+ ITT_NOTIFY(sync_prepare, &completion_ref_count);
+ // Notify Intel(R) Thread Profiler that thread has stopped spinning.
+ ITT_NOTIFY(sync_acquired, this);
+ }
+ ITT_NOTIFY(sync_acquired, &completion_ref_count);
+ }
+ inbox.set_is_idle( false );
+ return NULL;
+ }
+#if __TBB_ARENA_PER_MASTER
+ size_t n = my_arena->my_limit;
+ __TBB_ASSERT( arena_index < n, NULL );
+#else /* !__TBB_ARENA_PER_MASTER */
+ size_t n = my_arena->prefix().limit;
+#endif /* !__TBB_ARENA_PER_MASTER */
+ if( n>1 ) {
+ if( my_affinity_id && (t=get_mailbox_task()) ) {
+ GATHER_STATISTIC( ++mail_received_count );
+ }
+#if __TBB_ARENA_PER_MASTER
+ // 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()) ) {
+ // just proceed with the obtained task
+ }
+ // Check if the resource manager requires our arena to relinquish some threads
+ else if ( return_if_no_work && (my_arena->my_num_workers_allotted < my_arena->num_workers_active()) )
+ return NULL;
+#endif /* __TBB_ARENA_PER_MASTER */
+ else {
+ // Try to steal a task from a random victim.
+ if ( !can_steal() )
+ goto fail;
+ size_t k = random.get() % (n-1);
+ arena_slot* victim = &my_arena->slot[k];
+ // The following condition excludes the master that might have
+ // already taken our previous place in the arena from the list .
+ // of potential victims. But since such a situation can take
+ // place only in case of significant oversubscription, keeping
+ // the checks simple seems to be preferable to complicating the code.
+ if( k >= arena_index )
+ ++victim; // Adjusts random distribution to exclude self
+ t = steal_task( *victim );
+ if( !t ) goto fail;
+ if( is_proxy(*t) ) {
+ t = strip_proxy((task_proxy*)t);
+ if( !t ) goto fail;
+ GATHER_STATISTIC( ++proxy_steal_count );
+ }
+ t->prefix().extra_state |= es_task_is_stolen;
+ if( is_version_3_task(*t) ) {
+ innermost_running_task = t;
+ t->note_affinity( my_affinity_id );
+ }
+ GATHER_STATISTIC( ++steal_count );
+ }
+ __TBB_ASSERT(t,NULL);
+#if __TBB_SCHEDULER_OBSERVER
+ // No memory fence required for read of global_last_observer_proxy, because prior fence on steal/mailbox suffices.
+ if( local_last_observer_proxy!=global_last_observer_proxy ) {
+ notify_entry_observers();
+ }
+#endif /* __TBB_SCHEDULER_OBSERVER */
+ if( SchedulerTraits::itt_possible ) {
+ if( failure_count!=-1 ) {
+ // FIXME - might be victim, or might be selected from a mailbox
+ // Notify Intel(R) Thread Profiler that thread has stopped spinning.
+ ITT_NOTIFY(sync_acquired, this);
+ }
+ }
+ inbox.set_is_idle( false );
+ break; // jumps to: return t;
+ }
+fail:
+ if( SchedulerTraits::itt_possible && failure_count==-1 ) {
+ // The first attempt to steal work failed, so notify Intel(R) Thread Profiler that
+ // the thread has started spinning. Ideally, we would do this notification
+ // *before* the first failed attempt to steal, but at that point we do not
+ // know that the steal will fail.
+ ITT_NOTIFY(sync_prepare, this);
+ failure_count = 0;
+ }
+ // Pause, even if we are going to yield, because the yield might return immediately.
+ __TBB_Pause(PauseTime);
+ int yield_threshold = 2*int(n);
+ if( failure_count>=yield_threshold ) {
+ __TBB_Yield();
+ if( failure_count>=yield_threshold+100 ) {
+ // When a worker thread has nothing to do, return it to RML.
+ // For purposes of affinity support, the thread is considered idle while in RML.
+ if( return_if_no_work && my_arena->is_out_of_work() )
+ return NULL;
+ failure_count = yield_threshold;
+ }
+ }
+ }
+ return t;
+}
+
+template<typename SchedulerTraits>
+void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task* child ) {
+ __TBB_ASSERT( governor::is_set(this), NULL );
+ if( child ) {
+ child->prefix().owner = this;
+ }
+ __TBB_ASSERT( parent.ref_count() >= (child && child->parent() == &parent ? 2 : 1), "ref_count is too small" );
+ __TBB_ASSERT( assert_okay(), NULL );
+ // 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);
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT( parent.prefix().context || (is_worker() && &parent == dummy_task), "parent task does not have context" );
+#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
+ // of negative values representable by the reference_count type.
+ static const reference_count
+ // For normal dispatch loops
+ parents_work_done = 1,
+ // For termination dispatch loops in masters
+ all_local_work_done = (reference_count)3 << (sizeof(reference_count) * 8 - 2);
+ reference_count quit_point;
+ if( innermost_running_task == dummy_task ) {
+ // We are in the outermost task dispatch loop of a master thread,
+ __TBB_ASSERT( !is_worker(), NULL );
+ quit_point = &parent == dummy_task ? all_local_work_done : parents_work_done;
+ } else {
+ quit_point = parents_work_done;
+ }
+ task* old_innermost_running_task = innermost_running_task;
+#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
+exception_was_caught:
+ try {
+#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
+ // Outer loop steals tasks when necessary.
+ for(;;) {
+ // Middle loop evaluates tasks that are pulled off "array".
+ do {
+ // Inner loop evaluates tasks that are handed directly to us by other tasks.
+ while(t) {
+ __TBB_ASSERT( inbox.assert_is_idle(false), NULL );
+#if TBB_USE_ASSERT
+ __TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
+ __TBB_ASSERT( t->prefix().owner==this, NULL );
+#if __TBB_TASK_GROUP_CONTEXT
+ if ( !t->prefix().context->my_cancellation_requested )
+#endif
+ __TBB_ASSERT( 1L<<t->state() & (1L<<task::allocated|1L<<task::ready|1L<<task::reexecute), NULL );
+ __TBB_ASSERT(assert_okay(),NULL);
+#endif /* TBB_USE_ASSERT */
+ task* t_next = NULL;
+ innermost_running_task = t;
+ t->prefix().state = task::executing;
+#if __TBB_TASK_GROUP_CONTEXT
+ if ( !t->prefix().context->my_cancellation_requested )
+#endif
+ {
+ GATHER_STATISTIC( ++execute_count );
+#if __TBB_TASK_GROUP_CONTEXT
+ if( SchedulerTraits::itt_possible )
+ ITT_STACK(callee_enter, t->prefix().context->itt_caller);
+#endif
+ t_next = t->execute();
+#if __TBB_TASK_GROUP_CONTEXT
+ if( SchedulerTraits::itt_possible )
+ ITT_STACK(callee_leave, t->prefix().context->itt_caller);
+#endif
+ if (t_next) {
+ __TBB_ASSERT( t_next->state()==task::allocated,
+ "if task::execute() returns task, it must be marked as allocated" );
+ t_next->prefix().extra_state &= ~es_task_is_stolen;
+#if STATISTICS
+ affinity_id next_affinity=t_next->prefix().affinity;
+ if (next_affinity != 0 && next_affinity != my_affinity_id)
+ GATHER_STATISTIC( ++proxy_bypass_count );
+#endif
+ }
+ }
+ __TBB_ASSERT(assert_okay(),NULL);
+ switch( task::state_type(t->prefix().state) ) {
+ case task::executing: {
+ task* s = t->parent();
+ __TBB_ASSERT( innermost_running_task==t, NULL );
+ __TBB_ASSERT( t->prefix().ref_count==0, "Task still has children after it has been executed" );
+ t->~task();
+ if( s )
+ tally_completion_of_predecessor(*s, t_next);
+ free_task<no_hint>( *t );
+ __TBB_ASSERT(assert_okay(),NULL);
+ break;
+ }
+
+ case task::recycle: // set by recycle_as_safe_continuation()
+ t->prefix().state = task::allocated;
+ __TBB_ASSERT( t_next != t, "a task returned from method execute() can not be recycled in another way" );
+ t->prefix().extra_state &= ~es_task_is_stolen;
+ // for safe continuation, need atomically decrement ref_count;
+ tally_completion_of_predecessor(*t, t_next);
+ __TBB_ASSERT(assert_okay(),NULL);
+ break;
+
+ case task::reexecute: // set by recycle_to_reexecute()
+ __TBB_ASSERT( t_next, "reexecution requires that method execute() return another task" );
+ __TBB_ASSERT( t_next != t, "a task returned from method execute() can not be recycled in another way" );
+ t->prefix().state = task::allocated;
+ t->prefix().extra_state &= ~es_task_is_stolen;
+ local_spawn( *t, t->prefix().next );
+ __TBB_ASSERT(assert_okay(),NULL);
+ break;
+ case task::allocated:
+ t->prefix().extra_state &= ~es_task_is_stolen;
+ break;
+#if TBB_USE_ASSERT
+ case task::ready:
+ __TBB_ASSERT( false, "task is in READY state upon return from method execute()" );
+ break;
+ default:
+ __TBB_ASSERT( false, "illegal state" );
+#else
+ default: // just to shut up some compilation warnings
+ break;
+#endif /* TBB_USE_ASSERT */
+ }
+
+ if( t_next ) {
+ // The store here has a subtle secondary effect - it fetches *t_next into cache.
+ t_next->prefix().owner = this;
+ }
+ t = t_next;
+ } // end of scheduler bypass loop
+ __TBB_ASSERT(assert_okay(),NULL);
+
+ if ( parent.prefix().ref_count == quit_point )
+ break;
+ t = get_task();
+ __TBB_ASSERT(!t || !is_proxy(*t),"unexpected proxy");
+#if TBB_USE_ASSERT
+ __TBB_ASSERT(assert_okay(),NULL);
+ if(t) {
+ AssertOkay(*t);
+ __TBB_ASSERT( t->prefix().owner==this, "thread got task that it does not own" );
+ }
+#endif /* TBB_USE_ASSERT */
+ } while( t ); // end of local task array processing loop
+
+ if ( quit_point == all_local_work_done ) {
+ __TBB_ASSERT( my_arena_slot == &dummy_slot && my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+ innermost_running_task = old_innermost_running_task;
+ return;
+ }
+#if __TBB_ARENA_PER_MASTER
+ __TBB_ASSERT( my_arena->my_max_num_workers > 0 || parent.prefix().ref_count == 1, "deadlock detected" );
+#else /* !__TBB_ARENA_PER_MASTER */
+ __TBB_ASSERT( my_arena->prefix().number_of_workers>0||parent.prefix().ref_count==1, "deadlock detected" );
+#endif /* !__TBB_ARENA_PER_MASTER */
+ // old_innermost_running_task is NULL *iff* a worker thread is in its "inborn" dispath loop
+ // (i.e. its execution stack is empty), and it should return from there if no work is available.
+ t = receive_or_steal_task( parent.prefix().ref_count, !old_innermost_running_task );
+ if (!t) {
+ if( parent.prefix().ref_count==1 ) goto done;
+ __TBB_ASSERT( is_worker() && !old_innermost_running_task, "a thread exits dispatch loop prematurely" );
+ innermost_running_task = NULL;
+ return;
+ }
+ __TBB_ASSERT(t,NULL);
+ __TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
+ t->prefix().owner = this;
+ } // end of stealing loop
+#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
+ } TbbCatchAll( t->prefix().context );
+
+ if( task::state_type(t->prefix().state) == task::recycle ) { // state set by recycle_as_safe_continuation()
+ t->prefix().state = task::allocated;
+ // for safe continuation, need to atomically decrement ref_count;
+ if( SchedulerTraits::itt_possible )
+ ITT_NOTIFY(sync_releasing, &t->prefix().ref_count);
+ if( __TBB_FetchAndDecrementWrelease(&t->prefix().ref_count)==1 ) {
+ if( SchedulerTraits::itt_possible )
+ ITT_NOTIFY(sync_acquired, &t->prefix().ref_count);
+ }else{
+ t = NULL;
+ }
+ }
+ goto exception_was_caught;
+#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
+done:
+ if ( !ConcurrentWaitsEnabled(parent) )
+ parent.prefix().ref_count = 0;
+#if TBB_USE_ASSERT
+ parent.prefix().extra_state &= ~es_ref_count_active;
+#endif /* TBB_USE_ASSERT */
+ innermost_running_task = old_innermost_running_task;
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT(parent.prefix().context && dummy_task->prefix().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 ( innermost_running_task == dummy_task && parent_ctx == dummy_task->prefix().context ) {
+ // 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;
+ __TBB_ASSERT(dummy_task->prefix().context == parent_ctx || !CancellationInfoPresent(*dummy_task),
+ "Unexpected exception or cancellation data in the dummy task");
+ // If possible, add assertion that master's dummy task context does not have children
+ }
+ if ( pe )
+ pe->throw_self();
+ }
+ __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(*dummy_task),
+ "Worker's dummy task context modified");
+ __TBB_ASSERT(innermost_running_task != dummy_task || !CancellationInfoPresent(*dummy_task),
+ "Unexpected exception or cancellation data in the master's dummy task");
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ __TBB_ASSERT( assert_okay(), NULL );
+}
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* _TBB_custom_scheduler_H */
diff --git a/src/tbb/dynamic_link.cpp b/src/tbb/dynamic_link.cpp
index a1695a8..abefa62 100644
--- a/src/tbb/dynamic_link.cpp
+++ b/src/tbb/dynamic_link.cpp
@@ -103,9 +103,13 @@ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptor
return true;
// 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
+ dynamic_link_handle module = LoadLibrary (library);
+#else
UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);
dynamic_link_handle module = LoadLibrary (library);
SetErrorMode (prev_mode);
+#endif /* _XBOX */
#else
dynamic_link_handle module = dlopen( library, RTLD_LAZY );
#endif /* _WIN32||_WIN64 */
diff --git a/src/tbb/dynamic_link.h b/src/tbb/dynamic_link.h
index c7d3d5a..794f508 100644
--- a/src/tbb/dynamic_link.h
+++ b/src/tbb/dynamic_link.h
@@ -42,7 +42,13 @@
#include <stddef.h>
#if _WIN32||_WIN64
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
#include <windows.h>
+#endif
#endif /* _WIN32||_WIN64 */
OPEN_INTERNAL_NAMESPACE
diff --git a/src/tbb/enumerable_thread_specific.cpp b/src/tbb/enumerable_thread_specific.cpp
deleted file mode 100644
index 8425be6..0000000
--- a/src/tbb/enumerable_thread_specific.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- Copyright 2005-2010 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/enumerable_thread_specific.h"
-#include "tbb/concurrent_queue.h"
-#include "tbb/cache_aligned_allocator.h"
-#include "tbb/atomic.h"
-#include "tbb/spin_mutex.h"
-
-namespace tbb {
-
- namespace internal {
-
- // Manages fake TLS keys and fake TLS space
- // Uses only a single native TLS key through use of an enumerable_thread_specific< ... , ets_key_per_instance >
- class tls_single_key_manager {
-
- // Typedefs
- typedef concurrent_vector<void *> local_vector_type;
- typedef enumerable_thread_specific< local_vector_type, cache_aligned_allocator<local_vector_type>, ets_key_per_instance > my_ets_type;
- typedef local_vector_type::size_type fake_key_t;
-
- // The fake TLS space
- my_ets_type my_vectors;
-
- // The next never-yet-assigned fake TLS key
- atomic< fake_key_t > next_key;
-
- // A Q of fake TLS keys that can be reused
- typedef spin_mutex free_mutex_t;
- free_mutex_t free_mutex;
-
- struct free_node_t {
- fake_key_t key;
- free_node_t *next;
- };
-
- cache_aligned_allocator< free_node_t > my_allocator;
- free_node_t *free_stack;
-
- bool pop_if_present( fake_key_t &k ) {
- free_node_t *n = NULL;
- {
- free_mutex_t::scoped_lock(free_mutex);
- n = free_stack;
- if (n) free_stack = n->next;
- }
- if ( n ) {
- k = n->key;
- my_allocator.deallocate(n,1);
- return true;
- }
- return false;
- }
-
- void push( fake_key_t &k ) {
- free_node_t *n = my_allocator.allocate(1);
- n->key = k;
- {
- free_mutex_t::scoped_lock(free_mutex);
- n->next = free_stack;
- free_stack = n;
- }
- }
-
- public:
-
- tls_single_key_manager() : free_stack(NULL) {
- next_key = 0;
- }
-
- ~tls_single_key_manager() {
- free_node_t *n = free_stack;
- while (n != NULL) {
- free_node_t *next = n->next;
- my_allocator.deallocate(n,1);
- n = next;
- }
- }
-
- // creates or finds an available fake TLS key
- inline void create_key( fake_key_t &k ) {
- if ( !(free_stack && pop_if_present( k )) ) {
- k = next_key.fetch_and_add(1);
- }
- }
-
- // resets the fake TLS space associated with the key and then recycles the key
- inline void destroy_key( fake_key_t &k ) {
- for ( my_ets_type::iterator i = my_vectors.begin(); i != my_vectors.end(); ++i ) {
- local_vector_type &ivec = *i;
- if (ivec.size() > k)
- ivec[k] = NULL;
- }
- push(k);
- }
-
- // sets the fake TLS space to point to the given value for this thread
- inline void set_tls( fake_key_t &k, void *value ) {
- local_vector_type &my_vector = my_vectors.local();
- local_vector_type::size_type size = my_vector.size();
-
- if ( size <= k ) {
- // We use grow_by so that we can initialize the pointers to NULL
- my_vector.grow_by( k - size + 1, NULL );
- }
- my_vector[k] = value;
- }
-
- inline void *get_tls( fake_key_t &k ) {
- local_vector_type &my_vector = my_vectors.local();
- if (my_vector.size() > k)
- return my_vector[k];
- else
- return NULL;
- }
-
- };
-
- // The single static instance of tls_single_key_manager
- static tls_single_key_manager tls_key_manager;
-
- // The EXPORTED functions
- void
- tls_single_key_manager_v4::create_key( tls_key_t &k) {
- tls_key_manager.create_key( k );
- }
-
- void
- tls_single_key_manager_v4::destroy_key( tls_key_t &k) {
- tls_key_manager.destroy_key( k );
- }
-
- void
- tls_single_key_manager_v4::set_tls( tls_key_t &k, void *value) {
- tls_key_manager.set_tls( k, value);
- }
-
- void *
- tls_single_key_manager_v4::get_tls( tls_key_t &k ) {
- return tls_key_manager.get_tls( k );
- }
-
- }
-
-}
-
diff --git a/src/tbb/governor.cpp b/src/tbb/governor.cpp
new file mode 100644
index 0000000..74ba859
--- /dev/null
+++ b/src/tbb/governor.cpp
@@ -0,0 +1,241 @@
+/*
+ Copyright 2005-2010 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 "governor.h"
+#include "tbb_main.h"
+#include "scheduler.h"
+#if __TBB_ARENA_PER_MASTER
+#include "market.h"
+#endif /* __TBB_ARENA_PER_MASTER */
+#include "arena.h"
+
+#include "tbb/task_scheduler_init.h"
+
+namespace tbb {
+namespace internal {
+
+//------------------------------------------------------------------------
+// governor
+//------------------------------------------------------------------------
+
+namespace rml {
+ tbb_server* make_private_server( tbb_client& client );
+}
+
+void governor::acquire_resources () {
+#if USE_PTHREAD
+ int status = theTLS.create(auto_terminate);
+#else
+ int status = theTLS.create();
+#endif
+ if( status )
+ handle_perror(status, "TBB failed to initialize TLS storage\n");
+
+ ::rml::factory::status_type res = theRMLServerFactory.open();
+ UsePrivateRML = res != ::rml::factory::st_success;
+}
+
+void governor::release_resources () {
+ theRMLServerFactory.close();
+#if TBB_USE_ASSERT
+ if( __TBB_InitOnce::initialization_done() && theTLS.get() )
+ runtime_warning( "TBB is unloaded while tbb::task_scheduler_init object is alive?" );
+#endif
+ int status = theTLS.destroy();
+ if( status )
+ handle_perror(status, "TBB failed to destroy TLS storage");
+}
+
+rml::tbb_server* governor::create_rml_server ( rml::tbb_client& client ) {
+ rml::tbb_server* server = NULL;
+ if( !UsePrivateRML ) {
+ ::rml::factory::status_type status = theRMLServerFactory.make_server( server, client );
+ if( status != ::rml::factory::st_success ) {
+ UsePrivateRML = true;
+ runtime_warning( "rml::tbb_factorymake_server failed with status %x, falling back on private rml", status );
+ }
+ }
+ if ( !server ) {
+ __TBB_ASSERT( UsePrivateRML, NULL );
+ server = rml::make_private_server( client );
+ }
+ __TBB_ASSERT( server, "Failed to create RML server" );
+ return server;
+}
+
+#if !__TBB_ARENA_PER_MASTER
+
+arena* governor::obtain_arena( int number_of_threads, stack_size_type thread_stack_size ) {
+ mutex::scoped_lock lock( theArenaMutex );
+ arena* arena = theArena;
+ if( arena ) {
+ arena->prefix().number_of_masters += 1;
+ } else {
+ __TBB_ASSERT( number_of_threads > 0, NULL );
+ arena = arena::allocate_arena( 2*number_of_threads, number_of_threads-1,
+ thread_stack_size ? thread_stack_size : ThreadStackSize );
+ __TBB_ASSERT( arena->prefix().number_of_masters==1, NULL );
+ NumWorkers = arena->prefix().number_of_workers;
+
+ arena->prefix().server = create_rml_server( arena->prefix() );
+
+ // Publish the arena.
+ // A memory release fence is not required here, because workers have not started yet,
+ // and concurrent masters inspect theArena while holding theArenaMutex.
+ __TBB_ASSERT( !theArena, NULL );
+ theArena = arena;
+ }
+ return arena;
+}
+
+void governor::finish_with_arena() {
+ mutex::scoped_lock lock( theArenaMutex );
+ arena* a = theArena;
+ __TBB_ASSERT( a, "theArena is missing" );
+ if( --(a->prefix().number_of_masters) )
+ a = NULL;
+ else {
+ theArena = NULL;
+ // Must do this while holding lock, otherwise terminate message might reach
+ // RML thread *after* initialize message reaches it for the next arena,
+ // which causes TLS to be set to new value before old one is erased!
+ a->close_arena();
+ }
+}
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+void governor::sign_on(generic_scheduler* s) {
+ __TBB_ASSERT( !s->is_registered, NULL );
+ s->is_registered = true;
+#if !__TBB_ARENA_PER_MASTER
+ __TBB_InitOnce::add_ref();
+#endif /* !__TBB_ARENA_PER_MASTER */
+ theTLS.set(s);
+}
+
+void governor::sign_off(generic_scheduler* s) {
+ if( s->is_registered ) {
+ __TBB_ASSERT( theTLS.get()==s || (!s->is_worker() && !theTLS.get()), "attempt to unregister a wrong scheduler instance" );
+ theTLS.set(NULL);
+ s->is_registered = false;
+#if !__TBB_ARENA_PER_MASTER
+ __TBB_InitOnce::remove_ref();
+#endif /* !__TBB_ARENA_PER_MASTER */
+ }
+}
+
+generic_scheduler* governor::init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init ) {
+ if( !__TBB_InitOnce::initialization_done() )
+ DoOneTimeInitializations();
+ generic_scheduler* s = theTLS.get();
+ if( s ) {
+ s->ref_count += 1;
+ return s;
+ }
+ if( (int)num_threads == task_scheduler_init::automatic )
+ num_threads = default_num_threads();
+#if __TBB_ARENA_PER_MASTER
+ s = generic_scheduler::create_master(
+ market::create_arena( num_threads - 1, stack_size ? stack_size : ThreadStackSize ) );
+#else /* !__TBB_ARENA_PER_MASTER */
+ s = generic_scheduler::create_master( *obtain_arena(num_threads, stack_size) );
+#endif /* !__TBB_ARENA_PER_MASTER */
+ __TBB_ASSERT(s, "Somehow a local scheduler creation for a master thread failed");
+ s->is_auto_initialized = auto_init;
+ return s;
+}
+
+void governor::terminate_scheduler( generic_scheduler* s ) {
+ __TBB_ASSERT( s == theTLS.get(), "Attempt to terminate non-local scheduler instance" );
+ if( !--(s->ref_count) )
+ s->cleanup_master();
+}
+
+void governor::auto_terminate(void* arg){
+ generic_scheduler* s = static_cast<generic_scheduler*>(arg);
+ if( s && s->is_auto_initialized ) {
+ if( !--(s->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.
+ theTLS.set(s);
+ s->cleanup_master();
+ theTLS.set(NULL);
+ }
+ else
+ s->cleanup_master();
+ }
+ }
+}
+
+void governor::print_version_info () {
+ if ( UsePrivateRML )
+ PrintExtraVersionInfo( "RML", "private" );
+ else {
+ PrintExtraVersionInfo( "RML", "shared" );
+ theRMLServerFactory.call_with_server_info( PrintRMLVersionInfo, (void*)"" );
+ }
+}
+
+} // namespace internal
+
+//------------------------------------------------------------------------
+// task_scheduler_init
+//------------------------------------------------------------------------
+
+using namespace internal;
+
+/** Left out-of-line for the sake of the backward binary compatibility **/
+void task_scheduler_init::initialize( int number_of_threads ) {
+ initialize( number_of_threads, 0 );
+}
+
+void task_scheduler_init::initialize( int number_of_threads, stack_size_type thread_stack_size ) {
+ if( number_of_threads!=deferred ) {
+ __TBB_ASSERT( !my_scheduler, "task_scheduler_init already initialized" );
+ __TBB_ASSERT( number_of_threads==-1 || number_of_threads>=1,
+ "number_of_threads for task_scheduler_init must be -1 or positive" );
+ my_scheduler = governor::init_scheduler( number_of_threads, thread_stack_size );
+ } else {
+ __TBB_ASSERT( !thread_stack_size, "deferred initialization ignores stack size setting" );
+ }
+}
+
+void task_scheduler_init::terminate() {
+ generic_scheduler* s = static_cast<generic_scheduler*>(my_scheduler);
+ my_scheduler = NULL;
+ __TBB_ASSERT( s, "task_scheduler_init::terminate without corresponding task_scheduler_init::initialize()");
+ governor::terminate_scheduler(s);
+}
+
+int task_scheduler_init::default_num_threads() {
+ return governor::default_num_threads();
+}
+
+} // namespace tbb
diff --git a/src/tbb/governor.h b/src/tbb/governor.h
new file mode 100644
index 0000000..981c260
--- /dev/null
+++ b/src/tbb/governor.h
@@ -0,0 +1,189 @@
+/*
+ Copyright 2005-2010 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_governor_H
+#define _TBB_governor_H
+
+#include "tbb/task_scheduler_init.h"
+#if !__TBB_ARENA_PER_MASTER
+#include "tbb/mutex.h"
+#endif /* !__TBB_ARENA_PER_MASTER */
+#include "../rml/include/rml_tbb.h"
+
+#include "tbb_misc.h" // for DetectNumberOfWorkers and ThreadStackSize
+#include "tls.h"
+
+namespace tbb {
+namespace internal {
+
+#if __TBB_ARENA_PER_MASTER
+class market;
+#else /* !__TBB_ARENA_PER_MASTER */
+class arena;
+#endif /* !__TBB_ARENA_PER_MASTER */
+class generic_scheduler;
+class __TBB_InitOnce;
+
+//------------------------------------------------------------------------
+// Class governor
+//------------------------------------------------------------------------
+
+#if __TBB_ARENA_PER_MASTER
+//! The class handles access to the single instance of market, and to TLS to keep scheduler instances.
+#else /* !__TBB_ARENA_PER_MASTER */
+//! The class handles access to the single instance of arena, and to TLS to keep scheduler instances.
+#endif /* !__TBB_ARENA_PER_MASTER */
+/** It also supports automatic on-demand intialization of the TBB scheduler.
+ The class contains only static data members and methods.*/
+class governor {
+ friend class __TBB_InitOnce;
+#if __TBB_ARENA_PER_MASTER
+ friend class market;
+#else /* !__TBB_ARENA_PER_MASTER */
+ friend void ITT_DoUnsafeOneTimeInitialization ();
+#endif /* __TBB_ARENA_PER_MASTER */
+
+ //! TLS for scheduler instances associated with individual threads
+ static basic_tls<generic_scheduler*> theTLS;
+
+#if !__TBB_ARENA_PER_MASTER
+ //! Currently active arena
+ static arena* theArena;
+
+ //! Mutex guarding creation/destruction of theArena
+ static mutex theArenaMutex;
+
+ //! Caches the number of workers in the currently active arena
+ static unsigned NumWorkers;
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Caches the maximal level of paralellism supported by the hardware
+ static unsigned DefaultNumberOfThreads;
+
+ static rml::tbb_factory theRMLServerFactory;
+
+ static bool UsePrivateRML;
+
+ //! Create key for thread-local storage and initialize RML.
+ static void acquire_resources ();
+
+ //! Destroy the thread-local storage key and deinitialize RML.
+ static void release_resources ();
+
+ static rml::tbb_server* create_rml_server ( rml::tbb_client& );
+
+#if !__TBB_ARENA_PER_MASTER
+ //! Obtain the instance of arena to register a new master thread
+ /** If there is no active arena, create one. */
+ static arena* obtain_arena( int number_of_threads, stack_size_type thread_stack_size );
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! The internal routine to undo automatic initialization.
+ /** The signature is written with void* so that the routine
+ can be the destructor argument to pthread_key_create. */
+ static void auto_terminate(void* scheduler);
+
+public:
+ static unsigned default_num_threads () {
+ // No memory fence required, because at worst each invoking thread calls DetectNumberOfWorkers once.
+ return DefaultNumberOfThreads ? DefaultNumberOfThreads :
+ DefaultNumberOfThreads = DetectNumberOfWorkers();
+ }
+ //! Processes scheduler initialization request (possibly nested) in a master thread
+ /** If necessary creates new instance of arena and/or local scheduler.
+ The auto_init argument specifies if the call is due to automatic initialization. **/
+ static generic_scheduler* init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init = false );
+
+ //! Processes scheduler termination request (possibly nested) in a master thread
+ static void terminate_scheduler( generic_scheduler* s );
+
+#if __TBB_ARENA_PER_MASTER
+ //! Returns number of worker threads in the currently active arena.
+ inline static unsigned max_number_of_workers ();
+
+#else /* !__TBB_ARENA_PER_MASTER */
+ //! Dereference arena when a master thread stops using TBB.
+ /** If no more masters in the arena, terminate workers and destroy it. */
+ static void finish_with_arena();
+
+ static unsigned max_number_of_workers() {
+ __TBB_ASSERT( theArena, "thread did not activate a task_scheduler_init object?" );
+ return NumWorkers;
+ }
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Register TBB scheduler instance in thread local storage.
+ static void sign_on(generic_scheduler* s);
+
+ //! Unregister TBB scheduler instance from thread local storage.
+ static void sign_off(generic_scheduler* s);
+
+ //! Used to check validity of the local scheduler TLS contents.
+ static bool is_set ( generic_scheduler* s ) { return theTLS.get() == s; }
+
+ //! Temporarily set TLS slot to the given scheduler
+ static void assume_scheduler( generic_scheduler* s ) {
+#if !__TBB_ARENA_PER_MASTER
+ // should be called by a Master
+ __TBB_ASSERT( !s || !theTLS.get(), "should be called by master" );
+#endif
+ theTLS.set( s );
+ }
+
+ //! Obtain the thread local instance of the TBB scheduler.
+ /** If the scheduler has not been initialized yet, initialization is done automatically.
+ Note that auto-initialized scheduler instance is destroyed only when its thread terminates. **/
+ static generic_scheduler* local_scheduler () {
+ generic_scheduler* s = theTLS.get();
+ return s ? s : init_scheduler( (unsigned)task_scheduler_init::automatic, 0, true );
+ }
+
+ static generic_scheduler* local_scheduler_if_initialized () {
+ return theTLS.get();
+ }
+
+ //! Undo automatic initialization if necessary; call when a thread exits.
+ static void terminate_auto_initialized_scheduler() {
+ auto_terminate( theTLS.get() );
+ }
+
+ static void print_version_info ();
+}; // class governor
+
+} // namespace internal
+} // namespace tbb
+
+#if __TBB_ARENA_PER_MASTER
+#include "scheduler.h"
+
+inline unsigned tbb::internal::governor::max_number_of_workers () {
+ return local_scheduler()->number_of_workers_in_my_arena();
+}
+#endif /* __TBB_ARENA_PER_MASTER */
+
+#endif /* _TBB_governor_H */
diff --git a/src/tbb/intrusive_list.h b/src/tbb/intrusive_list.h
new file mode 100644
index 0000000..ed1bf1d
--- /dev/null
+++ b/src/tbb/intrusive_list.h
@@ -0,0 +1,255 @@
+/*
+ Copyright 2005-2010 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_intrusive_list_H
+#define _TBB_intrusive_list_H
+
+#include "tbb/tbb_stddef.h"
+
+#if __TBB_ARENA_PER_MASTER
+
+namespace tbb {
+namespace internal {
+
+//! Data structure to be inherited by the types that can form intrusive lists.
+/** Intrusive list is formed by means of the member_intrusive_list<T> template class.
+ Note that type T must derive from intrusive_list_node either publicly or
+ declare instantiation member_intrusive_list<T> as a friend.
+ This class implements a limited subset of std::list interface. **/
+struct intrusive_list_node {
+ intrusive_list_node *my_prev_node,
+ *my_next_node;
+#if TBB_USE_ASSERT
+ intrusive_list_node () { my_prev_node = my_next_node = this; }
+#endif /* TBB_USE_ASSERT */
+};
+
+//! List of element of type T, where T is derived from intrusive_list_node
+/** The class is not thread safe. **/
+template <class List, class T>
+class intrusive_list_base {
+ //! Pointer to the head node
+ intrusive_list_node my_head;
+
+ //! Number of list elements
+ size_t my_size;
+
+ static intrusive_list_node& node ( T& item ) { return List::node(item); }
+
+ static T& item ( intrusive_list_node* node ) { return List::item(node); }
+
+ template<class Iterator>
+ class iterator_impl {
+ Iterator& self () { return *static_cast<Iterator*>(this); }
+
+ //! Pointer to the head of the list being iterated
+ intrusive_list_node *my_list_head;
+
+ //! Node the iterator points to at the moment
+ intrusive_list_node *my_pos;
+
+ protected:
+ iterator_impl ( intrusive_list_node* head, intrusive_list_node* pos )
+ : my_list_head(head), my_pos(pos)
+ {}
+
+ T& item () const {
+ //return *reinterpret_cast<T*>((char*)my_pos - ((ptrdiff_t)&(reinterpret_cast<T*>(0x1000)->*NodePtr) - 0x1000));
+ return intrusive_list_base::item(my_pos);
+ }
+
+ public:
+ iterator_impl () : my_list_head(NULL), my_pos(NULL) {}
+
+ bool operator == ( const Iterator& it ) const {
+ return my_pos == it.my_pos;
+ }
+
+ bool operator != ( const Iterator& it ) const {
+ return my_pos != it.my_pos;
+ }
+
+ Iterator& operator++ () {
+ my_pos = my_pos->my_next_node;
+ return self();
+ }
+
+ Iterator& operator-- () {
+ my_pos = my_pos->my_prev_node;
+ return self();
+ }
+
+ Iterator operator++ ( int ) {
+ Iterator result = self();
+ ++(*this);
+ return result;
+ }
+
+ Iterator operator-- ( int ) {
+ Iterator result = self();
+ --(*this);
+ return result;
+ }
+ }; // intrusive_list_base::iterator_impl
+
+ void assert_ok () const {
+ __TBB_ASSERT( (my_head.my_prev_node == &my_head && !my_size) ||
+ (my_head.my_next_node != &my_head && my_size >0), "intrusive_list_base corrupted" );
+#if TBB_USE_ASSERT >= 2
+ size_t i = 0;
+ for ( intrusive_list_node *n = my_head.my_next_node; n != &my_head; n = n->my_next_node )
+ ++i;
+ __TBB_ASSERT( my_size == i, "Wrong size" );
+#endif /* TBB_USE_ASSERT >= 2 */
+ }
+
+public:
+ class iterator : public iterator_impl<iterator> {
+ template <class U, class V> friend class intrusive_list_base;
+
+ iterator ( intrusive_list_node* head, intrusive_list_node* pos )
+ : iterator_impl<iterator>( head, pos )
+ {}
+ public:
+ iterator () {}
+
+ T* operator-> () const { return &this->item(); }
+
+ T& operator* () const { return this->item(); }
+ }; // class iterator
+
+ class const_iterator : public iterator_impl<const_iterator> {
+ template <class U, class V> friend class intrusive_list_base;
+
+ const_iterator ( const intrusive_list_node* head, const intrusive_list_node* pos )
+ : iterator_impl<const_iterator>( const_cast<intrusive_list_node*>(head), const_cast<intrusive_list_node*>(pos) )
+ {}
+ public:
+ const_iterator () {}
+
+ const T* operator-> () const { return &this->item(); }
+
+ const T& operator* () const { return this->item(); }
+ }; // class iterator
+
+ intrusive_list_base () : my_size(0) {
+ my_head.my_prev_node = &my_head;
+ my_head.my_next_node = &my_head;
+ }
+
+ bool empty () const { return my_head.my_next_node == &my_head; }
+
+ size_t size () const { return my_size; }
+
+ iterator begin () { return iterator(&my_head, my_head.my_next_node); }
+
+ iterator end () { return iterator(&my_head, &my_head); }
+
+ const_iterator begin () const { return const_iterator(&my_head, my_head.my_next_node); }
+
+ const_iterator end () const { return const_iterator(&my_head, &my_head); }
+
+ void push_front ( T& val ) {
+ __TBB_ASSERT( node(val).my_prev_node == &node(val) && node(val).my_next_node == &node(val),
+ "Object with intrusive list node can be part of only one intrusive list simultaneously" );
+ // An object can be part of only one intrusive list at the given moment via the given node member
+ node(val).my_prev_node = &my_head;
+ node(val).my_next_node = my_head.my_next_node;
+ my_head.my_next_node->my_prev_node = &node(val);
+ my_head.my_next_node = &node(val);
+ ++my_size;
+ assert_ok();
+ }
+
+ void remove( T& val ) {
+ __TBB_ASSERT( node(val).my_prev_node != &node(val) && node(val).my_next_node != &node(val), "Element to remove is not in the list" );
+ --my_size;
+ node(val).my_next_node->my_prev_node = node(val).my_prev_node;
+ node(val).my_prev_node->my_next_node = node(val).my_next_node;
+#if TBB_USE_ASSERT
+ node(val).my_prev_node = node(val).my_next_node = &node(val);
+#endif
+ assert_ok();
+ }
+
+ iterator erase ( iterator it ) {
+ T& val = *it;
+ ++it;
+ remove( val );
+ return it;
+ }
+
+}; // intrusive_list_base
+
+
+//! Double linked list of items of type T containing a member of type intrusive_list_node.
+/** NodePtr is a member pointer to the node data field. Class U is either T or
+ a base class of T containing the node member. Default values exist for the sake
+ of a partial specialization working with inheritance case.
+
+ The list does not have ownership of its items. Its purpose is to avoid dynamic
+ memory allocation when forming lists of existing objects.
+
+ The class is not thread safe. **/
+template <class T, class U, intrusive_list_node U::*NodePtr>
+class memptr_intrusive_list : public intrusive_list_base<memptr_intrusive_list<T, U, NodePtr>, T>
+{
+ friend class intrusive_list_base<memptr_intrusive_list<T, U, NodePtr>, T>;
+
+ static intrusive_list_node& node ( T& val ) { return val.*NodePtr; }
+
+ static T& item ( intrusive_list_node* node ) {
+ // Cannot use __TBB_offestof (and consequently __TBB_get_object_ref) macro
+ // with *NodePtr argument because gcc refuses to interpret pasted "->" and "*"
+ // as member pointer dereferencing operator, and explicit usage of ## in
+ // __TBB_offestof implementation breaks operations with normal member names.
+ return *reinterpret_cast<T*>((char*)node - ((ptrdiff_t)&(reinterpret_cast<T*>(0x1000)->*NodePtr) - 0x1000));
+ }
+}; // intrusive_list<T, U, NodePtr>
+
+//! Double linked list of items of type T that is derived from intrusive_list_node class.
+/** The list does not have ownership of its items. Its purpose is to avoid dynamic
+ memory allocation when forming lists of existing objects.
+
+ The class is not thread safe. **/
+template <class T>
+class intrusive_list : public intrusive_list_base<intrusive_list<T>, T>
+{
+ friend class intrusive_list_base<intrusive_list<T>, T>;
+
+ static intrusive_list_node& node ( T& val ) { return val; }
+
+ static T& item ( intrusive_list_node* node ) { return *static_cast<T*>(node); }
+}; // intrusive_list<T>
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* __TBB_ARENA_PER_MASTER */
+
+#endif /* _TBB_intrusive_list_H */
diff --git a/src/tbb/itt_notify.cpp b/src/tbb/itt_notify.cpp
index 77ac33e..4e39943 100644
--- a/src/tbb/itt_notify.cpp
+++ b/src/tbb/itt_notify.cpp
@@ -26,248 +26,63 @@
the GNU General Public License.
*/
-#include "itt_notify.h"
-#include "tbb/tbb_machine.h"
-
-#include <stdio.h>
-
-namespace tbb {
- namespace internal {
-
-#if __TBB_NEW_ITT_NOTIFY
#if DO_ITT_NOTIFY
- extern "C" int __TBB_load_ittnotify();
-
- bool InitializeITT () {
- return __TBB_load_ittnotify() != 0;
- }
-
-
-#endif /* DO_ITT_NOTIFY */
-#endif /* __TBB_NEW_ITT_NOTIFY */
-
- void itt_store_pointer_with_release_v3( void* dst, void* src ) {
- ITT_NOTIFY(sync_releasing, dst);
- __TBB_store_with_release(*static_cast<void**>(dst),src);
- }
-
- void* itt_load_pointer_with_acquire_v3( const void* src ) {
- void* result = __TBB_load_with_acquire(*static_cast<void*const*>(src));
- ITT_NOTIFY(sync_acquired, const_cast<void*>(src));
- return result;
- }
-
- void* itt_load_pointer_v3( const void* src ) {
- void* result = *static_cast<void*const*>(src);
- return result;
- }
-
- void itt_set_sync_name_v3( void* obj, const tchar* name) {
- ITT_SYNC_RENAME(obj, name);
- (void)obj, (void)name; // Prevents compiler warning when ITT support is switched off
- }
-
- } // namespace internal
-} // namespace tbb
-
+#if _WIN32||_WIN64
+ #ifndef UNICODE
+ #define UNICODE
+ #endif
+#endif /* WIN */
-#if !__TBB_NEW_ITT_NOTIFY
+extern "C" void ITT_DoOneTimeInitialization();
-#include "tbb_misc.h"
-#include "dynamic_link.h"
-#include "tbb/cache_aligned_allocator.h" /* NFS_MaxLineSize */
+#define ITT_SIMPLE_INIT 1
+#define __itt_init_ittlib_name(x,y) (ITT_DoOneTimeInitialization(), true)
-#if _WIN32||_WIN64
- #include <windows.h>
-#else /* !WIN */
- #include <dlfcn.h>
-#if __TBB_WEAK_SYMBOLS
- #pragma weak __itt_notify_sync_prepare
- #pragma weak __itt_notify_sync_acquired
- #pragma weak __itt_notify_sync_releasing
- #pragma weak __itt_notify_sync_cancel
- #pragma weak __itt_thr_name_set
- #pragma weak __itt_thread_set_name
- #pragma weak __itt_sync_create
- #pragma weak __itt_sync_rename
- extern "C" {
- void __itt_notify_sync_prepare(void *p);
- void __itt_notify_sync_cancel(void *p);
- void __itt_notify_sync_acquired(void *p);
- void __itt_notify_sync_releasing(void *p);
- int __itt_thr_name_set (void* p, int len);
- void __itt_thread_set_name (const char* name);
- void __itt_sync_create( void* obj, const char* name, const char* type, int attribute );
- void __itt_sync_rename( void* obj, const char* new_name );
- }
-#endif /* __TBB_WEAK_SYMBOLS */
-#endif /* !WIN */
+#include "tools_api/ittnotify_static.c"
namespace tbb {
namespace internal {
-
-#if DO_ITT_NOTIFY
-
-
-//! Table describing the __itt_notify handlers.
-static const dynamic_link_descriptor ITT_HandlerTable[] = {
- DLD( __itt_notify_sync_prepare, ITT_Handler_sync_prepare),
- DLD( __itt_notify_sync_acquired, ITT_Handler_sync_acquired),
- DLD( __itt_notify_sync_releasing, ITT_Handler_sync_releasing),
- DLD( __itt_notify_sync_cancel, ITT_Handler_sync_cancel),
-# if _WIN32||_WIN64
- DLD( __itt_thr_name_setW, ITT_Handler_thr_name_set),
- DLD( __itt_thread_set_nameW, ITT_Handler_thread_set_name),
-# else
- DLD( __itt_thr_name_set, ITT_Handler_thr_name_set),
- DLD( __itt_thread_set_name, ITT_Handler_thread_set_name),
-# endif /* _WIN32 || _WIN64 */
-
-
-# if _WIN32||_WIN64
- DLD( __itt_sync_createW, ITT_Handler_sync_create),
- DLD( __itt_sync_renameW, ITT_Handler_sync_rename)
-# else
- DLD( __itt_sync_create, ITT_Handler_sync_create),
- DLD( __itt_sync_rename, ITT_Handler_sync_rename)
-# endif
-};
-
-static const int ITT_HandlerTable_size =
- sizeof(ITT_HandlerTable)/sizeof(dynamic_link_descriptor);
-
-// LIBITTNOTIFY_NAME is the name of the ITT notification library
-# if _WIN32||_WIN64
-# define LIBITTNOTIFY_NAME "libittnotify.dll"
-# elif __linux__
-# define LIBITTNOTIFY_NAME "libittnotify.so"
-# else
-# error Intel(R) Threading Tools not provided for this OS
-# endif
-
-//! Performs tools support initialization.
-/** Is called by DoOneTimeInitializations and ITT_DoOneTimeInitialization in
- a protected (one-time) manner. Not to be invoked directly. **/
-bool InitializeITT() {
- bool result = false;
- // Check if we are running under a performance or correctness tool
- bool t_checker = GetBoolEnvironmentVariable("KMP_FOR_TCHECK");
- bool t_profiler = GetBoolEnvironmentVariable("KMP_FOR_TPROFILE");
- __TBB_ASSERT(!(t_checker&&t_profiler), NULL);
- if ( t_checker || t_profiler ) {
- // Yes, we are in the tool mode. Try to load libittnotify library.
- result = dynamic_link( LIBITTNOTIFY_NAME, ITT_HandlerTable, ITT_HandlerTable_size, 4 );
- }
- if (result){
- if ( t_checker ) {
- current_tool = ITC;
- } else if ( t_profiler ) {
- current_tool = ITP;
- }
- } else {
- // Clear away the proxy (dummy) handlers
- for (int i = 0; i < ITT_HandlerTable_size; i++)
- *ITT_HandlerTable[i].handler = NULL;
- current_tool = NONE;
- }
- PrintExtraVersionInfo( "ITT", result?"yes":"no" );
- return result;
-}
-
-//! Performs one-time initialization of tools interoperability mechanisms.
-/** Defined in task.cpp. Makes a protected do-once call to InitializeITT(). **/
-void ITT_DoOneTimeInitialization();
-
-/** The following dummy_xxx functions are proxies that correspond to tool notification
- APIs and are used to initialize corresponding pointers to the tool notifications
- (ITT_Handler_xxx). When the first call to ITT_Handler_xxx takes place before
- the whole library initialization (done by DoOneTimeInitializations) happened,
- the proxy handler performs initialization of the tools support. After this
- ITT_Handler_xxx will be set to either tool notification pointer or NULL. **/
-void dummy_sync_prepare( volatile void* ptr ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_sync_prepare!=&dummy_sync_prepare, NULL );
- if (ITT_Handler_sync_prepare)
- (*ITT_Handler_sync_prepare) (ptr);
-}
-
-void dummy_sync_acquired( volatile void* ptr ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_sync_acquired!=&dummy_sync_acquired, NULL );
- if (ITT_Handler_sync_acquired)
- (*ITT_Handler_sync_acquired) (ptr);
-}
-
-void dummy_sync_releasing( volatile void* ptr ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_sync_releasing!=&dummy_sync_releasing, NULL );
- if (ITT_Handler_sync_releasing)
- (*ITT_Handler_sync_releasing) (ptr);
-}
-
-void dummy_sync_cancel( volatile void* ptr ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_sync_cancel!=&dummy_sync_cancel, NULL );
- if (ITT_Handler_sync_cancel)
- (*ITT_Handler_sync_cancel) (ptr);
-}
-
-int dummy_thr_name_set( const tchar* str, int number ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_thr_name_set!=&dummy_thr_name_set, NULL );
- if (ITT_Handler_thr_name_set)
- return (*ITT_Handler_thr_name_set) (str, number);
- return -1;
-}
-
-void dummy_thread_set_name( const tchar* name ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_thread_set_name!=&dummy_thread_set_name, NULL );
- if (ITT_Handler_thread_set_name)
- (*ITT_Handler_thread_set_name)( name );
-}
-
-void dummy_sync_create( void* obj, const tchar* objname, const tchar* objtype, int /*attribute*/ ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_sync_create!=&dummy_sync_create, NULL );
- ITT_SYNC_CREATE( obj, objtype, objname );
-}
-
-void dummy_sync_rename( void* obj, const tchar* new_name ) {
- ITT_DoOneTimeInitialization();
- __TBB_ASSERT( ITT_Handler_sync_rename!=&dummy_sync_rename, NULL );
- ITT_SYNC_RENAME(obj, new_name);
+int __TBB_load_ittnotify() {
+ return __itt_init_ittlib(NULL, __itt_group_none);
}
+}} // namespaces
+#endif /* DO_ITT_NOTIFY */
-//! Leading padding before the area where tool notification handlers are placed.
-/** Prevents cache lines where the handler pointers are stored from thrashing.
- Defined as extern to prevent compiler from placing the padding arrays separately
- from the handler pointers (which are declared as extern).
- Declared separately from definition to get rid of compiler warnings. **/
-extern char __ITT_Handler_leading_padding[NFS_MaxLineSize];
+#define __TBB_NO_IMPLICIT_LINKAGE 1
+#include "itt_notify.h"
-//! Trailing padding after the area where tool notification handlers are placed.
-extern char __ITT_Handler_trailing_padding[NFS_MaxLineSize];
+namespace tbb {
-char __ITT_Handler_leading_padding[NFS_MaxLineSize] = {0};
-PointerToITT_Handler ITT_Handler_sync_prepare = &dummy_sync_prepare;
-PointerToITT_Handler ITT_Handler_sync_acquired = &dummy_sync_acquired;
-PointerToITT_Handler ITT_Handler_sync_releasing = &dummy_sync_releasing;
-PointerToITT_Handler ITT_Handler_sync_cancel = &dummy_sync_cancel;
-PointerToITT_thr_name_set ITT_Handler_thr_name_set = &dummy_thr_name_set;
-PointerToITT_thread_set_name ITT_Handler_thread_set_name = &dummy_thread_set_name;
-PointerToITT_sync_create ITT_Handler_sync_create = &dummy_sync_create;
-PointerToITT_sync_rename ITT_Handler_sync_rename = &dummy_sync_rename;
-char __ITT_Handler_trailing_padding[NFS_MaxLineSize] = {0};
+#if DO_ITT_NOTIFY
+ const tchar
+ *SyncType_GlobalLock = _T("TbbGlobalLock"),
+ *SyncType_Scheduler = _T("%Constant")
+ ;
+ const tchar
+ *SyncObj_SchedulerInitialization = _T("TbbSchedulerInitialization"),
+ *SyncObj_SchedulersList = _T("TbbSchedulersList"),
+ *SyncObj_WorkerLifeCycleMgmt = _T("TBB Scheduler"),
+ *SyncObj_TaskStealingLoop = _T("TBB Scheduler"),
+ *SyncObj_WorkerTaskPool = _T("TBB Scheduler"),
+ *SyncObj_MasterTaskPool = _T("TBB Scheduler"),
+ *SyncObj_TaskPoolSpinning = _T("TBB Scheduler"),
+ *SyncObj_Mailbox = _T("TBB Scheduler"),
+ *SyncObj_TaskReturnList = _T("TBB Scheduler"),
+ *SyncObj_TaskStream = _T("TBB Scheduler"),
+ *SyncObj_ContextsList = _T("TBB Scheduler")
+ ;
+#endif /* DO_ITT_NOTIFY */
-target_tool current_tool = TO_BE_INITIALIZED;
+namespace internal {
+#if DO_ITT_NOTIFY
+ bool InitializeITT () {
+ return __TBB_load_ittnotify() != 0;
+ }
#endif /* DO_ITT_NOTIFY */
-} // namespace internal
-
+} // namespace internal
} // namespace tbb
-#endif /* !__TBB_NEW_ITT_NOTIFY */
diff --git a/src/tbb/itt_notify.h b/src/tbb/itt_notify.h
index 4fff7da..38cafd8 100644
--- a/src/tbb/itt_notify.h
+++ b/src/tbb/itt_notify.h
@@ -32,7 +32,6 @@
#include "tbb/tbb_stddef.h"
#if DO_ITT_NOTIFY
-#if __TBB_NEW_ITT_NOTIFY
#if _WIN32||_WIN64
#ifndef UNICODE
@@ -41,6 +40,8 @@
#endif /* WIN */
#include "tools_api/ittnotify.h"
+#include "tools_api/legacy/ittnotify.h"
+#include "tools_api/internal/ittnotify.h"
#if _WIN32||_WIN64
#undef _T
@@ -48,28 +49,25 @@
#define __itt_event_create __itt_event_createA
#endif /* WIN */
-#endif /* __TBB_NEW_ITT_NOTIFY */
#endif /* DO_ITT_NOTIFY */
+#if !ITT_CALLER_NULL
+#define ITT_CALLER_NULL ((__itt_caller)0)
+#endif
+
namespace tbb {
//! Unicode support
-#if _WIN32||_WIN64
+#if (_WIN32||_WIN64) && !__MINGW32__
//! Unicode character type. Always wchar_t on Windows.
/** We do not use typedefs from Windows TCHAR family to keep consistence of TBB coding style. **/
typedef wchar_t tchar;
//! Standard Windows macro to markup the string literals.
#define _T(string_literal) L ## string_literal
-#if !__TBB_NEW_ITT_NOTIFY
- #define tstrlen wcslen
-#endif /* !__TBB_NEW_ITT_NOTIFY */
#else /* !WIN */
typedef char tchar;
//! Standard Windows style macro to markup the string literals.
#define _T(string_literal) string_literal
-#if !__TBB_NEW_ITT_NOTIFY
- #define tstrlen strlen
-#endif /* !__TBB_NEW_ITT_NOTIFY */
#endif /* !WIN */
} // namespace tbb
@@ -83,10 +81,14 @@ namespace tbb {
extern const tchar
*SyncObj_SchedulerInitialization,
*SyncObj_SchedulersList,
+ *SyncObj_WorkerLifeCycleMgmt,
*SyncObj_TaskStealingLoop,
*SyncObj_WorkerTaskPool,
*SyncObj_MasterTaskPool,
- *SyncObj_SchedulerTermination,
+ *SyncObj_TaskPoolSpinning,
+ *SyncObj_Mailbox,
+ *SyncObj_TaskReturnList,
+ *SyncObj_TaskStream,
*SyncObj_ContextsList
;
@@ -97,13 +99,13 @@ namespace tbb {
} // namespace tbb
-#if __TBB_NEW_ITT_NOTIFY
// 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_RENAME(obj, name) __itt_sync_rename(obj, name)
-#endif /* __TBB_NEW_ITT_NOTIFY */
+#define ITT_STACK_CREATE(obj) obj = __itt_stack_caller_create()
+#define ITT_STACK(name, obj) __itt_stack_##name(obj)
#else /* !DO_ITT_NOTIFY */
@@ -111,94 +113,14 @@ namespace tbb {
#define ITT_THREAD_SET_NAME(name) ((void)0)
#define ITT_SYNC_CREATE(obj, type, name) ((void)0)
#define ITT_SYNC_RENAME(obj, name) ((void)0)
+#define ITT_STACK_CREATE(obj) ((void)0)
+#define ITT_STACK(name, obj) ((void)0)
#endif /* !DO_ITT_NOTIFY */
-
-#if !__TBB_NEW_ITT_NOTIFY
-
-#if DO_ITT_NOTIFY
-
namespace tbb {
-
-//! Identifies performance and correctness tools, which TBB sends special notifications to.
-/** Enumerators must be ORable bit values.
-
- Initializing global tool indicator with TO_BE_INITIALIZED is required
- to avoid bypassing early notification calls made through targeted macros until
- initialization is performed from somewhere else.
-
- Yet this entails another problem. The first targeted calls that happen to go
- into the proxy (dummy) handlers become promiscuous. **/
-enum target_tool {
- NONE = 0ul,
- ITC = 1ul,
- ITP = 2ul,
- TO_BE_INITIALIZED = ~0ul
-};
-
namespace internal {
-
-//! Types of the tool notification functions (and corresponding proxy handlers).
-typedef void (*PointerToITT_Handler)(volatile void*);
-typedef int (*PointerToITT_thr_name_set)(const tchar*, int);
-typedef void (*PointerToITT_thread_set_name)(const tchar*);
-
-
-typedef void (*PointerToITT_sync_create)(void* obj, const tchar* type, const tchar* name, int attribute);
-typedef void (*PointerToITT_sync_rename)(void* obj, const tchar* new_name);
-
-extern PointerToITT_Handler ITT_Handler_sync_prepare;
-extern PointerToITT_Handler ITT_Handler_sync_acquired;
-extern PointerToITT_Handler ITT_Handler_sync_releasing;
-extern PointerToITT_Handler ITT_Handler_sync_cancel;
-extern PointerToITT_thr_name_set ITT_Handler_thr_name_set;
-extern PointerToITT_thread_set_name ITT_Handler_thread_set_name;
-extern PointerToITT_sync_create ITT_Handler_sync_create;
-extern PointerToITT_sync_rename ITT_Handler_sync_rename;
-
-extern target_tool current_tool;
-
-} // namespace internal
-
-} // namespace tbb
-
-//! Glues two tokens together.
-#define ITT_HANDLER(name) tbb::internal::ITT_Handler_##name
-#define CALL_ITT_HANDLER(name, arglist) ( ITT_HANDLER(name) ? (void)ITT_HANDLER(name)arglist : (void)0 )
-
-//! Call routine itt_notify_(name) if corresponding handler is available.
-/** For example, use ITT_NOTIFY(sync_releasing,x) to invoke __itt_notify_sync_releasing(x).
- Ordinarily, preprocessor token gluing games should be avoided.
- But here, it seemed to be the best way to handle the issue. */
-#define ITT_NOTIFY(name,obj) CALL_ITT_HANDLER(name,(obj))
-//! The same as ITT_NOTIFY but also checks if we are running under appropriate tool.
-/** Parameter tools is an ORed set of target_tool enumerators. **/
-#define ITT_NOTIFY_TOOL(tools,name,obj) ( ITT_HANDLER(name) && ((tools) & tbb::internal::current_tool) ? ITT_HANDLER(name)(obj) : (void)0 )
-
-#define ITT_THREAD_SET_NAME(name) ( \
- ITT_HANDLER(thread_set_name) ? ITT_HANDLER(thread_set_name)(name) \
- : CALL_ITT_HANDLER(thr_name_set,(name, tstrlen(name))) )
-
-
-/** 2 is the value of __itt_attr_mutex attribute. **/
-#define ITT_SYNC_CREATE(obj, type, name) CALL_ITT_HANDLER(sync_create,(obj, type, name, 2))
-#define ITT_SYNC_RENAME(obj, name) CALL_ITT_HANDLER(sync_rename,(obj, name))
-
-
-
-#else /* !DO_ITT_NOTIFY */
-
-#define ITT_NOTIFY_TOOL(tools,name,obj) ((void)0)
-
-#endif /* !DO_ITT_NOTIFY */
-
-#if DO_ITT_QUIET
-#define ITT_QUIET(x) (__itt_thr_mode_set(__itt_thr_prop_quiet,(x)?__itt_thr_state_set:__itt_thr_state_clr))
-#else
-#define ITT_QUIET(x) ((void)0)
-#endif /* DO_ITT_QUIET */
-
-#endif /* !__TBB_NEW_ITT_NOTIFY */
+int __TBB_load_ittnotify();
+}}
#endif /* _TBB_ITT_NOTIFY */
diff --git a/src/tbb/lin32-tbb-export.def b/src/tbb/lin32-tbb-export.def
index ee35e31..59c9b49 100644
--- a/src/tbb/lin32-tbb-export.def
+++ b/src/tbb/lin32-tbb-export.def
@@ -45,7 +45,7 @@ _ZN3tbb4task22internal_set_ref_countEi;
_ZN3tbb4task28internal_decrement_ref_countEv;
_ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE;
_ZN3tbb4task4selfEv;
-_ZN3tbb4task7destroyERS0_;
+_ZN3tbb10interface58internal9task_base7destroyERNS_4taskE;
_ZNK3tbb4task26is_owned_by_current_threadEv;
_ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE;
_ZN3tbb8internal19allocate_root_proxy8allocateEj;
@@ -71,8 +71,13 @@ _ZTIN3tbb10empty_taskE;
_ZTSN3tbb10empty_taskE;
_ZTVN3tbb10empty_taskE;
+#if !TBB_NO_LEGACY
+/* task_v2.cpp */
+_ZN3tbb4task7destroyERS0_;
+#endif /* !TBB_NO_LEGACY */
+
/* Exception handling in task scheduler */
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
_ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEj;
_ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE;
_ZNK3tbb18task_group_context28is_group_execution_cancelledEv;
@@ -99,7 +104,7 @@ _ZN3tbb13tbb_exceptionD2Ev;
_ZTIN3tbb13tbb_exceptionE;
_ZTSN3tbb13tbb_exceptionE;
_ZTVN3tbb13tbb_exceptionE;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
/* Symbols for exceptions thrown from TBB */
_ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev;
@@ -154,7 +159,7 @@ _ZN3tbb8pipeline10add_filterERNS_6filterE;
_ZN3tbb8pipeline12inject_tokenERNS_4taskE;
_ZN3tbb8pipeline13remove_filterERNS_6filterE;
_ZN3tbb8pipeline3runEj;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
_ZN3tbb8pipeline3runEjRNS_18task_group_contextE;
#endif
_ZN3tbb8pipeline5clearEv;
@@ -177,6 +182,19 @@ _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b;
_ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv;
_ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b;
+/* reader_writer_lock.cpp */
+_ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_;
+_ZN3tbb10interface518reader_writer_lock13try_lock_readEv;
+_ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_;
+_ZN3tbb10interface518reader_writer_lock16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock18internal_constructEv;
+_ZN3tbb10interface518reader_writer_lock4lockEv;
+_ZN3tbb10interface518reader_writer_lock6unlockEv;
+_ZN3tbb10interface518reader_writer_lock8try_lockEv;
+_ZN3tbb10interface518reader_writer_lock9lock_readEv;
+
#if !TBB_NO_LEGACY
/* spin_rw_mutex.cpp v2 */
_ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_;
@@ -256,6 +274,7 @@ _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv;
/* constructors */
_ZN3tbb8internal24concurrent_queue_base_v3C2Ej;
_ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E;
+_ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Ej;
/* destructors */
_ZN3tbb8internal24concurrent_queue_base_v3D2Ev;
_ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev;
@@ -307,7 +326,11 @@ _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEjjjPKvPFvPvjEPFvS4_
_ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEjjPFvPvPKvjES4_;
/* tbb_thread */
+#if __MINGW32__
+_ZN3tbb8internal13tbb_thread_v314internal_startEPFjPvES2_;
+#else
_ZN3tbb8internal13tbb_thread_v314internal_startEPFPvS2_ES2_;
+#endif
_ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv;
_ZN3tbb8internal13tbb_thread_v34joinEv;
_ZN3tbb8internal13tbb_thread_v36detachEv;
@@ -318,6 +341,15 @@ _ZN3tbb8internal16thread_get_id_v3Ev;
_ZN3tbb8internal19allocate_closure_v3Ej;
_ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_;
+#if __MINGW32__
+/* condition_variable */
+_ZN3tbb10interface58internal32internal_condition_variable_waitERNS1_14condvar_impl_tEPNS_5mutexEPKNS_10tick_count10interval_tE;
+_ZN3tbb10interface58internal35internal_destroy_condition_variableERNS1_14condvar_impl_tE;
+_ZN3tbb10interface58internal38internal_condition_variable_notify_allERNS1_14condvar_impl_tE;
+_ZN3tbb10interface58internal38internal_condition_variable_notify_oneERNS1_14condvar_impl_tE;
+_ZN3tbb10interface58internal38internal_initialize_condition_variableERNS1_14condvar_impl_tE;
+#endif
+
local:
/* TBB symbols */
diff --git a/src/tbb/lin64-tbb-export.def b/src/tbb/lin64-tbb-export.def
index 992cf6e..2406c86 100644
--- a/src/tbb/lin64-tbb-export.def
+++ b/src/tbb/lin64-tbb-export.def
@@ -45,7 +45,7 @@ _ZN3tbb4task22internal_set_ref_countEi;
_ZN3tbb4task28internal_decrement_ref_countEv;
_ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE;
_ZN3tbb4task4selfEv;
-_ZN3tbb4task7destroyERS0_;
+_ZN3tbb10interface58internal9task_base7destroyERNS_4taskE;
_ZNK3tbb4task26is_owned_by_current_threadEv;
_ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE;
_ZN3tbb8internal19allocate_root_proxy8allocateEm;
@@ -71,8 +71,13 @@ _ZTIN3tbb10empty_taskE;
_ZTSN3tbb10empty_taskE;
_ZTVN3tbb10empty_taskE;
+#if !TBB_NO_LEGACY
+/* task_v2.cpp */
+_ZN3tbb4task7destroyERS0_;
+#endif /* !TBB_NO_LEGACY */
+
/* Exception handling in task scheduler */
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
_ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm;
_ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE;
_ZNK3tbb18task_group_context28is_group_execution_cancelledEv;
@@ -99,7 +104,7 @@ _ZN3tbb13tbb_exceptionD2Ev;
_ZTIN3tbb13tbb_exceptionE;
_ZTSN3tbb13tbb_exceptionE;
_ZTVN3tbb13tbb_exceptionE;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
/* Symbols for exceptions thrown from TBB */
_ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev;
@@ -152,7 +157,7 @@ _ZN3tbb8pipeline10add_filterERNS_6filterE;
_ZN3tbb8pipeline12inject_tokenERNS_4taskE;
_ZN3tbb8pipeline13remove_filterERNS_6filterE;
_ZN3tbb8pipeline3runEm;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
_ZN3tbb8pipeline3runEmRNS_18task_group_contextE;
#endif
_ZN3tbb8pipeline5clearEv;
@@ -175,6 +180,19 @@ _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b;
_ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv;
_ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b;
+/* reader_writer_lock.cpp */
+_ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_;
+_ZN3tbb10interface518reader_writer_lock13try_lock_readEv;
+_ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_;
+_ZN3tbb10interface518reader_writer_lock16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock18internal_constructEv;
+_ZN3tbb10interface518reader_writer_lock4lockEv;
+_ZN3tbb10interface518reader_writer_lock6unlockEv;
+_ZN3tbb10interface518reader_writer_lock8try_lockEv;
+_ZN3tbb10interface518reader_writer_lock9lock_readEv;
+
#if !TBB_NO_LEGACY
/* spin_rw_mutex.cpp v2 */
_ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_;
@@ -254,6 +272,7 @@ _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv;
/* constructors */
_ZN3tbb8internal24concurrent_queue_base_v3C2Em;
_ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E;
+_ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em;
/* destructors */
_ZN3tbb8internal24concurrent_queue_base_v3D2Ev;
_ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev;
diff --git a/src/tbb/lin64ipf-tbb-export.def b/src/tbb/lin64ipf-tbb-export.def
index b9d4f86..b502e19 100644
--- a/src/tbb/lin64ipf-tbb-export.def
+++ b/src/tbb/lin64ipf-tbb-export.def
@@ -45,7 +45,7 @@ _ZN3tbb4task22internal_set_ref_countEi;
_ZN3tbb4task28internal_decrement_ref_countEv;
_ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE;
_ZN3tbb4task4selfEv;
-_ZN3tbb4task7destroyERS0_;
+_ZN3tbb10interface58internal9task_base7destroyERNS_4taskE;
_ZNK3tbb4task26is_owned_by_current_threadEv;
_ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE;
_ZN3tbb8internal19allocate_root_proxy8allocateEm;
@@ -71,8 +71,13 @@ _ZTIN3tbb10empty_taskE;
_ZTSN3tbb10empty_taskE;
_ZTVN3tbb10empty_taskE;
+#if !TBB_NO_LEGACY
+/* task_v2.cpp */
+_ZN3tbb4task7destroyERS0_;
+#endif /* !TBB_NO_LEGACY */
+
/* Exception handling in task scheduler */
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
_ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm;
_ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE;
_ZNK3tbb18task_group_context28is_group_execution_cancelledEv;
@@ -99,7 +104,7 @@ _ZN3tbb13tbb_exceptionD2Ev;
_ZTIN3tbb13tbb_exceptionE;
_ZTSN3tbb13tbb_exceptionE;
_ZTVN3tbb13tbb_exceptionE;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
/* Symbols for exceptions thrown from TBB */
_ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev;
@@ -152,7 +157,7 @@ _ZN3tbb8pipeline10add_filterERNS_6filterE;
_ZN3tbb8pipeline12inject_tokenERNS_4taskE;
_ZN3tbb8pipeline13remove_filterERNS_6filterE;
_ZN3tbb8pipeline3runEm;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
_ZN3tbb8pipeline3runEmRNS_18task_group_contextE;
#endif
_ZN3tbb8pipeline5clearEv;
@@ -175,6 +180,19 @@ _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b;
_ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv;
_ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b;
+/* reader_writer_lock.cpp */
+_ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_;
+_ZN3tbb10interface518reader_writer_lock13try_lock_readEv;
+_ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_;
+_ZN3tbb10interface518reader_writer_lock16internal_destroyEv;
+_ZN3tbb10interface518reader_writer_lock18internal_constructEv;
+_ZN3tbb10interface518reader_writer_lock4lockEv;
+_ZN3tbb10interface518reader_writer_lock6unlockEv;
+_ZN3tbb10interface518reader_writer_lock8try_lockEv;
+_ZN3tbb10interface518reader_writer_lock9lock_readEv;
+
#if !TBB_NO_LEGACY
/* spin_rw_mutex.cpp v2 */
_ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_;
@@ -254,6 +272,7 @@ _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv;
/* constructors */
_ZN3tbb8internal24concurrent_queue_base_v3C2Em;
_ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E;
+_ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em;
/* destructors */
_ZN3tbb8internal24concurrent_queue_base_v3D2Ev;
_ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev;
diff --git a/src/tbb/mac32-tbb-export.def b/src/tbb/mac32-tbb-export.def
index 9fa4c1d..8725d9d 100644
--- a/src/tbb/mac32-tbb-export.def
+++ b/src/tbb/mac32-tbb-export.def
@@ -38,7 +38,7 @@ __ZN3tbb4task22internal_set_ref_countEi
__ZN3tbb4task28internal_decrement_ref_countEv
__ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE
__ZN3tbb4task4selfEv
-__ZN3tbb4task7destroyERS0_
+__ZN3tbb10interface58internal9task_base7destroyERNS_4taskE
__ZNK3tbb4task26is_owned_by_current_threadEv
__ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE
__ZN3tbb8internal19allocate_root_proxy8allocateEm
@@ -65,6 +65,11 @@ __ZTIN3tbb10empty_taskE
__ZTSN3tbb10empty_taskE
__ZTVN3tbb10empty_taskE
+#if !TBB_NO_LEGACY
+# task_v2.cpp
+__ZN3tbb4task7destroyERS0_
+#endif
+
# Exception handling in task scheduler
__ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm
__ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE
@@ -95,6 +100,9 @@ __ZTVN3tbb13tbb_exceptionE
# Symbols for exceptions thrown from TBB
__ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev
__ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE
+__ZNSt13runtime_errorD1Ev
+__ZTISt13runtime_error
+__ZTSSt13runtime_error
__ZNSt16invalid_argumentD1Ev
__ZTISt16invalid_argument
__ZTSSt16invalid_argument
@@ -179,6 +187,19 @@ __ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv
__ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b
__ZN3tbb16queuing_rw_mutex18internal_constructEv
+# reader_writer_lock.cpp
+__ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv
+__ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_
+__ZN3tbb10interface518reader_writer_lock13try_lock_readEv
+__ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv
+__ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_
+__ZN3tbb10interface518reader_writer_lock16internal_destroyEv
+__ZN3tbb10interface518reader_writer_lock18internal_constructEv
+__ZN3tbb10interface518reader_writer_lock4lockEv
+__ZN3tbb10interface518reader_writer_lock6unlockEv
+__ZN3tbb10interface518reader_writer_lock8try_lockEv
+__ZN3tbb10interface518reader_writer_lock9lock_readEv
+
#if !TBB_NO_LEGACY
# spin_rw_mutex.cpp v2
__ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_
@@ -257,6 +278,7 @@ __ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv
# concurrent_queue v3
# constructors
__ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E
+__ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em
__ZN3tbb8internal24concurrent_queue_base_v3C2Em
# destructors
__ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev
diff --git a/src/tbb/mac64-tbb-export.def b/src/tbb/mac64-tbb-export.def
index d5517d3..9d8615c 100644
--- a/src/tbb/mac64-tbb-export.def
+++ b/src/tbb/mac64-tbb-export.def
@@ -38,7 +38,7 @@ __ZN3tbb4task22internal_set_ref_countEi
__ZN3tbb4task28internal_decrement_ref_countEv
__ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE
__ZN3tbb4task4selfEv
-__ZN3tbb4task7destroyERS0_
+__ZN3tbb10interface58internal9task_base7destroyERNS_4taskE
__ZNK3tbb4task26is_owned_by_current_threadEv
__ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE
__ZN3tbb8internal19allocate_root_proxy8allocateEm
@@ -65,6 +65,11 @@ __ZTIN3tbb10empty_taskE
__ZTSN3tbb10empty_taskE
__ZTVN3tbb10empty_taskE
+#if !TBB_NO_LEGACY
+# task_v2.cpp
+__ZN3tbb4task7destroyERS0_
+#endif
+
# Exception handling in task scheduler
__ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm
__ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE
@@ -95,6 +100,9 @@ __ZTVN3tbb13tbb_exceptionE
# Symbols for exceptions thrown from TBB
__ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev
__ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE
+__ZNSt13runtime_errorD1Ev
+__ZTISt13runtime_error
+__ZTSSt13runtime_error
__ZNSt16invalid_argumentD1Ev
__ZTISt16invalid_argument
__ZTSSt16invalid_argument
@@ -175,6 +183,19 @@ __ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv
__ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b
__ZN3tbb16queuing_rw_mutex18internal_constructEv
+# reader_writer_lock.cpp
+__ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv
+__ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_
+__ZN3tbb10interface518reader_writer_lock13try_lock_readEv
+__ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv
+__ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_
+__ZN3tbb10interface518reader_writer_lock16internal_destroyEv
+__ZN3tbb10interface518reader_writer_lock18internal_constructEv
+__ZN3tbb10interface518reader_writer_lock4lockEv
+__ZN3tbb10interface518reader_writer_lock6unlockEv
+__ZN3tbb10interface518reader_writer_lock8try_lockEv
+__ZN3tbb10interface518reader_writer_lock9lock_readEv
+
#if !TBB_NO_LEGACY
# spin_rw_mutex.cpp v2
__ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_
@@ -253,6 +274,7 @@ __ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv
# concurrent_queue v3
# constructors
__ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E
+__ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em
__ZN3tbb8internal24concurrent_queue_base_v3C2Em
# destructors
__ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev
diff --git a/src/tbb/mailbox.h b/src/tbb/mailbox.h
new file mode 100644
index 0000000..0bab2dc
--- /dev/null
+++ b/src/tbb/mailbox.h
@@ -0,0 +1,193 @@
+/*
+ Copyright 2005-2010 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_mailbox_H
+#define _TBB_mailbox_H
+
+#include "tbb/tbb_stddef.h"
+#include "tbb/cache_aligned_allocator.h"
+
+#include "scheduler_common.h"
+
+namespace tbb {
+namespace internal {
+
+class mail_outbox;
+
+struct task_proxy : public task {
+ static const intptr_t pool_bit = 1;
+ static const intptr_t mailbox_bit = 2;
+ /* All but two low-order bits represent a (task*).
+ Two low-order bits mean:
+ 1 = proxy is/was/will be in task pool
+ 2 = proxy is/was/will be in mailbox */
+ intptr_t task_and_tag;
+
+ //! Pointer to next task_proxy in a mailbox
+ task_proxy* next_in_mailbox;
+
+ //! Mailbox to which this was mailed.
+ mail_outbox* outbox;
+};
+
+//! Internal representation of mail_outbox, without padding.
+class unpadded_mail_outbox {
+protected:
+ //! Pointer to first task_proxy in mailbox, or NULL if box is empty.
+ task_proxy* my_first;
+
+ //! Pointer to pointer that will point to next item in the queue. Never NULL.
+ task_proxy** my_last;
+
+ //! Owner of mailbox is not executing a task, and has drained its own task pool.
+ bool my_is_idle;
+};
+
+//! Class representing where mail is put.
+/** Padded to occupy a cache line. */
+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 );
+ } 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;
+ }
+ }
+ }
+ return first;
+ }
+public:
+ friend class mail_inbox;
+
+ //! Push task_proxy onto the mailbox queue of another thread.
+ /** Implementation is wait-free. */
+ 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);
+ // 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;
+ }
+
+ //! 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
+ will be constructed in zeroed memory. */
+ void construct() {
+ __TBB_ASSERT( sizeof(*this)==NFS_MaxLineSize, NULL );
+ __TBB_ASSERT( !my_first, NULL );
+ __TBB_ASSERT( !my_last, NULL );
+ __TBB_ASSERT( !my_is_idle, NULL );
+ my_last=&my_first;
+ }
+
+ //! Drain the mailbox
+ intptr_t drain() {
+ intptr_t k = 0;
+ // No fences here because other threads have already quit.
+ for( ; task_proxy* t = my_first; ++k ) {
+ my_first = t->next_in_mailbox;
+ NFS_Free((char*)t - task_prefix_reservation_size);
+ }
+ return k;
+ }
+
+ //! True if thread that owns this mailbox is looking for work.
+ bool recipient_is_idle() {
+ return my_is_idle;
+ }
+}; // class mail_outbox
+
+//! Class representing source of mail.
+class mail_inbox {
+ //! Corresponding sink where mail that we receive will be put.
+ mail_outbox* my_putter;
+public:
+ //! Construct unattached inbox
+ mail_inbox() : my_putter(NULL) {}
+
+ //! Attach inbox to a corresponding outbox.
+ void attach( mail_outbox& putter ) {
+ __TBB_ASSERT(!my_putter,"already attached");
+ my_putter = &putter;
+ }
+ //! Detach inbox from its outbox
+ void detach() {
+ __TBB_ASSERT(my_putter,"not attached");
+ my_putter = NULL;
+ }
+ //! Get next piece of mail, or NULL if mailbox is empty.
+ task_proxy* pop() {
+ return my_putter->internal_pop();
+ }
+ //! Indicate whether thread that reads this mailbox is idle.
+ /** Raises assertion failure if mailbox is redundantly marked as not idle. */
+ void set_is_idle( bool value ) {
+ if( my_putter ) {
+ __TBB_ASSERT( my_putter->my_is_idle || value, "attempt to redundantly mark mailbox as not idle" );
+ my_putter->my_is_idle = value;
+ }
+ }
+#if TBB_USE_ASSERT
+ //! Indicate whether thread that reads this mailbox is idle.
+ bool assert_is_idle( bool value ) const {
+ __TBB_ASSERT( !my_putter || my_putter->my_is_idle==value, NULL );
+ return true;
+ }
+#endif /* TBB_USE_ASSERT */
+#if DO_ITT_NOTIFY
+ //! Get pointer to corresponding outbox used for ITT_NOTIFY calls.
+ void* outbox() const {return my_putter;}
+#endif /* DO_ITT_NOTIFY */
+}; // class mail_inbox
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* _TBB_mailbox_H */
diff --git a/src/tbb/market.cpp b/src/tbb/market.cpp
new file mode 100644
index 0000000..4a24a8c
--- /dev/null
+++ b/src/tbb/market.cpp
@@ -0,0 +1,304 @@
+/*
+ Copyright 2005-2010 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#include "tbb/tbb_stddef.h"
+
+#if __TBB_ARENA_PER_MASTER
+
+#include "market.h"
+#include "tbb_main.h"
+#include "governor.h"
+#include "scheduler.h"
+
+namespace tbb {
+namespace internal {
+
+//------------------------------------------------------------------------
+// market
+//------------------------------------------------------------------------
+
+market::market ( unsigned max_num_workers, size_t stack_size )
+ : my_ref_count(1)
+ , my_stack_size(stack_size)
+ , my_max_num_workers(max_num_workers)
+{
+ my_next_arena = my_arenas.begin();
+
+ // Once created RML server will start initializing workers that will need
+ // global market instance to get worker stack size
+ my_server = governor::create_rml_server( *this );
+ __TBB_ASSERT( my_server, "Failed to create RML server" );
+}
+
+
+market& market::global_market ( unsigned max_num_workers, size_t stack_size ) {
+ global_market_mutex_type::scoped_lock lock( theMarketMutex );
+ market *m = theMarket;
+ if ( m ) {
+ ++m->my_ref_count;
+ if ( m->my_stack_size < stack_size )
+ runtime_warning( "Newer master request for larger stack cannot be satisfied\n" );
+ }
+ else {
+ max_num_workers = max( governor::default_num_threads() - 1, max_num_workers );
+ // at least 1 worker is required to support starvation resistant tasks
+ if( max_num_workers==0 ) max_num_workers = 1;
+ // Create the global market instance
+ size_t size = sizeof(market);
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT( __TBB_offsetof(market, my_workers) + sizeof(generic_scheduler*) == sizeof(market),
+ "my_workers must be the last data field of the market class");
+ size += sizeof(generic_scheduler*) * (max_num_workers - 1);
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ __TBB_InitOnce::add_ref();
+ void* storage = NFS_Allocate(size, 1, NULL);
+ memset( storage, 0, size );
+ // Initialize and publish global market
+ m = new (storage) market( max_num_workers, stack_size );
+ theMarket = m;
+ }
+ return *m;
+}
+
+void market::destroy () {
+#if __TBB_COUNT_TASK_NODES
+ if ( my_task_node_count )
+ runtime_warning( "Leaked %ld task objects\n", (intptr_t)my_task_node_count );
+#endif /* __TBB_COUNT_TASK_NODES */
+ this->~market();
+ NFS_Free( this );
+ __TBB_InitOnce::remove_ref();
+}
+
+void market::release () {
+ __TBB_ASSERT( theMarket == this, "Global market instance was destroyed prematurely?" );
+ bool do_release = false;
+ {
+ global_market_mutex_type::scoped_lock lock(theMarketMutex);
+ if ( --my_ref_count == 0 ) {
+ do_release = true;
+ theMarket = NULL;
+ }
+ }
+ if( do_release )
+ my_server->request_close_connection();
+}
+
+arena& market::create_arena ( unsigned max_num_workers, size_t stack_size ) {
+ market &m = global_market( max_num_workers, stack_size ); // increases market's ref count
+ arena& a = arena::allocate_arena( m, min(max_num_workers, m.my_max_num_workers) );
+ // Add newly created arena into the existing market's list.
+ spin_mutex::scoped_lock lock(m.my_arenas_list_mutex);
+ m.my_arenas.push_front( a );
+ if ( m.my_arenas.size() == 1 )
+ m.my_next_arena = m.my_arenas.begin();
+ return a;
+}
+
+void market::detach_arena ( arena& a ) {
+ __TBB_ASSERT( theMarket == this, "Global market instance was destroyed prematurely?" );
+ spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ __TBB_ASSERT( my_next_arena != my_arenas.end(), NULL );
+ if ( &*my_next_arena == &a )
+ if ( ++my_next_arena == my_arenas.end() && my_arenas.size() > 1 )
+ my_next_arena = my_arenas.begin();
+ my_arenas.remove( a );
+}
+
+arena* market::arena_in_need () {
+ spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ if ( my_arenas.empty() )
+ return NULL;
+ __TBB_ASSERT( my_next_arena != my_arenas.end(), NULL );
+ arena_list_type::iterator it = my_next_arena;
+ do {
+ arena& a = *it;
+ if ( ++it == my_arenas.end() )
+ it = my_arenas.begin();
+ if ( a.num_workers_active() < a.my_num_workers_allotted ) {
+ ++a.my_num_threads_active;
+ my_next_arena = it;
+ return &a;
+ }
+ } while ( it != my_next_arena );
+ return NULL;
+}
+
+void market::update_allotment ( int max_workers ) {
+ unsigned carry = 0;
+ spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ arena_list_type::iterator it = my_arenas.begin();
+ int total_demand = my_total_demand;
+ max_workers = min(max_workers, total_demand);
+ if ( total_demand > 0 ) {
+ for ( ; it != my_arenas.end(); ++it ) {
+ arena& a = *it;
+ int tmp = a.my_num_workers_requested * max_workers + carry;
+ int allotted = tmp / total_demand;
+ carry = tmp % total_demand;
+ a.my_num_workers_allotted = min( allotted, (int)a.my_max_num_workers );
+ }
+ }
+ else {
+ for ( ; it != my_arenas.end(); ++it ) {
+ it->my_num_workers_allotted = 0;
+ }
+ }
+}
+
+/** 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?" );
+ a.my_num_workers_requested += delta;
+ my_total_demand += delta;
+ update_allotment( my_max_num_workers );
+ // Must be called outside of any locks
+ my_server->adjust_job_count_estimate( delta );
+}
+
+void market::process( job& j ) {
+ generic_scheduler& s = static_cast<generic_scheduler&>(j);
+ while ( arena *a = arena_in_need() )
+ a->process(s);
+}
+
+void market::cleanup( job& j ) {
+ __TBB_ASSERT( theMarket != this, NULL );
+ generic_scheduler& s = static_cast<generic_scheduler&>(j);
+ generic_scheduler* mine = governor::local_scheduler_if_initialized();
+ __TBB_ASSERT( !mine || mine->arena_index!=0, NULL );
+ if( mine!=&s ) {
+ governor::assume_scheduler( &s );
+ generic_scheduler::cleanup_worker( &s, mine!=NULL );
+ governor::assume_scheduler( mine );
+ } else {
+ generic_scheduler::cleanup_worker( &s, true );
+ }
+}
+
+void market::acknowledge_close_connection() {
+ destroy();
+}
+
+::rml::job* market::create_one_job() {
+ unsigned index = ++my_num_workers;
+ __TBB_ASSERT( index > 0, NULL );
+ // index serves as a hint decreasing conflicts between workers when they migrate between arenas
+ generic_scheduler* s = generic_scheduler::create_worker( *this, index );
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT( !my_workers[index - 1], NULL );
+ my_workers[index - 1] = s;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ governor::sign_on(s);
+ return s;
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+/** Propagates cancellation down the tree of dependent contexts by walking each
+ thread's local list of contexts **/
+void market::propagate_cancellation ( task_group_context& ctx ) {
+ __TBB_ASSERT ( ctx.my_cancellation_requested, "No cancellation request in the context" );
+ // The whole propagation algorithm is under the lock in order to ensure correctness
+ // in case of parallel cancellations at the different levels of the context tree.
+ // See the note 1 at the bottom of this file.
+ global_market_mutex_type::scoped_lock lock(theMarketMutex);
+ // Advance global cancellation epoch
+ uintptr_t global_epoch = __TBB_FetchAndAddWrelease(&global_cancel_count, 1);
+ // Propagate to all workers and masters and sync up their local epochs with the global one
+ unsigned num_workers = my_num_workers;
+ for ( unsigned i = 0; i < num_workers; ++i ) {
+ generic_scheduler *s = my_workers[i];
+ // If the worker is only about to be registered, skip it.
+ if ( s ) {
+ s->propagate_cancellation();
+ s->local_cancel_count = global_epoch;
+ }
+ }
+ arena_list_type::iterator it = my_arenas.begin();
+ for ( ; it != my_arenas.end(); ++it ) {
+ generic_scheduler *s = it->slot[0].my_scheduler;
+ // If the master is under construction, skip it.
+ if ( s ) {
+ s->propagate_cancellation();
+ s->local_cancel_count = global_epoch;
+ }
+ }
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#if __TBB_COUNT_TASK_NODES
+intptr_t market::workers_task_node_count() {
+ intptr_t result = 0;
+ spin_mutex::scoped_lock lock(my_arenas_list_mutex);
+ for ( arena_list_type::iterator it = my_arenas.begin(); it != my_arenas.end(); ++it )
+ result += it->workers_task_node_count();
+ return result;
+}
+#endif /* __TBB_COUNT_TASK_NODES */
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* __TBB_ARENA_PER_MASTER */
+
+/*
+ Notes:
+
+1. 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 (the_scheduler_list_mutex).
+
+ 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.
+*/
diff --git a/src/tbb/market.h b/src/tbb/market.h
new file mode 100644
index 0000000..0d70573
--- /dev/null
+++ b/src/tbb/market.h
@@ -0,0 +1,210 @@
+/*
+ Copyright 2005-2010 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_market_H
+#define _TBB_market_H
+
+#include "tbb/tbb_stddef.h"
+
+#if __TBB_ARENA_PER_MASTER
+
+#include "tbb/atomic.h"
+#include "tbb/spin_mutex.h"
+#include "../rml/include/rml_tbb.h"
+
+#include "intrusive_list.h"
+
+#if defined(_MSC_VER) && defined(_Wp64)
+ // Workaround for overzealous compiler warnings in /Wp64 mode
+ #pragma warning (push)
+ #pragma warning (disable: 4244)
+#endif
+
+namespace tbb {
+
+class task_group_context;
+
+namespace internal {
+
+class arena;
+class generic_scheduler;
+
+//------------------------------------------------------------------------
+// Class market
+//------------------------------------------------------------------------
+
+class market : no_copy, rml::tbb_client {
+ friend void ITT_DoUnsafeOneTimeInitialization ();
+
+ typedef intrusive_list<arena> arena_list_type;
+
+ //! Currently active global market
+ static market* theMarket;
+
+ typedef spin_mutex global_market_mutex_type;
+
+ //! Mutex guarding creation/destruction of theMarket, insertions/deletions in my_arenas, and cancellation propagation
+ static global_market_mutex_type theMarketMutex;
+
+ //! Reference count controlling market object lifetime
+ intptr_t my_ref_count;
+
+ //! List of active arenas
+ arena_list_type my_arenas;
+
+ //! The first arena to be checked when idle worker seeks for an arena to enter
+ /** The check happens in round-robin fashion. **/
+ arena_list_type::iterator my_next_arena;
+
+ //! Lightweight mutex guarding accounting operations with arenas list
+ spin_mutex my_arenas_list_mutex;
+
+ //! Number of workers that were requested by all arenas
+ atomic<int> my_total_demand;
+
+ //! Pointer to the RML server object that services this TBB instance.
+ rml::tbb_server* my_server;
+
+ //! Stack size of worker threads
+ size_t my_stack_size;
+
+ //! Number of workers requested from the underlying resource manager
+ unsigned my_max_num_workers;
+
+#if __TBB_COUNT_TASK_NODES
+ //! Net number of nodes that have been allocated from heap.
+ /** Updated each time a scheduler or arena is destroyed. */
+ atomic<intptr_t> my_task_node_count;
+#endif /* __TBB_COUNT_TASK_NODES */
+
+ //! Number of workers that have been delivered by RML
+ atomic<unsigned> my_num_workers;
+
+ //! Constructor
+ market ( unsigned max_num_workers, size_t stack_size );
+
+ //! Factory method creating new market object
+ static market& global_market ( unsigned max_num_workers, size_t stack_size );
+
+ //! Destroys and deallocates market object created by market::create()
+ void destroy ();
+
+ //! Returns next arena that needs more workers, or NULL.
+ arena* arena_in_need ();
+
+ //! Recalculates the number of workers assigned to each arena.
+ /** The actual number of workers servicing a particular arena may temporarily
+ deviate from the calculated value. **/
+ void update_allotment ( int max_workers );
+
+ //! Returns number of masters doing computational (CPU-intensive) work
+ int num_active_masters () { return 1; } // APM TODO: replace with a real mechanism
+
+ // // //
+ // Implementation of rml::tbb_client interface methods
+
+ /*override*/ version_type version () const { return 0; }
+
+ /*override*/ unsigned max_job_count () const { return my_max_num_workers; }
+
+ /*override*/ size_t min_stack_size () const { return worker_stack_size(); }
+
+ /*override*/ policy_type policy () const { return throughput; }
+
+ /*override*/ job* create_one_job ();
+
+ /*override*/ void cleanup( job& j );
+
+ /*override*/ void acknowledge_close_connection ();
+
+ /*override*/ void process( job& j );
+
+public:
+ //! Creates an arena object
+ /** If necessary, also creates global market instance, and boosts its ref count.
+ Each call to create_arena() must be matched by the call to arena::free_arena(). **/
+ static arena& create_arena ( unsigned max_num_workers, size_t stack_size );
+
+ //! Removes the arena from the market's list
+ void detach_arena ( arena& );
+
+ //! Decrements market's refcount and destroys it in the end
+ void release ();
+
+ //! Request that arena's need in workers should be adjusted.
+ /** Concurrent invocations are possible only on behalf of different arenas. **/
+ void adjust_demand ( arena&, int delta );
+
+ //! Returns the requested stack size of worker threads.
+ size_t worker_stack_size () const { return my_stack_size; }
+
+#if __TBB_COUNT_TASK_NODES
+ //! Returns the number of task objects "living" in worker threads
+ intptr_t workers_task_node_count();
+
+ //! Net number of nodes that have been allocated from heap.
+ /** Updated each time a scheduler or arena is destroyed. */
+ void update_task_node_count( intptr_t delta ) { my_task_node_count += delta; }
+#endif /* __TBB_COUNT_TASK_NODES */
+
+#if __TBB_TASK_GROUP_CONTEXT
+ //! Propagates cancellation request to all descendants of the context.
+ void propagate_cancellation ( task_group_context& ctx );
+
+ //! Array of pointers to the registered workers
+ /** Used by cancellation propagation mechanism.
+ Must be the last data member of the class market. **/
+ generic_scheduler* my_workers[1];
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+#if __TBB_ARENA_PER_MASTER && ( _WIN32||_WIN64 )
+ //! register master with the resource manager
+ void register_master( ::rml::server::execution_resource_t& rsc_handle ) {
+ __TBB_ASSERT( my_server, "RML server not defined?" );
+ // the server may ignore registration and set master_exec_resource to NULL.
+ my_server->register_master( rsc_handle );
+ }
+
+ //! unregister master with the resource manager
+ void unregister_master( ::rml::server::execution_resource_t& rsc_handle ) const {
+ my_server->unregister_master( rsc_handle );
+ }
+#endif /* !__TBB_ARENA_PER_MASTER && ( _WIN32||_WIN64 ) */
+
+}; // class market
+
+} // namespace internal
+} // namespace tbb
+
+#if defined(_MSC_VER) && defined(_Wp64)
+ // Workaround for overzealous compiler warnings in /Wp64 mode
+ #pragma warning (pop)
+#endif // warning 4244 is back
+
+#endif /* __TBB_ARENA_PER_MASTER */
+
+#endif /* _TBB_market_H */
diff --git a/src/tbb/observer_proxy.cpp b/src/tbb/observer_proxy.cpp
new file mode 100644
index 0000000..ddb8321
--- /dev/null
+++ b/src/tbb/observer_proxy.cpp
@@ -0,0 +1,237 @@
+/*
+ Copyright 2005-2010 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"
+
+#if __TBB_SCHEDULER_OBSERVER
+
+#include "tbb/spin_rw_mutex.h"
+#include "tbb/aligned_space.h"
+
+#include "observer_proxy.h"
+#include "tbb_main.h"
+#include "governor.h"
+#include "scheduler.h"
+
+namespace tbb {
+namespace internal {
+
+typedef spin_rw_mutex::scoped_lock task_scheduler_observer_mutex_scoped_lock;
+
+/** aligned_space used here to shut up warnings when mutex destructor is called while threads are still using it. */
+static aligned_space<spin_rw_mutex,1> the_task_scheduler_observer_mutex;
+static observer_proxy* global_first_observer_proxy;
+observer_proxy* global_last_observer_proxy;
+
+
+#if TBB_USE_ASSERT
+static atomic<int> observer_proxy_count;
+
+struct check_observer_proxy_count {
+ ~check_observer_proxy_count() {
+ if( observer_proxy_count!=0 ) {
+ runtime_warning( "Leaked %ld observer_proxy objects\n", long(observer_proxy_count) );
+ }
+ }
+};
+
+static check_observer_proxy_count the_check_observer_proxy_count;
+#endif /* TBB_USE_ASSERT */
+
+observer_proxy::observer_proxy( task_scheduler_observer_v3& tso ) : next(NULL), observer(&tso) {
+#if TBB_USE_ASSERT
+ ++observer_proxy_count;
+#endif /* TBB_USE_ASSERT */
+ // 1 for observer
+ gc_ref_count = 1;
+ {
+ // Append to the global list
+ task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
+ observer_proxy* p = global_last_observer_proxy;
+ prev = p;
+ if( p )
+ p->next=this;
+ else
+ global_first_observer_proxy = this;
+ global_last_observer_proxy = this;
+ }
+}
+
+void observer_proxy::remove_from_list() {
+ // Take myself off the global list.
+ if( next )
+ next->prev = prev;
+ else
+ global_last_observer_proxy = prev;
+ if( prev )
+ prev->next = next;
+ else
+ global_first_observer_proxy = next;
+#if TBB_USE_ASSERT
+ poison_pointer(prev);
+ poison_pointer(next);
+ gc_ref_count = -666;
+#endif /* TBB_USE_ASSERT */
+}
+
+void observer_proxy::remove_ref_slow() {
+ int r = gc_ref_count;
+ while(r>1) {
+ __TBB_ASSERT( r!=0, NULL );
+ int r_old = gc_ref_count.compare_and_swap(r-1,r);
+ if( r_old==r ) {
+ // Successfully decremented count.
+ return;
+ }
+ r = r_old;
+ }
+ __TBB_ASSERT( r==1, NULL );
+ // Reference count might go to zero
+ {
+ task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
+ r = --gc_ref_count;
+ if( !r ) {
+ remove_from_list();
+ }
+ }
+ if( !r ) {
+ __TBB_ASSERT( gc_ref_count == -666, NULL );
+#if TBB_USE_ASSERT
+ --observer_proxy_count;
+#endif /* TBB_USE_ASSERT */
+ delete this;
+ }
+}
+
+observer_proxy* observer_proxy::process_list( observer_proxy* local_last, bool is_worker, bool is_entry ) {
+ // Pointer p marches though the list.
+ // If is_entry, start with our previous list position, otherwise start at beginning of list.
+ observer_proxy* p = is_entry ? local_last : NULL;
+ for(;;) {
+ task_scheduler_observer* tso=NULL;
+ // Hold lock on list only long enough to advance to next proxy in list.
+ {
+ task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/false);
+ do {
+ if( local_last && local_last->observer ) {
+ // 2 = 1 for observer and 1 for local_last
+ __TBB_ASSERT( local_last->gc_ref_count>=2, NULL );
+ // Can decrement count quickly, because it cannot become zero here.
+ --local_last->gc_ref_count;
+ local_last = NULL;
+ } else {
+ // Use slow form of decrementing the reference count, after lock is released.
+ }
+ if( p ) {
+ // We were already processing the list.
+ if( observer_proxy* q = p->next ) {
+ // Step to next item in list.
+ p=q;
+ } else {
+ // At end of list.
+ if( is_entry ) {
+ // Remember current position in the list, so we can start at on the next call.
+ ++p->gc_ref_count;
+ } else {
+ // Finishin running off the end of the list
+ p=NULL;
+ }
+ goto done;
+ }
+ } else {
+ // Starting pass through the list
+ p = global_first_observer_proxy;
+ if( !p )
+ goto done;
+ }
+ tso = p->observer;
+ } while( !tso );
+ ++p->gc_ref_count;
+ ++tso->my_busy_count;
+ }
+ __TBB_ASSERT( !local_last || p!=local_last, NULL );
+ if( local_last )
+ local_last->remove_ref_slow();
+ // Do not hold any locks on the list while calling user's code.
+ __TBB_TRY {
+ if( is_entry )
+ tso->on_scheduler_entry( is_worker );
+ else
+ tso->on_scheduler_exit( is_worker );
+ } __TBB_CATCH(...) {
+ // Suppress exception, because user routines are supposed to be observing, not changing
+ // behavior of a master or worker thread.
+#if TBB_USE_ASSERT
+ runtime_warning( "%s threw exception\n", is_entry ? "on_scheduler_entry" : "on_scheduler_exit");
+#endif /* __TBB_USE_ASSERT */
+ }
+ intptr_t bc = --tso->my_busy_count;
+ __TBB_ASSERT_EX( bc>=0, "my_busy_count underflowed" );
+ local_last = p;
+ }
+done:
+ // Return new value to be used as local_last next time.
+ if( local_last )
+ local_last->remove_ref_slow();
+ __TBB_ASSERT( !p || is_entry, NULL );
+ return p;
+}
+
+void task_scheduler_observer_v3::observe( bool state ) {
+ if( state ) {
+ if( !my_proxy ) {
+ if( !__TBB_InitOnce::initialization_done() )
+ DoOneTimeInitializations();
+ my_busy_count = 0;
+ my_proxy = new observer_proxy(*this);
+ if( generic_scheduler* s = governor::local_scheduler_if_initialized() ) {
+ // Notify newly created observer of its own thread.
+ // Any other pending observers are notified too.
+ s->notify_entry_observers();
+ }
+ }
+ } else {
+ if( observer_proxy* proxy = my_proxy ) {
+ my_proxy = NULL;
+ __TBB_ASSERT( proxy->gc_ref_count>=1, "reference for observer missing" );
+ {
+ task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
+ proxy->observer = NULL;
+ }
+ proxy->remove_ref_slow();
+ while( my_busy_count ) {
+ __TBB_Yield();
+ }
+ }
+ }
+}
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* __TBB_SCHEDULER_OBSERVER */
diff --git a/examples/parallel_while/parallel_preorder/Graph.h b/src/tbb/observer_proxy.h
similarity index 51%
rename from examples/parallel_while/parallel_preorder/Graph.h
rename to src/tbb/observer_proxy.h
index 04dfc02..04e36b5 100644
--- a/examples/parallel_while/parallel_preorder/Graph.h
+++ b/src/tbb/observer_proxy.h
@@ -26,65 +26,44 @@
the GNU General Public License.
*/
-#include "Matrix.h"
-#include "tbb/atomic.h"
-#include <vector>
-
-namespace TBB = tbb;
-
-enum OpKind {
- // Use Cell's value
- OP_VALUE,
- // Unary negation
- OP_NEGATE,
- // Addition
- OP_ADD,
- // Subtraction
- OP_SUB,
- // Multiplication
- OP_MUL
-};
-
-static const int ArityOfOp[] = {0,1,2,2,2};
-
-class Cell {
+#ifndef _TBB_observer_proxy_H
+#define _TBB_observer_proxy_H
+
+#if __TBB_SCHEDULER_OBSERVER
+
+#include "tbb/task_scheduler_observer.h"
+
+namespace tbb {
+namespace internal {
+
+class observer_proxy {
+ friend class task_scheduler_observer_v3;
+ //! Reference count used for garbage collection.
+ /** 1 for reference from my task_scheduler_observer.
+ 1 for each local_last_observer_proxy that points to me.
+ No accounting for predecessor in the global list.
+ No accounting for global_last_observer_proxy that points to me. */
+ atomic<int> gc_ref_count;
+ //! Pointer to next task_scheduler_observer
+ /** Valid even when *this has been removed from the global list. */
+ observer_proxy* next;
+ //! Pointer to previous task_scheduler_observer in global list.
+ observer_proxy* prev;
+ //! Associated observer
+ task_scheduler_observer* observer;
+ //! Account for removing reference from p. No effect if p is NULL.
+ void remove_ref_slow();
+ void remove_from_list();
+ observer_proxy( task_scheduler_observer_v3& wo );
public:
- //! Operation for this cell
- OpKind op;
-
- //! Inputs to this cell
- Cell* input[2];
-
- //! Type of value stored in a Cell
- typedef Matrix value_type;
-
- //! Value associated with this Cell
- value_type value;
-
- //! Set of cells that use this Cell as an input
- std::vector<Cell*> successor;
-
- //! Reference count of number of inputs that are not yet updated.
- TBB::atomic<int> ref_count;
-
- //! Update the Cell's value.
- void update();
-
- //! Default construtor
- Cell() {}
+ static observer_proxy* process_list( observer_proxy* local_last, bool is_worker, bool is_entry );
};
-//! A directed graph where the vertices are Cells.
-class Graph {
- std::vector<Cell> my_vertex_set;
-public:
- //! Create a random acyclic directed graph
- void create_random_dag( size_t number_of_nodes );
+extern observer_proxy* global_last_observer_proxy;
- //! Print the graph
- void print();
+} // namespace internal
+} // namespace tbb
- //! Get set of cells that have no inputs.
- void get_root_set( std::vector<Cell*>& root_set );
-};
+#endif /* __TBB_SCHEDULER_OBSERVER */
+#endif /* _TBB_observer_proxy_H */
diff --git a/src/tbb/pipeline.cpp b/src/tbb/pipeline.cpp
index c098286..751b9d8 100644
--- a/src/tbb/pipeline.cpp
+++ b/src/tbb/pipeline.cpp
@@ -161,7 +161,7 @@ public:
spawner.spawn_stage_task(wakee);
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//! The method destroys all data in filters to prevent memory leaks
void clear( filter* my_filter ) {
long t=low_token;
@@ -258,7 +258,7 @@ public:
}
//! The virtual task execution method
/*override*/ task* execute();
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
~stage_task()
{
if (my_filter && my_object && (my_filter->my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(4)) {
@@ -267,7 +267,7 @@ public:
my_object = NULL;
}
}
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
//! Creates and spawns stage_task from task_info
void spawn_stage_task(const task_info& info)
{
@@ -465,7 +465,7 @@ public:
my_pipeline(_pipeline)
{}
~pipeline_cleaner(){
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
if (my_pipeline.end_counter->is_cancelled()) // Pipeline was cancelled
my_pipeline.clear_filters();
#endif
@@ -479,7 +479,7 @@ void pipeline::inject_token( task& ) {
__TBB_ASSERT(0,"illegal call to inject_token");
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
void pipeline::clear_filters() {
for( filter* f = filter_list; f; f = f->next_filter_in_pipeline ) {
if ((f->my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(4))
@@ -591,7 +591,7 @@ void pipeline::remove_filter( filter& filter_ ) {
}
void pipeline::run( size_t max_number_of_live_tokens
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
, tbb::task_group_context& context
#endif
) {
@@ -600,7 +600,7 @@ void pipeline::run( size_t max_number_of_live_tokens
if( filter_list ) {
internal::pipeline_cleaner my_pipeline_cleaner(*this);
end_of_input = false;
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
end_counter = new( task::allocate_root(context) ) internal::pipeline_root_task( *this );
#else
end_counter = new( task::allocate_root() ) internal::pipeline_root_task( *this );
@@ -611,12 +611,19 @@ void pipeline::run( size_t max_number_of_live_tokens
}
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
void pipeline::run( size_t max_number_of_live_tokens ) {
- tbb::task_group_context context;
- run(max_number_of_live_tokens, context);
+ if( filter_list ) {
+ // Construct task group context with the exception propagation mode expected
+ // by the pipeline caller.
+ uintptr_t ctx_traits = filter_list->my_filter_mode & filter::exact_exception_propagation ?
+ task_group_context::default_traits :
+ task_group_context::default_traits & ~task_group_context::exact_exception;
+ task_group_context context(task_group_context::bound, ctx_traits);
+ run(max_number_of_live_tokens, context);
+ }
}
-#endif // __TBB_EXCEPTIONS
+#endif // __TBB_TASK_GROUP_CONTEXT
filter::~filter() {
if ( (my_filter_mode & version_mask) >= __TBB_PIPELINE_VERSION(3) ) {
diff --git a/src/tbb/private_server.cpp b/src/tbb/private_server.cpp
index 7c4cf99..61bd127 100644
--- a/src/tbb/private_server.cpp
+++ b/src/tbb/private_server.cpp
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+
#include "rml_tbb.h"
#include "../server/thread_monitor.h"
#include "tbb/atomic.h"
@@ -33,6 +34,12 @@
#include "tbb/spin_mutex.h"
#include "tbb/tbb_thread.h"
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#endif
+
using rml::internal::thread_monitor;
namespace tbb {
@@ -171,7 +178,7 @@ public:
return 0;
}
- /*override*/ void request_close_connection() {
+ /*override*/ void request_close_connection( bool /*exiting*/ ) {
for( size_t i=0; i<my_n_thread; ++i )
my_thread_array[i].start_shutdown();
remove_server_ref();
@@ -184,6 +191,11 @@ public:
/*override*/ unsigned default_concurrency() const {return tbb::tbb_thread::hardware_concurrency()-1;}
/*override*/ void adjust_job_count_estimate( int delta );
+
+#if _WIN32||_WIN64
+ /*override*/ void register_master ( ::rml::server::execution_resource_t& ) {}
+ /*override*/ void unregister_master ( ::rml::server::execution_resource_t ) {}
+#endif /* _WIN32||_WIN64 */
};
//------------------------------------------------------------------------
@@ -197,8 +209,12 @@ public:
__RML_DECL_THREAD_ROUTINE private_worker::thread_routine( void* arg ) {
private_worker* self = static_cast<private_worker*>(arg);
AVOID_64K_ALIASING( self->my_index );
+#if _XBOX
+ int HWThreadIndex = GetHardwareThreadIndex(i);
+ XSetThreadProcessor(GetCurrentThread(), HWThreadIndex);
+#endif
self->run();
- return NULL;
+ return 0;
}
#if _MSC_VER && !defined(__INTEL_COMPILER)
#pragma warning(pop)
diff --git a/src/tbb/queuing_rw_mutex.cpp b/src/tbb/queuing_rw_mutex.cpp
index 96f213e..d02f358 100644
--- a/src/tbb/queuing_rw_mutex.cpp
+++ b/src/tbb/queuing_rw_mutex.cpp
@@ -145,8 +145,8 @@ typedef tricky_atomic_pointer<queuing_rw_mutex::scoped_lock> tricky_pointer;
static const tricky_pointer::word FLAG = 0x1;
inline
-uintptr get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
- return uintptr(tricky_pointer(ptr)&FLAG);
+uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
+ return uintptr_t(tricky_pointer(ptr)&FLAG);
}
//------------------------------------------------------------------------
diff --git a/src/tbb/reader_writer_lock.cpp b/src/tbb/reader_writer_lock.cpp
new file mode 100644
index 0000000..2f4e3f6
--- /dev/null
+++ b/src/tbb/reader_writer_lock.cpp
@@ -0,0 +1,356 @@
+/*
+ Copyright 2005-2010 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/reader_writer_lock.h"
+#include "tbb/tbb_machine.h"
+#include "tbb/tbb_exception.h"
+#include "itt_notify.h"
+
+namespace tbb {
+namespace interface5 {
+
+const unsigned WFLAG1 = 0x1; // writer interested or active
+const unsigned WFLAG2 = 0x2; // writers interested, no entering readers
+const unsigned RFLAG = 0x4; // reader interested but not active
+const unsigned RC_INCR = 0x8; // to adjust reader count
+
+
+// Perform an atomic bitwise-OR on the operand with the addend, and return
+// the previous value of the operand.
+inline unsigned fetch_and_or(atomic<unsigned>& operand, unsigned addend) {
+ tbb::internal::atomic_backoff backoff;
+ for (;;) {
+ unsigned old = operand;
+ unsigned result = operand.compare_and_swap(old|addend, old);
+ if (result==old) return old;
+ backoff.pause();
+ }
+}
+
+// Perform an atomic bitwise-AND on the operand with the addend, and return
+// the previous value of the operand.
+inline unsigned fetch_and_and(atomic<unsigned>& operand, unsigned addend) {
+ tbb::internal::atomic_backoff backoff;
+ for (;;) {
+ unsigned old = operand;
+ unsigned result = operand.compare_and_swap(old&addend, old);
+ if (result==old) return old;
+ backoff.pause();
+ }
+}
+
+//! Spin WHILE the value at the location is greater than or equal to a given value
+/** T and U should be comparable types. */
+template<typename T, typename U>
+void spin_wait_while_geq( const volatile T& location, U value ) {
+ tbb::internal::atomic_backoff backoff;
+ while( location>=value ) backoff.pause();
+}
+
+//! Spin UNTIL (location & value) is true.
+/** T and U should be comparable types. */
+template<typename T, typename U>
+void spin_wait_until_and( const volatile T& location, U value ) {
+ tbb::internal::atomic_backoff backoff;
+ while( !(location & value) ) backoff.pause();
+}
+
+
+void reader_writer_lock::internal_construct() {
+ reader_head = NULL;
+ writer_head = NULL;
+ writer_tail = NULL;
+ rdr_count_and_flags = 0;
+ my_current_writer = tbb_thread::id();
+#if TBB_USE_THREADING_TOOLS
+ ITT_SYNC_CREATE(this, _T("tbb::reader_writer_lock"), _T(""));
+#endif /* TBB_USE_THREADING_TOOLS */
+}
+
+void reader_writer_lock::internal_destroy() {
+ __TBB_ASSERT(rdr_count_and_flags==0, "reader_writer_lock destroyed with pending readers/writers.");
+ __TBB_ASSERT(reader_head==NULL, "reader_writer_lock destroyed with pending readers.");
+ __TBB_ASSERT(writer_tail==NULL, "reader_writer_lock destroyed with pending writers.");
+ __TBB_ASSERT(writer_head==NULL, "reader_writer_lock destroyed with pending/active writers.");
+}
+
+// Acquires the reader_writer_lock for write. If the lock is currently held in write
+// mode by another context, the writer will block by spinning on a local variable.
+// Throws exception improper_lock if the context tries to acquire a
+// reader_writer_lock that it already has write ownership of.
+void reader_writer_lock::lock() {
+ if (is_current_writer()) { // recursive lock attempt
+ // we don't support recursive writer locks; throw exception
+ tbb::internal::throw_exception(tbb::internal::eid_improper_lock);
+ }
+ else {
+ scoped_lock *a_writer_lock = new scoped_lock();
+ (void) start_write(a_writer_lock);
+ }
+}
+
+// Tries to acquire the reader_writer_lock for write. 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, try_lock() returns false.
+bool reader_writer_lock::try_lock() {
+ if (is_current_writer()) { // recursive lock attempt
+ return false;
+ }
+ else {
+ scoped_lock *a_writer_lock = new scoped_lock();
+ a_writer_lock->status = waiting_nonblocking;
+ return start_write(a_writer_lock);
+ }
+}
+
+bool reader_writer_lock::start_write(scoped_lock *I) {
+ tbb_thread::id id = this_tbb_thread::get_id();
+ scoped_lock *pred = NULL;
+ if (I->status == waiting_nonblocking) {
+ if ((pred = writer_tail.compare_and_swap(I, NULL)) != NULL) {
+ delete I;
+ return false;
+ }
+ }
+ else {
+ ITT_NOTIFY(sync_prepare, this);
+ pred = writer_tail.fetch_and_store(I);
+ }
+ if (pred)
+ pred->next = I;
+ else {
+ set_next_writer(I);
+ if (I->status == waiting_nonblocking) {
+ if (I->next) { // potentially more writers
+ set_next_writer(I->next);
+ }
+ else { // no more writers
+ writer_head.fetch_and_store(NULL);
+ if (I != writer_tail.compare_and_swap(NULL, I)) { // an incoming writer is in the process of being added
+ spin_wait_while_eq(I->next, (scoped_lock *)NULL); // wait for new writer to be added
+ __TBB_ASSERT(I->next, "There should be a node following the last writer.");
+ set_next_writer(I->next);
+ }
+ }
+ delete I;
+ return false;
+ }
+ }
+ spin_wait_while_eq(I->status, waiting);
+ ITT_NOTIFY(sync_acquired, this);
+ my_current_writer = id;
+ return true;
+}
+
+void reader_writer_lock::set_next_writer(scoped_lock *W) {
+ writer_head = W;
+ if (W->status == waiting_nonblocking) {
+ if (rdr_count_and_flags.compare_and_swap(WFLAG1+WFLAG2, 0) == 0) {
+ W->status = active;
+ }
+ }
+ else {
+ if (fetch_and_or(rdr_count_and_flags, WFLAG1) & RFLAG) { // reader present
+ spin_wait_until_and(rdr_count_and_flags, WFLAG2); // block until readers set WFLAG2
+ }
+ else { // no reader in timing window
+ __TBB_AtomicOR(&rdr_count_and_flags, WFLAG2);
+ }
+ spin_wait_while_geq(rdr_count_and_flags, RC_INCR); // block until readers finish
+ W->status = active;
+ }
+}
+
+// Acquires the reader_writer_lock for read. If the lock is currently held by a writer,
+// this reader will block and wait until the writers are done.
+// Throws exception improper_lock when the context tries to acquire a reader_writer_lock
+// that it already has write ownership of.
+void reader_writer_lock::lock_read() {
+ if (is_current_writer()) { // recursive lock attempt
+ // we don't support writer->reader downgrade; throw exception
+ tbb::internal::throw_exception(tbb::internal::eid_improper_lock);
+ }
+ else {
+ scoped_lock_read a_reader_lock;
+ start_read(&a_reader_lock);
+ }
+}
+
+// Tries to acquire the reader_writer_lock for read. This function does not block.
+// Return Value: True or false, depending on whether the lock is acquired or not.
+bool reader_writer_lock::try_lock_read() {
+ if (is_current_writer()) { // recursive lock attempt
+ return false;
+ }
+ else {
+ if (rdr_count_and_flags.fetch_and_add(RC_INCR) & (WFLAG1+WFLAG2)) { // writers present
+ rdr_count_and_flags -= RC_INCR;
+ return false;
+ }
+ else { // no writers
+ ITT_NOTIFY(sync_acquired, this);
+ return true;
+ }
+ }
+}
+
+void reader_writer_lock::start_read(scoped_lock_read *I) {
+ ITT_NOTIFY(sync_prepare, this);
+ I->next = reader_head.fetch_and_store(I);
+ if (!I->next) { // first arriving reader in my group; set RFLAG, test writer flags
+ // unblock and/or update statuses of non-blocking readers
+ if (!(fetch_and_or(rdr_count_and_flags, RFLAG) & (WFLAG1+WFLAG2))) { // no writers
+ unblock_readers();
+ }
+ }
+ __TBB_ASSERT(I->status == waiting || I->status == active, "Lock requests should be waiting or active before blocking.");
+ spin_wait_while_eq(I->status, waiting); // block
+ if (I->next) {
+ __TBB_ASSERT(I->next->status == waiting, NULL);
+ rdr_count_and_flags += RC_INCR;
+ I->next->status = active; // wake successor
+ }
+ ITT_NOTIFY(sync_acquired, this);
+}
+
+void reader_writer_lock::unblock_readers() {
+ // clear rdr interest flag, increment rdr count
+ __TBB_ASSERT(rdr_count_and_flags&RFLAG, NULL);
+ rdr_count_and_flags += RC_INCR-RFLAG;
+ __TBB_ASSERT(rdr_count_and_flags >= RC_INCR, NULL);
+ // indicate clear of window
+ if (rdr_count_and_flags & WFLAG1 && !(rdr_count_and_flags & WFLAG2)) {
+ __TBB_AtomicOR(&rdr_count_and_flags, WFLAG2);
+ }
+ // unblock waiting readers
+ scoped_lock_read *head = reader_head.fetch_and_store(NULL);
+ __TBB_ASSERT(head, NULL);
+ __TBB_ASSERT(head->status == waiting, NULL);
+ head->status = active;
+}
+
+// Releases the reader_writer_lock
+void reader_writer_lock::unlock() {
+ if( my_current_writer!=tbb_thread::id() ) {
+ // A writer owns the lock
+ __TBB_ASSERT(is_current_writer(), "caller of reader_writer_lock::unlock() does not own the lock.");
+ __TBB_ASSERT(writer_head, NULL);
+ __TBB_ASSERT(writer_head->status==active, NULL);
+ scoped_lock *a_writer_lock = writer_head;
+ end_write(a_writer_lock);
+ __TBB_ASSERT(a_writer_lock != writer_head, "Internal error: About to turn writer_head into dangling reference.");
+ delete a_writer_lock;
+ } else {
+ end_read();
+ }
+}
+
+void reader_writer_lock::end_write(scoped_lock *I) {
+ __TBB_ASSERT(I==writer_head, "Internal error: can't unlock a thread that is not holding the lock.");
+ my_current_writer = tbb_thread::id();
+ ITT_NOTIFY(sync_releasing, this);
+ if (I->next) { // potentially more writers
+ writer_head = I->next;
+ writer_head->status = active;
+ }
+ else { // No more writers; clear writer flag, test reader interest flag
+ __TBB_ASSERT(writer_head, NULL);
+ if (fetch_and_and(rdr_count_and_flags, ~(WFLAG1+WFLAG2)) & RFLAG) {
+ unblock_readers();
+ }
+ writer_head.fetch_and_store(NULL);
+ if (I != writer_tail.compare_and_swap(NULL, I)) { // an incoming writer is in the process of being added
+ spin_wait_while_eq(I->next, (scoped_lock *)NULL); // wait for new writer to be added
+ __TBB_ASSERT(I->next, "There should be a node following the last writer.");
+ set_next_writer(I->next);
+ }
+ }
+}
+
+void reader_writer_lock::end_read() {
+ ITT_NOTIFY(sync_releasing, this);
+ __TBB_ASSERT(rdr_count_and_flags >= RC_INCR, "unlock() called but no readers hold the lock.");
+ rdr_count_and_flags -= RC_INCR;
+}
+
+inline bool reader_writer_lock::is_current_writer() {
+ return my_current_writer==this_tbb_thread::get_id();
+}
+
+// Construct with a blocking attempt to acquire a write lock on the passed reader_writer_lock
+void reader_writer_lock::scoped_lock::internal_construct (reader_writer_lock& lock) {
+ mutex = &lock;
+ next = NULL;
+ status = waiting;
+ if (mutex->is_current_writer()) { // recursive lock attempt
+ // we don't support recursive writer locks; throw exception
+ tbb::internal::throw_exception(tbb::internal::eid_improper_lock);
+ }
+ else { // this thread holds no locks
+ (void) mutex->start_write(this);
+ }
+}
+
+inline reader_writer_lock::scoped_lock::scoped_lock() : mutex(NULL), next(NULL) {
+ status = waiting;
+}
+
+// Construct with a blocking attempt to acquire a write lock on the passed reader_writer_lock
+void reader_writer_lock::scoped_lock_read::internal_construct (reader_writer_lock& lock) {
+ mutex = &lock;
+ next = NULL;
+ status = waiting;
+ if (mutex->is_current_writer()) { // recursive lock attempt
+ // we don't support writer->reader downgrade; throw exception
+ tbb::internal::throw_exception(tbb::internal::eid_improper_lock);
+ }
+ else { // this thread holds no locks
+ mutex->start_read(this);
+ }
+}
+
+inline reader_writer_lock::scoped_lock_read::scoped_lock_read() : mutex(NULL), next(NULL) {
+ status = waiting;
+}
+
+void reader_writer_lock::scoped_lock::internal_destroy() {
+ if (mutex) {
+ __TBB_ASSERT(mutex->is_current_writer(), "~scoped_lock() destroyed by thread different than thread that holds lock.");
+ mutex->end_write(this);
+ }
+ status = invalid;
+}
+
+void reader_writer_lock::scoped_lock_read::internal_destroy() {
+ if (mutex)
+ mutex->end_read();
+ status = invalid;
+}
+
+} // namespace interface5
+} // namespace tbb
diff --git a/src/tbb/scheduler.cpp b/src/tbb/scheduler.cpp
new file mode 100644
index 0000000..c57c4b6
--- /dev/null
+++ b/src/tbb/scheduler.cpp
@@ -0,0 +1,1179 @@
+/*
+ Copyright 2005-2010 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_machine.h"
+
+#include "custom_scheduler.h"
+#include "scheduler_utility.h"
+#include "governor.h"
+#include "market.h"
+#include "arena.h"
+#include "mailbox.h"
+#include "observer_proxy.h"
+#include "itt_notify.h"
+
+namespace tbb {
+namespace internal {
+
+/** Defined in tbb_main.cpp **/
+extern generic_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );
+
+inline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) {
+ return AllocateSchedulerPtr(a, index);
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+#if !__TBB_ARENA_PER_MASTER
+//! Head of the list of master thread schedulers.
+static scheduler_list_node_t the_scheduler_list_head;
+
+//! Mutex protecting access to the list of schedulers.
+static mutex the_scheduler_list_mutex;
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+//! Counter that is incremented whenever new cancellation signal is sent to a task group.
+/** Together with generic_scheduler::local_cancel_count 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 being registered or unregistered,
+ the global and local counters are compared. If they differ, it means that
+ a cancellation signal is being propagated, and registration/deregistration
+ routines take slower branch that may block (at most one thread of the pool
+ can be blocked at any moment). Otherwise the control path is lock-free and fast. **/
+uintptr_t global_cancel_count = 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
+ 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 */
+
+#if STATISTICS
+ static statistics the_statistics;
+#endif /* STATISTICS */
+
+void Scheduler_OneTimeInitialization ( bool itt_present ) {
+ AllocateSchedulerPtr = itt_present ? &custom_scheduler<DefaultSchedulerTraits>::allocate_scheduler :
+ &custom_scheduler<IntelSchedulerTraits>::allocate_scheduler;
+#if __TBB_TASK_GROUP_CONTEXT && !__TBB_ARENA_PER_MASTER
+ ITT_SYNC_CREATE(&the_scheduler_list_mutex, SyncType_GlobalLock, SyncObj_SchedulersList);
+ the_scheduler_list_head.my_next = &the_scheduler_list_head;
+ the_scheduler_list_head.my_prev = &the_scheduler_list_head;
+#endif /* __TBB_TASK_GROUP_CONTEXT && !__TBB_ARENA_PER_MASTER */
+}
+
+//------------------------------------------------------------------------
+// scheduler interface
+//------------------------------------------------------------------------
+
+// A pure virtual destructor should still have a body
+// so the one for tbb::internal::scheduler::~scheduler() is provided here
+scheduler::~scheduler( ) {}
+
+//------------------------------------------------------------------------
+// generic_scheduler
+//------------------------------------------------------------------------
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ // Suppress overzealous compiler warning about using 'this' in base initializer list.
+ #pragma warning(push)
+ #pragma warning(disable:4355)
+#endif
+
+generic_scheduler::generic_scheduler( arena* a, size_t index ) :
+ my_stealing_threshold(0),
+ arena_index(index),
+ task_pool_size(0),
+ my_arena_slot(&dummy_slot),
+#if __TBB_ARENA_PER_MASTER
+ my_market(NULL),
+#endif /* __TBB_ARENA_PER_MASTER */
+ my_arena(a),
+ random( unsigned(this-(generic_scheduler*)NULL) ),
+ free_list(NULL),
+ innermost_running_task(NULL),
+ dummy_task(NULL),
+ ref_count(1),
+ my_affinity_id(0),
+ is_registered(false),
+ is_auto_initialized(false),
+#if __TBB_SCHEDULER_OBSERVER
+ local_last_observer_proxy(NULL),
+#endif /* __TBB_SCHEDULER_OBSERVER */
+#if __TBB_COUNT_TASK_NODES
+ task_node_count(0),
+#endif /* __TBB_COUNT_TASK_NODES */
+#if STATISTICS
+ current_active(0),
+ current_length(0),
+ current_big_malloc(0),
+ execute_count(0),
+ steal_count(0),
+ mail_received_count(0),
+ proxy_execute_count(0),
+ proxy_steal_count(0),
+ proxy_bypass_count(0),
+#endif /* STATISTICS */
+ small_task_count(1), // Extra 1 is a guard reference
+ return_list(NULL),
+#if __TBB_TASK_GROUP_CONTEXT
+ local_ctx_list_update(0),
+ nonlocal_ctx_list_update(0)
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+{
+ dummy_slot.task_pool = allocate_task_pool( min_task_pool_size );
+ dummy_slot.head = dummy_slot.tail = 0;
+ dummy_task = &allocate_task( sizeof(task), __TBB_CONTEXT_ARG(NULL, NULL) );
+#if __TBB_TASK_GROUP_CONTEXT
+ context_list_head.my_prev = &context_list_head;
+ context_list_head.my_next = &context_list_head;
+ ITT_SYNC_CREATE(&context_list_mutex, SyncType_Scheduler, SyncObj_ContextsList);
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ dummy_task->prefix().ref_count = 2;
+ ITT_SYNC_CREATE(&dummy_task->prefix().ref_count, SyncType_Scheduler, SyncObj_WorkerLifeCycleMgmt);
+ ITT_SYNC_CREATE(&return_list, SyncType_Scheduler, SyncObj_TaskReturnList);
+ __TBB_ASSERT( assert_okay(), "constructor error" );
+}
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ #pragma warning(pop)
+#endif // warning 4355 is back
+
+#if TBB_USE_ASSERT
+bool generic_scheduler::assert_okay() const {
+#if TBB_USE_ASSERT >= 2
+ acquire_task_pool();
+ task** tp = dummy_slot.task_pool;
+ __TBB_ASSERT( task_pool_size >= min_task_pool_size, NULL );
+ __TBB_ASSERT( my_arena_slot->head <= my_arena_slot->tail, NULL );
+ for ( size_t i = my_arena_slot->head; i < my_arena_slot->tail; ++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" );
+ }
+ release_task_pool();
+#endif /* TBB_USE_ASSERT >=2 */
+ return true;
+}
+#endif /* TBB_USE_ASSERT */
+
+#if __TBB_TASK_GROUP_CONTEXT
+void generic_scheduler::propagate_cancellation () {
+ spin_mutex::scoped_lock lock(context_list_mutex);
+ // Acquire fence is necessary to ensure that the subsequent node->my_next load
+ // returned the correct value in case it was just inserted in another thread.
+ // The fence also ensures visibility of the correct my_parent value.
+ context_list_node_t *node = __TBB_load_with_acquire(context_list_head.my_next);
+ while ( node != &context_list_head ) {
+ task_group_context &ctx = __TBB_get_object_ref(task_group_context, my_node, node);
+ // The absence of acquire fence while reading my_cancellation_requested may result
+ // in repeated traversals of the same parents chain if another group (precedent or
+ // descendant) belonging to the tree being canceled sends cancellation request of
+ // its own around the same time.
+ if ( !ctx.my_cancellation_requested )
+ ctx.propagate_cancellation_from_ancestors();
+ node = node->my_next;
+ __TBB_ASSERT( ctx.is_alive(), "Walked into a destroyed context while propagating cancellation" );
+ }
+}
+
+#if !__TBB_ARENA_PER_MASTER
+/** Propagates cancellation down the tree of dependent contexts by walking each
+ thread's local list of contexts **/
+void generic_scheduler::propagate_cancellation ( task_group_context& ctx ) {
+ __TBB_ASSERT ( ctx.my_cancellation_requested, "No cancellation request in the context" );
+ // The whole propagation algorithm is under the lock in order to ensure correctness
+ // in case of parallel cancellations at the different levels of the context tree.
+ // See the note 2 at the bottom of the file.
+ mutex::scoped_lock lock(the_scheduler_list_mutex);
+ // Advance global cancellation state
+ __TBB_FetchAndAddWrelease(&global_cancel_count, 1);
+ // First propagate to workers using arena to access their context lists
+ size_t num_workers = my_arena->prefix().number_of_workers;
+ for ( size_t i = 0; i < num_workers; ++i ) {
+ // No fence is necessary here since the context list of worker's scheduler
+ // can contain anything of interest only after the first stealing was done
+ // by that worker. And doing it applies the necessary fence
+ generic_scheduler *s = my_arena->prefix().worker_list[i].scheduler;
+ // If the worker is in the middle of its startup sequence, skip it.
+ if ( s )
+ s->propagate_cancellation();
+ }
+ // Then propagate to masters using the global list of master's schedulers
+ scheduler_list_node_t *node = the_scheduler_list_head.my_next;
+ while ( node != &the_scheduler_list_head ) {
+ __TBB_get_object_ref(generic_scheduler, my_node, node).propagate_cancellation();
+ node = node->my_next;
+ }
+ // Now sync up the local counters
+ for ( size_t i = 0; i < num_workers; ++i ) {
+ generic_scheduler *s = my_arena->prefix().worker_list[i].scheduler;
+ // If the worker is in the middle of its startup sequence, skip it.
+ if ( s )
+ s->local_cancel_count = global_cancel_count;
+ }
+ node = the_scheduler_list_head.my_next;
+ while ( node != &the_scheduler_list_head ) {
+ __TBB_get_object_ref(generic_scheduler, my_node, node).local_cancel_count = global_cancel_count;
+ node = node->my_next;
+ }
+}
+#endif /* !__TBB_ARENA_PER_MASTER */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+
+void generic_scheduler::init_stack_info () {
+ // Stacks are growing top-down. Highest address is called "stack base",
+ // and the lowest is "stack limit".
+#if __TBB_ARENA_PER_MASTER
+ __TBB_ASSERT( !my_stealing_threshold, "Stealing threshold has already been calculated" );
+ size_t stack_size = my_market->worker_stack_size();
+#else /* !__TBB_ARENA_PER_MASTER */
+ size_t stack_size = my_arena->prefix().stack_size;
+#endif /* !__TBB_ARENA_PER_MASTER */
+#if USE_WINTHREAD
+#if defined(_MSC_VER)&&_MSC_VER<1400 && !_WIN64
+ NT_TIB *pteb = (NT_TIB*)__TBB_machine_get_current_teb();
+#else
+ NT_TIB *pteb = (NT_TIB*)NtCurrentTeb();
+#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
+ // 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.
+ // And for master threads we rely on the following fact and assumption:
+ // - the default stack size of a master thread on Windows is 1M;
+ // - if it was explicitly set by the application it is at least as large as the size of a worker stack.
+ if ( is_worker() || stack_size < MByte )
+ my_stealing_threshold = (uintptr_t)pteb->StackBase - stack_size / 2;
+ 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
+ // is that the main thread's stack size is not less than that of other threads.
+ void *stack_base = &stack_size;
+#if __TBB_ipf
+ void *rsb_base = __TBB_get_bsp();
+#endif
+#if __linux__
+ size_t np_stack_size = 0;
+ void *stack_limit = NULL;
+ pthread_attr_t attr_stack, np_attr_stack;
+ if( 0 == pthread_getattr_np(pthread_self(), &np_attr_stack) ) {
+ if ( 0 == pthread_attr_getstack(&np_attr_stack, &stack_limit, &np_stack_size) ) {
+ if ( 0 == pthread_attr_init(&attr_stack) ) {
+ if ( 0 == pthread_attr_getstacksize(&attr_stack, &stack_size) )
+ {
+ stack_base = (char*)stack_limit + np_stack_size;
+ if ( np_stack_size < stack_size ) {
+ // We are in a secondary thread. Use reliable data.
+#if __TBB_ipf
+ // IA64 stack is split into RSE backup and memory parts
+ rsb_base = stack_limit;
+ stack_size = np_stack_size/2;
+#else
+ stack_size = np_stack_size;
+#endif /* !__TBB_ipf */
+ }
+ // 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.
+ }
+ pthread_attr_destroy(&attr_stack);
+ }
+ }
+ pthread_attr_destroy(&np_attr_stack);
+ }
+#endif /* __linux__ */
+ __TBB_ASSERT( stack_size>0, "stack size must be positive" );
+ my_stealing_threshold = (uintptr_t)((char*)stack_base - stack_size/2);
+#if __TBB_ipf
+ my_rsb_stealing_threshold = (uintptr_t)((char*)rsb_base + stack_size/2);
+#endif
+#endif /* USE_PTHREAD */
+}
+
+/** 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
+ by the context object. **/
+void generic_scheduler::cleanup_local_context_list () {
+ // Detach contexts remaining in the local list
+ bool wait_for_concurrent_destroyers_to_leave = false;
+ uintptr_t local_count_snapshot = local_cancel_count;
+ local_ctx_list_update = 1;
+ {
+ spin_mutex::scoped_lock lock; // The lock is necessary in acse of a conflict only
+ __TBB_rel_acq_fence();
+ // Check for the conflict with concurrent destroyer or cancelation propagator
+ if ( nonlocal_ctx_list_update || local_count_snapshot != global_cancel_count )
+ lock.acquire(context_list_mutex);
+ context_list_node_t *node = context_list_head.my_next;
+ while ( node != &context_list_head ) {
+ task_group_context &ctx = __TBB_get_object_ref(task_group_context, my_node, node);
+ __TBB_ASSERT( ctx.my_kind != task_group_context::binding_required, "Only a context bound to a root task can be detached" );
+ node = node->my_next;
+ __TBB_ASSERT( ctx.is_alive(), "Walked into a destroyed context while detaching contexts from the local list" );
+ // On 64-bit systems my_kind can be a 32-bit value padded with 32 uninitialized bits.
+ // So the cast below is necessary to throw off the higher bytes containing garbage
+ if ( (task_group_context::kind_type)(uintptr_t)__TBB_FetchAndStoreW(&ctx.my_kind, task_group_context::detached) == task_group_context::dying )
+ wait_for_concurrent_destroyers_to_leave = true;
+ }
+ }
+ __TBB_store_with_release( local_ctx_list_update, 0 );
+ // Wait until other threads referencing this scheduler object finish with it
+ if ( wait_for_concurrent_destroyers_to_leave )
+ spin_wait_until_eq( nonlocal_ctx_list_update, 0u );
+}
+
+void generic_scheduler::free_scheduler() {
+ if( in_arena() ) {
+ acquire_task_pool();
+ leave_arena();
+ }
+#if __TBB_TASK_GROUP_CONTEXT
+ cleanup_local_context_list();
+#if !__TBB_ARENA_PER_MASTER
+ task_group_context* default_context = dummy_task->prefix().context;
+ if ( default_context != &dummy_context) {
+ // Only master thread's dummy task has a dynamically allocated context
+ default_context->task_group_context::~task_group_context();
+ NFS_Free(default_context);
+ {
+ mutex::scoped_lock lock(the_scheduler_list_mutex);
+ my_node.my_next->my_prev = my_node.my_prev;
+ my_node.my_prev->my_next = my_node.my_next;
+ }
+ }
+#endif /* !__TBB_ARENA_PER_MASTER */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ free_task<small_local_task>( *dummy_task );
+
+ // k accounts for a guard reference and each task that we deallocate.
+ intptr_t k = 1;
+ for(;;) {
+ while( task* t = free_list ) {
+ free_list = t->prefix().next;
+ deallocate_task(*t);
+ ++k;
+ }
+ if( return_list==plugged_return_list() )
+ break;
+ free_list = (task*)__TBB_FetchAndStoreW( &return_list, (intptr_t)plugged_return_list() );
+ }
+#if __TBB_COUNT_TASK_NODES
+#if __TBB_ARENA_PER_MASTER
+ my_market->update_task_node_count( task_node_count );
+#else /* !__TBB_ARENA_PER_MASTER */
+ my_arena->prefix().task_node_count += task_node_count;
+#endif /* !__TBB_ARENA_PER_MASTER */
+#endif /* __TBB_COUNT_TASK_NODES */
+#if STATISTICS
+ the_statistics.record( execute_count, steal_count, mail_received_count,
+ proxy_execute_count, proxy_steal_count, proxy_bypass_count );
+#endif /* STATISTICS */
+ free_task_pool( dummy_slot.task_pool );
+ dummy_slot.task_pool = NULL;
+ // Update small_task_count last. Doing so sooner might cause another thread to free *this.
+ __TBB_ASSERT( small_task_count>=k, "small_task_count corrupted" );
+ governor::sign_off(this);
+ if( __TBB_FetchAndAddW( &small_task_count, -k )==k )
+ NFS_Free( this );
+}
+
+task& generic_scheduler::allocate_task( size_t number_of_bytes,
+ __TBB_CONTEXT_ARG(task* parent, task_group_context* context) ) {
+ GATHER_STATISTIC(current_active+=1);
+ task* t = free_list;
+ if( number_of_bytes<=quick_task_size ) {
+ if( t ) {
+ GATHER_STATISTIC(current_length-=1);
+ __TBB_ASSERT( t->state()==task::freed, "free list of tasks is corrupted" );
+ free_list = t->prefix().next;
+ } else if( return_list ) {
+ // No fence required for read of return_list above, because __TBB_FetchAndStoreW has a fence.
+ t = (task*)__TBB_FetchAndStoreW( &return_list, 0 );
+ __TBB_ASSERT( t, "another thread emptied the return_list" );
+ __TBB_ASSERT( t->prefix().origin==this, "task returned to wrong return_list" );
+ ITT_NOTIFY( sync_acquired, &return_list );
+ free_list = t->prefix().next;
+ } else {
+ t = (task*)((char*)NFS_Allocate( task_prefix_reservation_size+quick_task_size, 1, NULL ) + task_prefix_reservation_size );
+#if __TBB_COUNT_TASK_NODES
+ ++task_node_count;
+#endif /* __TBB_COUNT_TASK_NODES */
+ t->prefix().origin = this;
+ ++small_task_count;
+ }
+ } else {
+ GATHER_STATISTIC(current_big_malloc+=1);
+ t = (task*)((char*)NFS_Allocate( task_prefix_reservation_size+number_of_bytes, 1, NULL ) + task_prefix_reservation_size );
+#if __TBB_COUNT_TASK_NODES
+ ++task_node_count;
+#endif /* __TBB_COUNT_TASK_NODES */
+ t->prefix().origin = NULL;
+ }
+ task_prefix& p = t->prefix();
+#if __TBB_TASK_GROUP_CONTEXT
+ p.context = context;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ p.owner = this;
+ p.ref_count = 0;
+ // Assign some not outrageously out-of-place value for a while
+ p.depth = 0;
+ p.parent = parent;
+ // In TBB 2.1 and later, the constructor for task sets extra_state to indicate the version of the tbb/task.h header.
+ // In TBB 2.0 and earlier, the constructor leaves extra_state as zero.
+ p.extra_state = 0;
+ p.affinity = 0;
+ p.state = task::allocated;
+ return *t;
+}
+
+void generic_scheduler::free_nonlocal_small_task( task& t ) {
+ __TBB_ASSERT( t.state()==task::freed, NULL );
+ generic_scheduler& s = *static_cast<generic_scheduler*>(t.prefix().origin);
+ __TBB_ASSERT( &s!=this, NULL );
+ for(;;) {
+ task* old = s.return_list;
+ if( old==plugged_return_list() )
+ break;
+ // Atomically insert t at head of s.return_list
+ t.prefix().next = old;
+ ITT_NOTIFY( sync_releasing, &s.return_list );
+ if( __TBB_CompareAndSwapW( &s.return_list, (intptr_t)&t, (intptr_t)old )==(intptr_t)old )
+ return;
+ }
+ deallocate_task(t);
+ if( __TBB_FetchAndDecrementWrelease( &s.small_task_count )==1 ) {
+ // We freed the last task allocated by scheduler s, so it's our responsibility
+ // to free the scheduler.
+ NFS_Free( &s );
+ }
+}
+
+task** generic_scheduler::allocate_task_pool( size_t n ) {
+ __TBB_ASSERT( n > task_pool_size, "Cannot shrink the task pool" );
+ size_t byte_size = ((n * sizeof(task*) + NFS_MaxLineSize - 1) / NFS_MaxLineSize) * NFS_MaxLineSize;
+ task_pool_size = byte_size / sizeof(task*);
+ task** new_pool = (task**)NFS_Allocate( byte_size, 1, NULL );
+ // No need to clear the fresh deque since valid items are designated by the head and tail members.
+#if TBB_USE_ASSERT>=2
+ // But clear it in the high vigilance debug mode
+ memset( new_pool, -1, n );
+#endif /* TBB_USE_ASSERT>=2 */
+ return new_pool;
+}
+
+void generic_scheduler::grow_task_pool( size_t new_size ) {
+ __TBB_ASSERT( assert_okay(), NULL );
+ if ( new_size < 2 * task_pool_size )
+ new_size = 2 * task_pool_size;
+ task** new_pool = allocate_task_pool( new_size ); // updates task_pool_size
+ task** old_pool = dummy_slot.task_pool;
+ acquire_task_pool(); // requires the old dummy_slot.task_pool value
+ // my_arena_slot->tail should not be updated before my_arena_slot->head because their
+ // values are used by other threads to check if this task pool is empty.
+ size_t new_tail = my_arena_slot->tail - my_arena_slot->head;
+ __TBB_ASSERT( new_tail <= 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_arena_slot->tail = new_tail;
+ dummy_slot.task_pool = new_pool;
+ release_task_pool(); // updates the task pool pointer in our arena slot
+ free_task_pool( old_pool );
+ __TBB_ASSERT( assert_okay(), NULL );
+}
+
+/** 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 {
+ if ( !in_arena() )
+ return; // we are not in arena - nothing to lock
+ atomic_backoff backoff;
+ bool sync_prepare_done = false;
+ for(;;) {
+#if TBB_USE_ASSERT
+ __TBB_ASSERT( my_arena_slot == my_arena->slot + arena_index, "invalid arena slot index" );
+ // 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 == 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,
+ (intptr_t)dummy_slot.task_pool ) == (intptr_t)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);
+ sync_prepare_done = true;
+ }
+ // Someone else acquired a lock, so pause and do exponential backoff.
+ backoff.pause();
+ }
+ __TBB_ASSERT( my_arena_slot->task_pool == LockedTaskPool, "not really acquired task pool" );
+} // generic_scheduler::acquire_task_pool
+
+inline void generic_scheduler::release_task_pool() const {
+ if ( !in_arena() )
+ return; // we are not in arena - nothing to unlock
+ __TBB_ASSERT( my_arena_slot, "we are not in arena" );
+ __TBB_ASSERT( my_arena_slot->task_pool == LockedTaskPool, "arena slot is not locked" );
+ ITT_NOTIFY(sync_releasing, my_arena_slot);
+ __TBB_store_with_release( my_arena_slot->task_pool, 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
+ 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 {
+ task** victim_task_pool;
+ atomic_backoff backoff;
+ bool sync_prepare_done = false;
+ for(;;) {
+ victim_task_pool = victim_arena_slot->task_pool;
+ // TODO: Investigate the effect of bailing out on the locked pool without trying to lock it.
+ // When doing this update assertion in the end of the method.
+ if ( victim_task_pool == EmptyTaskPool ) {
+ // The victim thread emptied its task pool - nothing to lock
+ if( sync_prepare_done )
+ ITT_NOTIFY(sync_cancel, victim_arena_slot);
+ break;
+ }
+ if( victim_task_pool != LockedTaskPool &&
+ __TBB_CompareAndSwapW( &victim_arena_slot->task_pool,
+ (intptr_t)LockedTaskPool, (intptr_t)victim_task_pool ) == (intptr_t)victim_task_pool )
+ {
+ // We've locked victim's task pool
+ ITT_NOTIFY(sync_acquired, victim_arena_slot);
+ break;
+ }
+ else if( !sync_prepare_done ) {
+ // Start waiting
+ ITT_NOTIFY(sync_prepare, victim_arena_slot);
+ sync_prepare_done = true;
+ }
+ // 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),
+ "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,
+ 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" );
+ ITT_NOTIFY(sync_releasing, victim_arena_slot);
+ __TBB_store_with_release( victim_arena_slot->task_pool, victim_task_pool );
+}
+
+
+inline task* generic_scheduler::prepare_for_spawning( task* t ) {
+ __TBB_ASSERT( t->state()==task::allocated, "attempt to spawn task that is not in 'allocated' state" );
+ t->prefix().owner = this;
+ t->prefix().state = task::ready;
+#if TBB_USE_ASSERT
+ if( task* parent = t->parent() ) {
+ internal::reference_count ref_count = parent->prefix().ref_count;
+ __TBB_ASSERT( ref_count>=0, "attempt to spawn task whose parent has a ref_count<0" );
+ __TBB_ASSERT( ref_count!=0, "attempt to spawn task whose parent has a ref_count==0 (forgot to set_ref_count?)" );
+ parent->prefix().extra_state |= es_ref_count_active;
+ }
+#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" );
+ if( dst_thread != 0 && dst_thread != my_affinity_id ) {
+ 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;
+ ITT_NOTIFY( sync_releasing, proxy.outbox );
+ // Mail the proxy - after this point t may be destroyed by another thread at any moment.
+ proxy.outbox->push(proxy);
+ return &proxy;
+ }
+ return t;
+}
+
+/** Conceptually, this method should be a member of class scheduler.
+ 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 );
+ __TBB_ASSERT( assert_okay(), NULL );
+ if ( &first.prefix().next == &next ) {
+ // Single task is being spawned
+ if ( my_arena_slot->tail == task_pool_size ) {
+ // 1 compensates for head possibly temporarily incremented by a thief
+ if ( my_arena_slot->head > 1 ) {
+ // Move the busy part of the deque to the beginning of the allocated space
+ acquire_task_pool();
+ my_arena_slot->tail -= my_arena_slot->head;
+ memmove( dummy_slot.task_pool, dummy_slot.task_pool + my_arena_slot->head, my_arena_slot->tail * sizeof(task*) );
+ my_arena_slot->head = 0;
+ release_task_pool();
+ }
+ else {
+ grow_task_pool( task_pool_size + 1 );
+ }
+ }
+ dummy_slot.task_pool[my_arena_slot->tail] = prepare_for_spawning( &first );
+ ITT_NOTIFY(sync_releasing, my_arena_slot);
+ // The following store with release is required on ia64 only
+ size_t new_tail = my_arena_slot->tail + 1;
+ __TBB_store_with_release( my_arena_slot->tail, new_tail );
+ __TBB_ASSERT ( my_arena_slot->tail <= task_pool_size, "task deque end was overwritten" );
+ }
+ else {
+ // Task list is being spawned
+ const size_t initial_capacity = 64;
+ task *arr[initial_capacity];
+ fast_reverse_vector<task*> tasks(arr, initial_capacity);
+ task *t_next = NULL;
+ for( task* t = &first; ; t = t_next ) {
+ // After prepare_for_spawning returns t may already have been destroyed.
+ // So milk it while it is alive.
+ bool end = &t->prefix().next == &next;
+ t_next = t->prefix().next;
+ tasks.push_back( prepare_for_spawning(t) );
+ if( end )
+ break;
+ }
+ size_t num_tasks = tasks.size();
+ __TBB_ASSERT ( arena_index != null_arena_index, "invalid arena slot index" );
+ if ( my_arena_slot->tail + num_tasks > task_pool_size ) {
+ // 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 ( new_size <= task_pool_size ) {
+ // Move the busy part of the deque to the beginning of the allocated space
+ acquire_task_pool();
+ my_arena_slot->tail -= my_arena_slot->head;
+ memmove( dummy_slot.task_pool, dummy_slot.task_pool + my_arena_slot->head, my_arena_slot->tail * sizeof(task*) );
+ my_arena_slot->head = 0;
+ release_task_pool();
+ }
+ else {
+ grow_task_pool( new_size );
+ }
+ }
+#if DO_ITT_NOTIFY
+ else {
+ // The preceding if-branch issues the same ittnotify inside release_task_pool() or grow_task_pool() methods
+ ITT_NOTIFY(sync_releasing, my_arena_slot);
+ }
+#endif /* DO_ITT_NOTIFY */
+ tasks.copy_memory( dummy_slot.task_pool + my_arena_slot->tail );
+ // The following store with release is required on ia64 only
+ size_t new_tail = my_arena_slot->tail + num_tasks;
+ __TBB_store_with_release( my_arena_slot->tail, new_tail );
+ __TBB_ASSERT ( my_arena_slot->tail <= task_pool_size, "task deque end was overwritten" );
+ }
+#if __TBB_ARENA_PER_MASTER
+ if ( !in_arena() )
+ enter_arena();
+ my_arena->advertise_new_work</*Spawned=*/true>();
+#else /* !__TBB_ARENA_PER_MASTER */
+ if ( !in_arena() ) {
+ if ( is_worker() )
+ enter_arena();
+ else
+ try_enter_arena();
+ }
+ my_arena->mark_pool_full();
+#endif /* !__TBB_ARENA_PER_MASTER */
+ __TBB_ASSERT( assert_okay(), NULL );
+}
+
+void generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {
+ __TBB_ASSERT( governor::is_set(this), NULL );
+ __TBB_ASSERT( &first, NULL );
+ auto_empty_task dummy( __TBB_CONTEXT_ARG(this, first.prefix().context) );
+ internal::reference_count n = 0;
+ for( task* t=&first; ; t=t->prefix().next ) {
+ ++n;
+ __TBB_ASSERT( !t->prefix().parent, "not a root task, or already running" );
+ 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,
+ "all the root tasks in list must share the same context");
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ }
+ dummy.prefix().ref_count = n+1;
+ if( n>1 )
+ local_spawn( *first.prefix().next, next );
+ local_wait_for_all( dummy, &first );
+}
+
+inline task* generic_scheduler::get_mailbox_task() {
+ __TBB_ASSERT( my_affinity_id>0, "not in arena" );
+ task* result = NULL;
+ while( task_proxy* t = 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.
+ ITT_NOTIFY( sync_acquired, inbox.outbox() );
+ result = (task*)(tat & ~3);
+ result->prefix().owner = this;
+ break;
+ }
+ free_task_proxy( *t );
+ }
+ 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;
+}
+
+#if __TBB_ARENA_PER_MASTER
+void generic_scheduler::local_enqueue( task& t ) {
+ __TBB_ASSERT( governor::is_set(this), NULL );
+ __TBB_ASSERT( t.state()==task::allocated, "attempt to enqueue task that is not in 'allocated' state" );
+ t.prefix().owner = this;
+ t.prefix().state = task::ready;
+
+#if TBB_USE_ASSERT
+ if( task* parent = t.parent() ) {
+ internal::reference_count ref_count = parent->prefix().ref_count;
+ __TBB_ASSERT( ref_count>=0, "attempt to enqueue task whose parent has a ref_count<0" );
+ __TBB_ASSERT( ref_count!=0, "attempt to enqueue task whose parent has a ref_count==0 (forgot to set_ref_count?)" );
+ parent->prefix().extra_state |= es_ref_count_active;
+ }
+ __TBB_ASSERT(t.prefix().affinity==affinity_id(0), "affinity is ignored for enqueued tasks");
+#endif /* TBB_USE_ASSERT */
+
+ __TBB_ASSERT( my_arena, "thread is not in any arena" );
+ ITT_NOTIFY(sync_releasing, &my_arena->my_task_stream);
+ my_arena->my_task_stream.push( &t, my_arena_slot->hint_for_push );
+ my_arena->advertise_new_work< /*Spawned=*/ false >();
+ __TBB_ASSERT( assert_okay(), NULL );
+}
+
+inline task* generic_scheduler::dequeue_task() {
+ task* result = NULL;
+ my_arena->my_task_stream.pop(result, my_arena_slot->hint_for_pop);
+ if (result) ITT_NOTIFY(sync_acquired, &my_arena->my_task_stream);
+ return result;
+}
+#endif /* __TBB_ARENA_PER_MASTER */
+
+inline task* generic_scheduler::get_task() {
+ task* result = NULL;
+retry:
+ --my_arena_slot->tail;
+ __TBB_rel_acq_fence();
+ if ( (intptr_t)my_arena_slot->head > (intptr_t)my_arena_slot->tail ) {
+ acquire_task_pool();
+ if ( (intptr_t)my_arena_slot->head <= (intptr_t)my_arena_slot->tail ) {
+ // The thief backed off - grab the task
+ __TBB_ASSERT_VALID_TASK_PTR( dummy_slot.task_pool[my_arena_slot->tail] );
+ result = dummy_slot.task_pool[my_arena_slot->tail];
+ __TBB_POISON_TASK_PTR( dummy_slot.task_pool[my_arena_slot->tail] );
+ }
+ 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 ) {
+ release_task_pool();
+ }
+ else {
+ // In any case the deque is empty now, so compact it
+ my_arena_slot->head = my_arena_slot->tail = 0;
+ if ( in_arena() )
+ leave_arena();
+ }
+ }
+ else {
+ __TBB_ASSERT_VALID_TASK_PTR( dummy_slot.task_pool[my_arena_slot->tail] );
+ result = dummy_slot.task_pool[my_arena_slot->tail];
+ __TBB_POISON_TASK_PTR( dummy_slot.task_pool[my_arena_slot->tail] );
+ }
+ if( result && is_proxy(*result) ) {
+ result = strip_proxy((task_proxy*)result);
+ if( !result ) {
+ goto retry;
+ }
+ GATHER_STATISTIC( ++proxy_execute_count );
+ // Following assertion should be true because TBB 2.0 tasks never specify affinity, and hence are not proxied.
+ __TBB_ASSERT( is_version_3_task(*result), "backwards compatibility with TBB 2.0 broken" );
+ // Task affinity has changed.
+ innermost_running_task = result;
+ result->note_affinity(my_affinity_id);
+ }
+ return result;
+} // generic_scheduler::get_task
+
+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;
+retry:
+ ++victim_slot.head;
+ __TBB_rel_acq_fence();
+ if ( (intptr_t)victim_slot.head > (intptr_t)victim_slot.tail ) {
+ --victim_slot.head;
+ }
+ else {
+ __TBB_ASSERT_VALID_TASK_PTR( victim_pool[victim_slot.head - 1]);
+ result = victim_pool[victim_slot.head - 1];
+ 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 ( first_skipped_proxy == none )
+ first_skipped_proxy = victim_slot.head - 1;
+ result = NULL;
+ goto retry;
+ }
+ }
+ __TBB_POISON_TASK_PTR(victim_pool[victim_slot.head - 1]);
+ }
+ if ( first_skipped_proxy != none ) {
+ if ( result ) {
+ victim_pool[victim_slot.head - 1] = victim_pool[first_skipped_proxy];
+ __TBB_POISON_TASK_PTR( victim_pool[first_skipped_proxy] );
+ __TBB_store_with_release( victim_slot.head, first_skipped_proxy + 1 );
+ }
+ else
+ __TBB_store_with_release( victim_slot.head, first_skipped_proxy );
+ }
+ unlock_task_pool( &victim_slot, victim_pool );
+ return result;
+}
+
+inline void generic_scheduler::do_enter_arena() {
+ my_arena_slot = &my_arena->slot[arena_index];
+ __TBB_ASSERT ( my_arena_slot->head == my_arena_slot->tail, "task deque of a free slot must be empty" );
+ __TBB_ASSERT ( dummy_slot.head < dummy_slot.tail, "entering arena without tasks to share" );
+ my_arena_slot->head = dummy_slot.head;
+ my_arena_slot->tail = dummy_slot.tail;
+ // 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, dummy_slot.task_pool );
+ // We'll leave arena only when it's empty, so clean up local instances of indices.
+ dummy_slot.head = dummy_slot.tail = 0;
+}
+
+void generic_scheduler::enter_arena() {
+ __TBB_ASSERT ( my_arena, "no arena: initialization not completed?" );
+#if __TBB_ARENA_PER_MASTER
+ __TBB_ASSERT ( !in_arena(), "thread is already in arena?" );
+ __TBB_ASSERT ( arena_index < my_arena->my_num_slots, "arena slot index is out-of-bound" );
+#else /* !__TBB_ARENA_PER_MASTER */
+ __TBB_ASSERT ( is_worker(), "only workers should use enter_arena()" );
+ __TBB_ASSERT ( !in_arena(), "worker already in arena?" );
+ __TBB_ASSERT ( arena_index < my_arena->prefix().number_of_workers, "invalid worker arena slot index" );
+#endif /* !__TBB_ARENA_PER_MASTER */
+ __TBB_ASSERT ( my_arena->slot[arena_index].task_pool == EmptyTaskPool, "someone else grabbed my arena slot?" );
+ do_enter_arena();
+}
+
+#if !__TBB_ARENA_PER_MASTER
+void generic_scheduler::try_enter_arena() {
+ __TBB_ASSERT ( !is_worker(), "only masters should use try_enter_arena()" );
+ __TBB_ASSERT ( my_arena, "no arena: initialization not completed?" );
+ __TBB_ASSERT ( !in_arena(), "master already in arena?" );
+ __TBB_ASSERT ( arena_index >= my_arena->prefix().number_of_workers &&
+ arena_index < my_arena->prefix().number_of_slots, "invalid arena slot hint value" );
+
+ size_t h = arena_index;
+ // We do not lock task pool upon successful entering arena
+ if( my_arena->slot[h].task_pool != EmptyTaskPool ||
+ __TBB_CompareAndSwapW( &my_arena->slot[h].task_pool, (intptr_t)LockedTaskPool,
+ (intptr_t)EmptyTaskPool ) != (intptr_t)EmptyTaskPool )
+ {
+ // Hinted arena slot is already busy, try some of the others at random
+ unsigned first = my_arena->prefix().number_of_workers,
+ last = my_arena->prefix().number_of_slots;
+ unsigned n = last - first - 1;
+ /// \todo Is this limit reasonable?
+ size_t max_attempts = last - first;
+ for (;;) {
+ size_t k = first + random.get() % n;
+ if( k >= h )
+ ++k; // Adjusts random distribution to exclude previously tried slot
+ h = k;
+ if( my_arena->slot[h].task_pool == EmptyTaskPool &&
+ __TBB_CompareAndSwapW( &my_arena->slot[h].task_pool, (intptr_t)LockedTaskPool,
+ (intptr_t)EmptyTaskPool ) == (intptr_t)EmptyTaskPool )
+ {
+ break;
+ }
+ if ( --max_attempts == 0 ) {
+ // After so many attempts we are still unable to find a vacant arena slot.
+ // Cease the vain effort and work outside of arena for a while.
+ return;
+ }
+ }
+ }
+ // Successfully claimed a slot in the arena.
+ ITT_NOTIFY(sync_acquired, &my_arena->slot[h]);
+ __TBB_ASSERT ( my_arena->slot[h].task_pool == LockedTaskPool, "arena slot is not actually acquired" );
+ arena_index = h;
+ do_enter_arena();
+ attach_mailbox( affinity_id(h+1) );
+}
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+void generic_scheduler::leave_arena() {
+ __TBB_ASSERT( in_arena(), "Not in arena" );
+ // Do not reset arena_index. It will be used to (attempt to) re-acquire the slot next time
+ __TBB_ASSERT( &my_arena->slot[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->head == my_arena_slot->tail, "Cannot leave arena when the task pool is not empty" );
+#if !__TBB_ARENA_PER_MASTER
+ if ( !is_worker() ) {
+ my_affinity_id = 0;
+ inbox.detach();
+ }
+#endif /* !__TBB_ARENA_PER_MASTER */
+ ITT_NOTIFY(sync_releasing, &my_arena->slot[arena_index]);
+ __TBB_store_with_release( my_arena_slot->task_pool, EmptyTaskPool );
+ my_arena_slot = &dummy_slot;
+}
+
+#if __TBB_ARENA_PER_MASTER
+generic_scheduler* generic_scheduler::create_worker( market& m, size_t index ) {
+ generic_scheduler* s = allocate_scheduler( NULL, index );
+#if __TBB_TASK_GROUP_CONTEXT
+ s->dummy_task->prefix().context = &dummy_context;
+ // Sync up the local cancellation state with the global one. No need for fence here.
+ s->local_cancel_count = global_cancel_count;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ s->my_market = &m;
+ s->init_stack_info();
+ return s;
+}
+
+#else /* !__TBB_ARENA_PER_MASTER */
+
+generic_scheduler* generic_scheduler::create_worker( arena& a, size_t index ) {
+ generic_scheduler* s = allocate_scheduler( &a, index );
+
+ // Put myself into the arena
+#if __TBB_TASK_GROUP_CONTEXT
+ s->dummy_task->prefix().context = &dummy_context;
+ // Sync up the local cancellation state with the global one. No need for fence here.
+ s->local_cancel_count = global_cancel_count;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ s->attach_mailbox( index+1 );
+ s->init_stack_info();
+
+ __TBB_store_with_release( a.prefix().worker_list[index].scheduler, s );
+ return s;
+}
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+generic_scheduler* generic_scheduler::create_master( arena& a ) {
+ generic_scheduler* s = allocate_scheduler( &a,
+#if __TBB_ARENA_PER_MASTER
+ 0 // Master thread always occupies the first slot
+#else /* !__TBB_ARENA_PER_MASTER */
+ null_arena_index // Master thread will have to search for a vacant slot
+#endif /* !__TBB_ARENA_PER_MASTER */
+ );
+ task& t = *s->dummy_task;
+ s->innermost_running_task = &t;
+ t.prefix().ref_count = 1;
+ governor::sign_on(s);
+ __TBB_ASSERT( &task::self()==&t, "governor::sign_on failed?" );
+#if __TBB_ARENA_PER_MASTER
+#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
+ // for task objects since the free list is empty at the moment.
+ t.prefix().context = a.my_master_default_ctx =
+ new ( NFS_Allocate(sizeof(task_group_context), 1, NULL) ) task_group_context(task_group_context::isolated);
+#endif
+ s->my_market = a.my_market;
+ __TBB_ASSERT( s->arena_index == 0, "Master thread must occupy the first slot in its arena" );
+ s->attach_mailbox(1);
+ a.slot[0].my_scheduler = s;
+#if _WIN32|_WIN64
+ __TBB_ASSERT( s->my_market, NULL );
+ s->my_market->register_master( s->master_exec_resource );
+#endif /* _WIN32|_WIN64 */
+#else /* !__TBB_ARENA_PER_MASTER */
+#if _WIN32|_WIN64
+ s->register_master();
+#endif
+#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
+ // for task objects since the free list is empty at the moment.
+ t.prefix().context = new ( NFS_Allocate(sizeof(task_group_context), 1, NULL) ) task_group_context(task_group_context::isolated);
+ scheduler_list_node_t &node = s->my_node;
+ {
+ mutex::scoped_lock lock(the_scheduler_list_mutex);
+ node.my_next = the_scheduler_list_head.my_next;
+ node.my_prev = &the_scheduler_list_head;
+ the_scheduler_list_head.my_next->my_prev = &node;
+ the_scheduler_list_head.my_next = &node;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ unsigned last = a.prefix().number_of_slots,
+ cur_limit = a.prefix().limit;
+ // This slot index assignment is just a hint to ...
+ if ( cur_limit < last ) {
+ // ... to prevent competition between the first few masters.
+ s->arena_index = cur_limit++;
+ // In the absence of exception handling this code is a subject to data
+ // race in case of multiple masters concurrently entering empty arena.
+ // But it does not affect correctness, and can only result in a few
+ // masters competing for the same arena slot during the first acquisition.
+ // The cost of competition is low in comparison to that of oversubscription.
+ a.prefix().limit = cur_limit;
+ }
+ else {
+ // ... to minimize the probability of competition between multiple masters.
+ unsigned first = a.prefix().number_of_workers;
+ s->arena_index = first + s->random.get() % (last - first);
+ }
+#if __TBB_TASK_GROUP_CONTEXT
+ }
+#endif
+#endif /* !__TBB_ARENA_PER_MASTER */
+ s->init_stack_info();
+#if __TBB_TASK_GROUP_CONTEXT
+ // Sync up the local cancellation state with the global one. No need for fence here.
+ s->local_cancel_count = global_cancel_count;
+#endif
+#if __TBB_SCHEDULER_OBSERVER
+ // Process any existing observers.
+ s->notify_entry_observers();
+#endif /* __TBB_SCHEDULER_OBSERVER */
+ return s;
+}
+
+void generic_scheduler::cleanup_worker( void* arg, bool is_worker ) {
+ generic_scheduler& s = *(generic_scheduler*)arg;
+ __TBB_ASSERT( s.dummy_slot.task_pool, "cleaning up worker with missing task pool" );
+// APM TODO: Decide how observers should react to each entry/leave to/from arena
+#if __TBB_SCHEDULER_OBSERVER
+ s.notify_exit_observers( is_worker );
+#endif /* __TBB_SCHEDULER_OBSERVER */
+ // When comparing "head" and "tail" indices ">=" is used because this worker's
+ // task pool may still be published in the arena, and thieves can optimistically
+ // bump "head" (and then roll back).
+ __TBB_ASSERT( s.my_arena_slot->task_pool == EmptyTaskPool || s.my_arena_slot->head >= s.my_arena_slot->tail,
+ "worker has unfinished work at run down" );
+ s.free_scheduler();
+}
+
+void generic_scheduler::cleanup_master() {
+ generic_scheduler& s = *this; // for similarity with cleanup_worker
+ __TBB_ASSERT( s.dummy_slot.task_pool, "cleaning up master with missing task pool" );
+#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.dummy_task, NULL );
+ __TBB_ASSERT ( governor::is_set(this), "Other thread reused our TLS key during the task pool cleanup" );
+ }
+#if __TBB_ARENA_PER_MASTER
+#if _WIN32|_WIN64
+ __TBB_ASSERT( s.my_market, NULL );
+ s.my_market->unregister_master( s.master_exec_resource );
+#endif /* _WIN32|_WIN64 */
+ arena* a = s.my_arena;
+#else /* !__TBB_ARENA_PER_MASTER */
+#if _WIN32|_WIN64
+ s.unregister_master();
+#endif /* _WIN32|_WIN64 */
+#endif /* __TBB_ARENA_PER_MASTER */
+ s.free_scheduler();
+#if __TBB_ARENA_PER_MASTER
+ a->slot[0].my_scheduler = NULL;
+ // Do not close arena if some fire-and-forget tasks remain; workers should care of it.
+ if( a->my_task_stream.empty() && a->pool_state.fetch_and_store(arena::SNAPSHOT_EMPTY)!=arena::SNAPSHOT_EMPTY )
+ a->my_market->adjust_demand( *a, -(int)a->my_max_num_workers );
+ if ( --a->my_num_threads_active==0 && a->pool_state==arena::SNAPSHOT_EMPTY )
+ a->close_arena();
+#else /* !__TBB_ARENA_PER_MASTER */
+ governor::finish_with_arena();
+#endif /* !__TBB_ARENA_PER_MASTER */
+}
+
+#if __TBB_SCHEDULER_OBSERVER
+ void generic_scheduler::notify_entry_observers() {
+ local_last_observer_proxy = observer_proxy::process_list(local_last_observer_proxy,is_worker(),/*is_entry=*/true);
+ }
+
+ void generic_scheduler::notify_exit_observers( bool is_worker ) {
+ observer_proxy::process_list(local_last_observer_proxy,is_worker,/*is_entry=*/false);
+ }
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+} // namespace internal
+} // namespace tbb
+
diff --git a/src/tbb/scheduler.h b/src/tbb/scheduler.h
new file mode 100644
index 0000000..db84ed4
--- /dev/null
+++ b/src/tbb/scheduler.h
@@ -0,0 +1,552 @@
+/*
+ Copyright 2005-2010 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_scheduler_H
+#define _TBB_scheduler_H
+
+#include "scheduler_common.h"
+#include "arena.h"
+#include "mailbox.h"
+#include "tbb_misc.h" // for FastRandom
+
+#if __TBB_TASK_GROUP_CONTEXT
+#include "tbb/spin_mutex.h"
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#ifndef STATISTICS
+#define STATISTICS 0
+#endif /* STATISTICS */
+
+#if STATISTICS
+#define GATHER_STATISTIC(x) (x)
+#else
+#define GATHER_STATISTIC(x) ((void)0)
+#endif /* STATISTICS */
+
+namespace tbb {
+namespace internal {
+
+template<typename SchedulerTraits> class custom_scheduler;
+
+//------------------------------------------------------------------------
+// generic_scheduler
+//------------------------------------------------------------------------
+
+#if __TBB_TASK_GROUP_CONTEXT
+struct scheduler_list_node_t {
+ scheduler_list_node_t *my_prev,
+ *my_next;
+};
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#define EmptyTaskPool ((task**)0)
+#define LockedTaskPool ((task**)~(intptr_t)0)
+
+class governor;
+
+#if __TBB_SCHEDULER_OBSERVER
+class task_scheduler_observer_v3;
+class observer_proxy;
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#if __TBB_ARENA_PER_MASTER
+class market;
+#endif
+
+//! Cilk-style task scheduler.
+/** None of the fields here are every 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,
+ except for tweaks specific to processors and tools (e.g. VTune).
+ The derived template class custom_scheduler<SchedulerTraits> fills in the tweaks. */
+class generic_scheduler: public scheduler, public ::rml::job {
+ friend class tbb::task;
+#if __TBB_ARENA_PER_MASTER
+ friend class market;
+#else
+ friend class UnpaddedArenaPrefix;
+#endif /* !__TBB_ARENA_PER_MASTER */
+ friend class arena;
+ friend class allocate_root_proxy;
+ friend class governor;
+#if __TBB_TASK_GROUP_CONTEXT
+ friend class allocate_root_with_context_proxy;
+ friend class tbb::task_group_context;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+#if __TBB_SCHEDULER_OBSERVER
+ friend class task_scheduler_observer_v3;
+#endif /* __TBB_SCHEDULER_OBSERVER */
+ friend class scheduler;
+ template<typename SchedulerTraits> friend class custom_scheduler;
+
+ //! If sizeof(task) is <=quick_task_size, it is handled on a free list instead of malloc'd.
+ static const size_t quick_task_size = 256-task_prefix_reservation_size;
+
+ static bool is_version_3_task( task& t ) {
+ return (t.prefix().extra_state & 0x0F)>=0x1;
+ }
+
+ //! Position in the call stack specifying its maximal filling when stealing is still allowed
+ uintptr_t my_stealing_threshold;
+#if __TBB_ipf
+ //! Position in the RSE backup area specifying its maximal filling when stealing is still allowed
+ uintptr_t my_rsb_stealing_threshold;
+#endif
+
+ static const size_t null_arena_index = ~size_t(0);
+
+ //! Index of the arena slot the scheduler occupies now, or occupied last time.
+ size_t arena_index;
+
+ //! Capacity of ready tasks deque (number of elements - pointers to task).
+ size_t task_pool_size;
+
+ //! Pointer to the slot in the arena we own at the moment.
+ /** When out of arena it points to this scheduler's dummy_slot. **/
+ mutable arena_slot* my_arena_slot;
+
+ bool in_arena () const { return my_arena_slot != &dummy_slot; }
+
+ bool local_task_pool_empty () {
+ return my_arena_slot->task_pool == EmptyTaskPool || my_arena_slot->head >= my_arena_slot->tail;
+ }
+
+#if __TBB_ARENA_PER_MASTER
+ //! The market I am in
+ market* my_market;
+
+ //! The arena that I own (if master) or am servicing at the moment (if worker)
+ arena* my_arena;
+#else /* !__TBB_ARENA_PER_MASTER */
+ //! The arena that I own (if master) or am servicing at the moment (if worker)
+ arena* const my_arena;
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Random number generator used for picking a random victim from which to steal.
+ FastRandom random;
+
+ //! Free list of small tasks that can be reused.
+ task* free_list;
+
+ //! Innermost task whose task::execute() is running.
+ task* innermost_running_task;
+
+ //! Fake root task created by slave threads.
+ /** The task is used as the "parent" argument to method wait_for_all. */
+ task* dummy_task;
+
+ //! Reference count for scheduler
+ /** Number of task_scheduler_init objects that point to this scheduler */
+ long ref_count;
+
+ mail_inbox inbox;
+
+ void attach_mailbox( affinity_id id ) {
+ __TBB_ASSERT(id>0,NULL);
+ inbox.attach( my_arena->mailbox(id) );
+ my_affinity_id = id;
+ }
+
+ //! The mailbox id assigned to this scheduler.
+ /** The id is assigned upon first entry into the arena.
+ TODO: how are id's being garbage collected?
+ TODO: master thread may enter arena and leave and then reenter.
+ We want to give it the same affinity_id upon reentry, if practical.
+ */
+ affinity_id my_affinity_id;
+
+ /* A couple of bools can be located here because space is otherwise just padding after my_affinity_id. */
+
+ //! True if this is assigned to thread local storage by registering with governor.
+ bool is_registered;
+
+ //! True if *this was created by automatic TBB initialization
+ bool is_auto_initialized;
+
+#if __TBB_SCHEDULER_OBSERVER
+ //! Last observer_proxy processed by this scheduler
+ observer_proxy* local_last_observer_proxy;
+
+ //! Notify any entry observers that have been created since the last call by this thread.
+ void notify_entry_observers();
+
+ //! Notify all exit observers that this thread is no longer participating in task scheduling.
+ void notify_exit_observers( bool is_worker );
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#if __TBB_COUNT_TASK_NODES
+ //! Net number of big task objects that have been allocated but not yet freed.
+ intptr_t task_node_count;
+#endif /* __TBB_COUNT_TASK_NODES */
+
+#if STATISTICS
+ long current_active;
+ long current_length;
+ //! Number of big tasks that have been malloc'd.
+ /** To find total number of tasks malloc'd, compute (current_big_malloc+small_task_count) */
+ long current_big_malloc;
+ long execute_count;
+ //! Number of tasks stolen
+ long steal_count;
+ //! Number of tasks received from mailbox
+ long mail_received_count;
+ long proxy_execute_count;
+ long proxy_steal_count;
+ long proxy_bypass_count;
+#endif /* STATISTICS */
+
+ //! Sets up the data necessary for the stealing limiting heuristics
+ void init_stack_info ();
+
+ //! Returns true if stealing is allowed
+ bool can_steal () {
+ int anchor;
+#if __TBB_ipf
+ return my_stealing_threshold < (uintptr_t)&anchor && (uintptr_t)__TBB_get_bsp() < my_rsb_stealing_threshold;
+#else
+ return my_stealing_threshold < (uintptr_t)&anchor;
+#endif
+ }
+
+ //! Actions common to enter_arena and try_enter_arena
+ void do_enter_arena();
+
+ //! Used by workers to enter the arena
+ /** Does not lock the task pool in case if arena slot has been successfully grabbed. **/
+ void enter_arena();
+
+#if !__TBB_ARENA_PER_MASTER
+ //! Used by masters to try to enter the arena
+ /** Does not lock the task pool in case if arena slot has been successfully grabbed. **/
+ void try_enter_arena();
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Leave the arena
+ void leave_arena();
+
+ //! Locks victim's task pool, and returns pointer to it. The pointer can be NULL.
+ task** lock_task_pool( arena_slot* victim_arena_slot ) const;
+
+ //! Unlocks victim's task pool
+ void unlock_task_pool( arena_slot* victim_arena_slot, task** victim_task_pool ) const;
+
+
+ //! Locks the local task pool
+ void acquire_task_pool() const;
+
+ //! Unlocks the local task pool
+ void release_task_pool() const;
+
+ //! Checks if t is affinitized to another thread, and if so, bundles it as proxy.
+ /** Returns either t or proxy containing t. **/
+ task* prepare_for_spawning( task* t );
+
+ //! 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.
+ In the latter case compacts the pool. **/
+ 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. */
+ task* get_mailbox_task();
+
+ //! True if t is a task_proxy
+ static bool is_proxy( const task& t ) {
+ 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 );
+
+#if __TBB_ARENA_PER_MASTER
+ //! 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. **/
+ task* dequeue_task();
+
+#endif /* __TBB_ARENA_PER_MASTER */
+ //! Steal task from another scheduler's ready pool.
+ task* steal_task( arena_slot& victim_arena_slot );
+
+ /** Initial size of the task deque sufficient to serve without reallocation
+ 4 nested parallel_for calls with iteration space of 65535 grains each. **/
+ static const size_t min_task_pool_size = 64;
+
+ //! Allocate task pool containing at least n elements.
+ task** allocate_task_pool( size_t n );
+
+ //! Deallocate task pool that was allocated by means of allocate_task_pool.
+ static void free_task_pool( task** pool ) {
+ __TBB_ASSERT( pool, "attempt to free NULL TaskPool" );
+ NFS_Free( pool );
+ }
+
+ //! Grow ready task deque to at least n elements.
+ void grow_task_pool( size_t n );
+
+ //! Initialize a scheduler for a master thread.
+ static generic_scheduler* create_master( arena& a );
+
+ //! Perform necessary cleanup when a master thread stops using TBB.
+ void cleanup_master();
+
+ //! Initialize a scheduler for a worker thread.
+#if __TBB_ARENA_PER_MASTER
+ static generic_scheduler* create_worker( market& m, size_t index );
+#else /* !__TBB_ARENA_PER_MASTER */
+ static generic_scheduler* create_worker( arena& a, size_t index );
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Perform necessary cleanup when a worker thread finishes.
+ static void cleanup_worker( void* arg, bool is_worker );
+
+protected:
+ generic_scheduler( arena*, size_t index );
+
+#if TBB_USE_ASSERT
+ //! Check that internal data structures are in consistent state.
+ /** Raises __TBB_ASSERT failure if inconsistency is found. */
+ bool assert_okay() const;
+#endif /* TBB_USE_ASSERT */
+
+public:
+ /*override*/
+ void spawn( task& first, task*& next );
+
+ /*override*/
+ void spawn_root_and_wait( task& first, task*& next );
+
+#if __TBB_ARENA_PER_MASTER
+ /*override*/
+ void enqueue( task& task_, void* reserved );
+
+ void local_enqueue( task& task_ );
+#endif /* __TBB_ARENA_PER_MASTER */
+
+ void local_spawn( task& first, task*& next );
+ void local_spawn_root_and_wait( task& first, task*& next );
+ virtual void local_wait_for_all( task& parent, task* child ) = 0;
+
+ //! Destroy and deallocate this scheduler object
+ void free_scheduler();
+
+ //! Allocate task object, either from the heap or a free list.
+ /** Returns uninitialized task object with initialized prefix. */
+ task& allocate_task( size_t number_of_bytes,
+ __TBB_CONTEXT_ARG(task* parent, task_group_context* context) );
+
+ //! Put task on free list.
+ /** Does not call destructor. */
+ template<free_task_hint h>
+ void free_task( task& t );
+
+ void 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.
+ void deallocate_task( task& t ) {
+#if TBB_USE_ASSERT
+ task_prefix& p = t.prefix();
+ p.state = 0xFF;
+ p.extra_state = 0xFF;
+ poison_pointer(p.next);
+#endif /* TBB_USE_ASSERT */
+ NFS_Free((char*)&t-task_prefix_reservation_size);
+#if __TBB_COUNT_TASK_NODES
+ --task_node_count;
+#endif /* __TBB_COUNT_TASK_NODES */
+ }
+
+ //! True if running on a worker thread, false otherwise.
+ bool is_worker() {
+#if __TBB_ARENA_PER_MASTER
+ return arena_index != 0;
+#else /* !__TBB_ARENA_PER_MASTER */
+ return arena_index < my_arena->prefix().number_of_workers;
+#endif /* !__TBB_ARENA_PER_MASTER */
+ }
+
+#if __TBB_ARENA_PER_MASTER
+ //! Returns number of worker threads in the arena this thread belongs to.
+ unsigned number_of_workers_in_my_arena() {
+ return my_arena->my_max_num_workers;
+ }
+#endif /* __TBB_ARENA_PER_MASTER */
+
+#if __TBB_COUNT_TASK_NODES
+ intptr_t get_task_node_count( bool count_arena_workers = false ) {
+ return task_node_count + (count_arena_workers? my_arena->workers_task_node_count(): 0);
+ }
+#endif /* __TBB_COUNT_TASK_NODES */
+
+ //! Special value used to mark return_list as not taking any more entries.
+ static task* plugged_return_list() {return (task*)(intptr_t)(-1);}
+
+ //! Number of small tasks that have been allocated by this scheduler.
+ intptr_t small_task_count;
+
+ //! List of small tasks that have been returned to this scheduler by other schedulers.
+ task* 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;
+
+ //! Free a small task t that that was allocated by a different scheduler
+ void free_nonlocal_small_task( task& t );
+
+#if __TBB_TASK_GROUP_CONTEXT
+ //! Padding isolating thread local members from members that can be written to by other threads.
+ char _padding1[NFS_MaxLineSize - sizeof(context_list_node_t)];
+
+ //! Head of the thread specific list of task group contexts.
+ context_list_node_t context_list_head;
+
+ //! Mutex protecting access to the list of task group contexts.
+ spin_mutex context_list_mutex;
+
+#if !__TBB_ARENA_PER_MASTER
+ //! Used to form the list of master thread schedulers.
+ scheduler_list_node_t my_node;
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Thread local cancellation epoch.
+ /** When local epoch equals the global one, the cancellation state known
+ to this thread is synchronized with the global cancellation state. **/
+ uintptr_t local_cancel_count;
+
+ //! Flag indicating that a context is being destructed by its owner thread
+ /** Together with nonlocal_ctx_list_update constitue a synchronization protocol
+ that keeps hot path of context destruction (by the owner thread) mostly
+ lock-free. **/
+ uintptr_t local_ctx_list_update;
+
+ //! Detaches abandoned contexts
+ /** These contexts must be destroyed by other threads. **/
+ void cleanup_local_context_list ();
+
+#if !__TBB_ARENA_PER_MASTER
+ //! Propagates cancellation request to all descendants of the context.
+ void propagate_cancellation ( task_group_context& ctx );
+#endif /* !__TBB_ARENA_PER_MASTER */
+
+ //! Propagates cancellation request to contexts registered by this scheduler.
+ void propagate_cancellation ();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#if _WIN32||_WIN64
+private:
+ //! Handle returned by RML when registering a master with RML
+ ::rml::server::execution_resource_t master_exec_resource;
+
+#if !__TBB_ARENA_PER_MASTER
+ //! register master with the resource manager
+ void register_master() {
+ __TBB_ASSERT( my_arena->prefix().server, "RML server not defined?" );
+ // the server may ignore registration and set master_exec_resource to NULL.
+ my_arena->prefix().server->register_master( master_exec_resource );
+ }
+
+ //! unregister master with the resource manager
+ void unregister_master() const {
+ my_arena->prefix().server->unregister_master( master_exec_resource );
+ }
+#endif /* !__TBB_ARENA_PER_MASTER && ( _WIN32||_WIN64 ) */
+#endif /* _WIN32||_WIN64 */
+
+ //! Dummy slot used when scheduler is not in arena
+ /** The data structure is heavily padded, therefore it should be placed after
+ other data fields used by the owner thread only to allow compiler using
+ instructions with short offsets when accessing the majority of data members. **/
+ arena_slot dummy_slot;
+
+#if __TBB_TASK_GROUP_CONTEXT
+ //! Flag indicating that a context is being destructed by non-owner thread.
+ /** See also local_ctx_list_update. **/
+ uintptr_t nonlocal_ctx_list_update;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+}; // class generic_scheduler
+
+
+template<free_task_hint h>
+void generic_scheduler::free_task( task& t ) {
+ GATHER_STATISTIC(current_active-=1);
+ task_prefix& p = t.prefix();
+ // 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_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 ) {
+ GATHER_STATISTIC(current_length+=1);
+ p.next = free_list;
+ free_list = &t;
+ } else if( !(h&local_task) && p.origin ) {
+ free_nonlocal_small_task(t);
+ } else {
+ deallocate_task(t);
+ }
+}
+
+} // namespace internal
+} // namespace tbb
+
+#include "governor.h"
+
+inline void tbb::internal::generic_scheduler::spawn( task& first, task*& next ) {
+ governor::local_scheduler()->local_spawn( first, next );
+}
+
+inline void tbb::internal::generic_scheduler::spawn_root_and_wait( task& first, task*& next ) {
+ governor::local_scheduler()->local_spawn_root_and_wait( first, next );
+}
+
+#if __TBB_ARENA_PER_MASTER
+inline void tbb::internal::generic_scheduler::enqueue( task& task_, void* /*reserved*/ ) {
+ governor::local_scheduler()->local_enqueue( task_ );
+}
+
+#endif /* __TBB_ARENA_PER_MASTER */
+#endif /* _TBB_scheduler_H */
diff --git a/src/tbb/scheduler_common.h b/src/tbb/scheduler_common.h
new file mode 100644
index 0000000..6d08ddc
--- /dev/null
+++ b/src/tbb/scheduler_common.h
@@ -0,0 +1,165 @@
+/*
+ Copyright 2005-2010 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_scheduler_common_H
+#define _TBB_scheduler_common_H
+
+#include "tbb/tbb_stddef.h"
+
+#if __SUNPRO_CC
+#include <string.h> // for memset, memcpy, memmove
+#endif
+
+/* Temporarily change "private" to "public" while including "tbb/task.h".
+ This hack allows us to avoid publishing internal types and methods
+ in the public header files just for sake of friend declarations. */
+#define private public
+#include "tbb/task.h"
+#include "tbb/tbb_exception.h"
+#undef private
+
+// 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
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+ #define __TBB_CONTEXT_ARG(arg1, context) arg1
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
+
+#if DO_TBB_TRACE
+#include <cstdio>
+#define TBB_TRACE(x) ((void)std::printf x)
+#else
+#define TBB_TRACE(x) ((void)(0))
+#endif /* DO_TBB_TRACE */
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ // Workaround for overzealous compiler warnings
+ // 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
+
+namespace tbb {
+namespace internal {
+
+/** Defined in scheduler.cpp **/
+extern uintptr_t global_cancel_count;
+
+//! Alignment for a task object
+const size_t task_alignment = 16;
+
+//! Number of bytes reserved for a task prefix
+/** If not exactly sizeof(task_prefix), the extra bytes *precede* the task_prefix. */
+const size_t task_prefix_reservation_size = ((sizeof(internal::task_prefix)-1)/task_alignment+1)*task_alignment;
+
+//! Definitions for bits in task_prefix::extra_state
+enum task_extra_state {
+ //! Tag for v1 tasks (i.e. tasks in TBB 1.0 and 2.0)
+ es_version_1_task = 0,
+ //! Tag for v3 tasks (i.e. tasks in TBB 2.1-2.2)
+ es_version_3_task = 1,
+ //! Tag for v3 task_proxy.
+ es_task_proxy = 0x20,
+ //! Set if ref_count might be changed by another thread. Used for debugging.
+ es_ref_count_active = 0x40,
+ //! Set if the task has been stolen
+ es_task_is_stolen = 0x80
+};
+
+//! Optimization hint to free_task that enables it omit unnecessary tests and code.
+enum free_task_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.
+ /** Task should be returned to free list of this scheduler. */
+ small_local_task=3
+};
+
+//------------------------------------------------------------------------
+// Helpers
+//------------------------------------------------------------------------
+
+#if TBB_USE_ASSERT
+/** Logically, this method should be a member of class task.
+ But we do not want to publish it, so it is here instead. */
+inline bool AssertOkay( const task& task ) {
+ __TBB_ASSERT( &task!=NULL, NULL );
+ __TBB_ASSERT( (uintptr_t)&task % task_alignment == 0, "misaligned task" );
+ __TBB_ASSERT( (unsigned)task.state()<=(unsigned)task::recycle, "corrupt task (invalid state)" );
+ return true;
+}
+#endif /* TBB_USE_ASSERT */
+
+inline bool ConcurrentWaitsEnabled ( task& t ) {
+ return (t.prefix().context->my_version_and_traits & task_group_context::concurrent_wait) != 0;
+}
+
+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
+ // TbbCapturedException expression when exact propagation is enabled for the context.
+ #define TbbCurrentException(context, TbbCapturedException) \
+ context->my_version_and_traits & task_group_context::exact_exception \
+ ? tbb_exception_ptr::allocate() \
+ : tbb_exception_ptr::allocate( *(TbbCapturedException) );
+#endif /* !TBB_USE_CAPTURED_EXCEPTION */
+
+#define TbbRegisterCurrentException(context, TbbCapturedException) \
+ if ( context->cancel_group_execution() ) { \
+ /* We are the first to signal cancellation, so store the exception that caused it. */ \
+ context->my_exception = TbbCurrentException( context, TbbCapturedException ); \
+ }
+
+#define TbbCatchAll(context) \
+ catch ( tbb_exception& exc ) { \
+ TbbRegisterCurrentException( context, &exc ); \
+ } catch ( std::exception& exc ) { \
+ TbbRegisterCurrentException( context, captured_exception::allocate(typeid(exc).name(), exc.what()) ); \
+ } catch ( ... ) { \
+ TbbRegisterCurrentException( context, captured_exception::allocate("...", "Unidentified exception") );\
+ }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* _TBB_scheduler_common_H */
diff --git a/src/tbb/scheduler_utility.h b/src/tbb/scheduler_utility.h
new file mode 100644
index 0000000..3a8b409
--- /dev/null
+++ b/src/tbb/scheduler_utility.h
@@ -0,0 +1,198 @@
+/*
+ Copyright 2005-2010 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_scheduler_utility_H
+#define _TBB_scheduler_utility_H
+
+#include "scheduler.h"
+
+namespace tbb {
+namespace internal {
+
+//------------------------------------------------------------------------
+// auto_empty_task
+//------------------------------------------------------------------------
+
+//! Smart holder for the empty task class with automatic destruction
+class auto_empty_task {
+ task* my_task;
+ generic_scheduler* my_scheduler;
+public:
+ auto_empty_task ( __TBB_CONTEXT_ARG(generic_scheduler *s, task_group_context* context) )
+ : my_task( new(&s->allocate_task(sizeof(empty_task), __TBB_CONTEXT_ARG(NULL, context))) empty_task )
+ , my_scheduler(s)
+ {}
+ // empty_task has trivial destructor, so there's no need to call it.
+ ~auto_empty_task () { my_scheduler->free_task<small_local_task>(*my_task); }
+
+ operator task& () { return *my_task; }
+ task* operator & () { return my_task; }
+ task_prefix& prefix () { return my_task->prefix(); }
+}; // class auto_empty_task
+
+
+//------------------------------------------------------------------------
+// Debugging support
+//------------------------------------------------------------------------
+
+#define __TBB_POISON_DEQUE TBB_USE_ASSERT
+
+#if __TBB_POISON_DEQUE
+ #if __TBB_x86_64 || __TBB_ipf
+ static task* const poisoned_taskptr = (task*)0xDDEEAADDDEADBEEF;
+ #else
+ static task* const poisoned_taskptr = (task*)0xDEADBEEF;
+ #endif
+
+ #define __TBB_POISON_TASK_PTR(ptr) ptr = poisoned_taskptr
+ #define __TBB_ASSERT_VALID_TASK_PTR(ptr) __TBB_ASSERT( ptr != poisoned_taskptr, "task pointer in the deque is poisoned" )
+#else /* !__TBB_POISON_DEQUE */
+ #define __TBB_POISON_TASK_PTR(ptr) ((void)0)
+ #define __TBB_ASSERT_VALID_TASK_PTR(ptr) ((void)0)
+#endif /* !__TBB_POISON_DEQUE */
+
+//------------------------------------------------------------------------
+// fast_reverse_vector
+//------------------------------------------------------------------------
+
+//! Vector that grows without reallocations, and stores items in the reverse order.
+/** Requires to initialize its first segment with a preallocated memory chunk
+ (usually it is static array or an array allocated on the stack).
+ The second template parameter specifies maximal number of segments. Each next
+ segment is twice as large as the previous one. **/
+template<typename T, size_t max_segments = 16>
+class fast_reverse_vector
+{
+public:
+ fast_reverse_vector ( T* initial_segment, size_t segment_size )
+ : m_cur_segment(initial_segment)
+ , m_cur_segment_size(segment_size)
+ , m_pos(segment_size)
+ , m_num_segments(0)
+ , m_size(0)
+ {
+ __TBB_ASSERT ( initial_segment && segment_size, "Nonempty initial segment must be supplied");
+ }
+
+ ~fast_reverse_vector ()
+ {
+ for ( size_t i = 1; i < m_num_segments; ++i )
+ NFS_Free( m_segments[i] );
+ }
+
+ size_t size () const { return m_size + m_cur_segment_size - m_pos; }
+
+ void push_back ( const T& val )
+ {
+ if ( !m_pos ) {
+ m_segments[m_num_segments++] = m_cur_segment;
+ __TBB_ASSERT ( m_num_segments < max_segments, "Maximal capacity exceeded" );
+ m_size += m_cur_segment_size;
+ m_cur_segment_size *= 2;
+ m_pos = m_cur_segment_size;
+ m_cur_segment = (T*)NFS_Allocate( m_cur_segment_size * sizeof(T), 1, NULL );
+ }
+ m_cur_segment[--m_pos] = val;
+ }
+
+ //! Copies the contents of the vector into the dst array.
+ /** Can only be used when T is a POD type, as copying does not invoke copy constructors. **/
+ void copy_memory ( T* dst ) const
+ {
+ size_t size = m_cur_segment_size - m_pos;
+ memcpy( dst, m_cur_segment + m_pos, size * sizeof(T) );
+ dst += size;
+ size = m_cur_segment_size / 2;
+ for ( long i = (long)m_num_segments - 1; i >= 0; --i ) {
+ memcpy( dst, m_segments[i], size * sizeof(T) );
+ dst += size;
+ size /= 2;
+ }
+ }
+
+protected:
+ //! The current (not completely filled) segment
+ T *m_cur_segment;
+
+ //! Capacity of m_cur_segment
+ size_t m_cur_segment_size;
+
+ //! Insertion position in m_cur_segment
+ size_t m_pos;
+
+ //! Array of filled segments (has fixed size specified by the second template parameter)
+ T *m_segments[max_segments];
+
+ //! Number of filled segments (the size of m_segments)
+ size_t m_num_segments;
+
+ //! Number of items in the segments in m_segments
+ size_t m_size;
+
+}; // class fast_reverse_vector
+
+
+//------------------------------------------------------------------------
+// Statistics log
+//------------------------------------------------------------------------
+
+#if STATISTICS
+//! Class for collecting statistics
+/** There should be only one instance of this class.
+ Results are written to a file "statistics.txt" in tab-separated format. */
+class statistics {
+public:
+ statistics() {
+ my_file = fopen("statistics.txt","w");
+ if( !my_file ) {
+ perror("fopen(\"statistics.txt\"\")");
+ exit(1);
+ }
+ fprintf(my_file,"%13s\t%13s\t%13s\t%13s\t%13s\t%13s\n", "execute", "steal", "mail", "proxy_execute", "proxy_steal", "proxy_bypass" );
+ }
+ ~statistics() {
+ fclose(my_file);
+ }
+ void record( long execute_count, long steal_count, long mail_received_count,
+ long proxy_execute_count, long proxy_steal_count, long proxy_bypass_count ) {
+ mutex::scoped_lock lock(my_mutex);
+ fprintf (my_file,"%13ld\t%13ld\t%13ld\t%13ld\t%13ld\t%13ld\n", execute_count, steal_count, mail_received_count,
+ proxy_execute_count, proxy_steal_count, proxy_bypass_count );
+ }
+private:
+ //! File into which statistics are written.
+ FILE* my_file;
+ //! Mutex that serializes accesses to my_file
+ mutex my_mutex;
+}; // class statistics
+#endif /* STATISTICS */
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* _TBB_scheduler_utility_H */
diff --git a/src/tbb/task.cpp b/src/tbb/task.cpp
index 7be3b13..e10401a 100644
--- a/src/tbb/task.cpp
+++ b/src/tbb/task.cpp
@@ -26,3268 +26,53 @@
the GNU General Public License.
*/
-/* This file contains the TBB task scheduler. There are many classes
- lumped together here because very few are exposed to the outside
- world, and by putting them in a single translation unit, the
- compiler's optimizer might be able to do a better job. */
-
-#if USE_PTHREAD
-
- // Some pthreads documentation says that <pthread.h> must be first header.
- #include <pthread.h>
-
-#elif USE_WINTHREAD
-
- #include <windows.h>
- #include <malloc.h> /* Need _alloca from there */
-
-#else
-
- #error Must define USE_PTHREAD or USE_WINTHREAD
-
-#endif
-
-#include <cassert>
-#include <cstddef>
-#include <cstdlib>
-#include <cstring>
-#include <cstdio>
-#include <new>
-#include "tbb/tbb_stddef.h"
-
-/* Temporarily change "private" to "public" while including "tbb/task.h".
- This hack allows us to avoid publishing internal types and methods
- in the public header files just for sake of friend declarations. */
-#define private public
-#include "tbb/task.h"
-#if __TBB_EXCEPTIONS
-#include "tbb/tbb_exception.h"
-#endif /* __TBB_EXCEPTIONS */
-#undef private
-
-#include "tbb/task_scheduler_init.h"
-#include "tbb/cache_aligned_allocator.h"
-#include "tbb/tbb_machine.h"
-#include "tbb/mutex.h"
-#include "tbb/atomic.h"
-#if __TBB_SCHEDULER_OBSERVER
-#include "tbb/task_scheduler_observer.h"
-#include "tbb/spin_rw_mutex.h"
-#include "tbb/aligned_space.h"
-#endif /* __TBB_SCHEDULER_OBSERVER */
-#if __TBB_EXCEPTIONS
-#include "tbb/spin_mutex.h"
-#endif /* __TBB_EXCEPTIONS */
-
-#include "tbb/partitioner.h"
-
-#include "../rml/include/rml_tbb.h"
-
-namespace tbb {
- namespace internal {
- namespace rml {
- tbb_server* make_private_server( tbb_client& client );
- }
- }
-}
-
-#if DO_TBB_TRACE
-#include <cstdio>
-#define TBB_TRACE(x) ((void)std::printf x)
-#else
-#define TBB_TRACE(x) ((void)(0))
-#endif /* DO_TBB_TRACE */
-
-#if TBB_USE_ASSERT
-#define COUNT_TASK_NODES 1
-#endif /* TBB_USE_ASSERT */
-
-/* If nonzero, then gather statistics */
-#ifndef STATISTICS
-#define STATISTICS 0
-#endif /* STATISTICS */
-
-#if STATISTICS
-#define GATHER_STATISTIC(x) (x)
-#else
-#define GATHER_STATISTIC(x) ((void)0)
-#endif /* STATISTICS */
-
-#if __TBB_EXCEPTIONS
-// The standard offsetof macro does not work for us since its usage is restricted
-// by POD-types only. Using 0x1000 (not NULL) is necessary to appease GCC.
-#define __TBB_offsetof(class_name, member_name) \
- ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
-// Returns address of the object containing a member with the given name and address
-#define __TBB_get_object_addr(class_name, member_name, member_addr) \
- reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name))
-#endif /* __TBB_EXCEPTIONS */
-
-// 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_EXCEPTIONS
- #define __TBB_CONTEXT_ARG(arg1, context) arg1, context
-#else /* !__TBB_EXCEPTIONS */
- #define __TBB_CONTEXT_ARG(arg1, context) arg1
-#endif /* !__TBB_EXCEPTIONS */
-
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- // Workaround for overzealous compiler warnings
- // These particular warnings are so ubquitous that no attempt is made to narrow
- // the scope of the warnings.
- #pragma warning (disable: 4100 4127 4312 4244 4267 4706)
-#endif
-
-// internal headers
-#include "tbb_misc.h"
-#include "itt_notify.h"
-#include "tls.h"
-
-namespace tbb {
-
-using namespace std;
-
-#if DO_ITT_NOTIFY
- const tchar
- *SyncType_GlobalLock = _T("TbbGlobalLock"),
- *SyncType_Scheduler = _T("%Constant")
- ;
- const tchar
- *SyncObj_SchedulerInitialization = _T("TbbSchedulerInitialization"),
- *SyncObj_SchedulersList = _T("TbbSchedulersList"),
- *SyncObj_WorkerLifeCycleMgmt = _T("TBB Scheduler"),
- *SyncObj_TaskStealingLoop = _T("TBB Scheduler"),
- *SyncObj_WorkerTaskPool = _T("TBB Scheduler"),
- *SyncObj_MasterTaskPool = _T("TBB Scheduler"),
- *SyncObj_TaskPoolSpinning = _T("TBB Scheduler"),
- *SyncObj_Mailbox = _T("TBB Scheduler"),
- *SyncObj_TaskReturnList = _T("TBB Scheduler"),
- *SyncObj_ContextsList = _T("TBB Scheduler")
- ;
-#endif /* DO_ITT_NOTIFY */
-
-namespace internal {
-
-const stack_size_type MByte = 1<<20;
-#if !defined(__TBB_WORDSIZE)
-const stack_size_type ThreadStackSize = 1*MByte;
-#elif __TBB_WORDSIZE<=4
-const stack_size_type ThreadStackSize = 2*MByte;
-#else
-const stack_size_type ThreadStackSize = 4*MByte;
-#endif
-
-//------------------------------------------------------------------------
-// General utility section
-//------------------------------------------------------------------------
-
-#define __TBB_POISON_DEQUE TBB_USE_ASSERT
-
-#if __TBB_POISON_DEQUE
- #if __ia64__
- task* const poisoned_taskptr = (task*)0xDDEEAADDDEADBEEF;
- #elif _WIN64
- task* const poisoned_taskptr = (task*)0xDDEEAADDDEADBEEF;
- #else
- task* const poisoned_taskptr = (task*)0xDEADBEEF;
- #endif
-
- #define __TBB_POISON_TASK_PTR(ptr) ptr = poisoned_taskptr
- #define __TBB_ASSERT_VALID_TASK_PTR(ptr) __TBB_ASSERT( ptr != poisoned_taskptr, "task pointer in the deque is poisoned" )
-#else /* !__TBB_POISON_DEQUE */
- #define __TBB_POISON_TASK_PTR(ptr) ((void)0)
- #define __TBB_ASSERT_VALID_TASK_PTR(ptr) ((void)0)
-#endif /* !__TBB_POISON_DEQUE */
-
-
-//! Vector that grows without reallocations, and stores items in the reverse order.
-/** Requires to initialize its first segment with a preallocated memory chunk
- (usually it is static array or an array allocated on the stack).
- The second template parameter specifies maximal number of segments. Each next
- segment is twice as large as the previous one. **/
-template<typename T, size_t max_segments = 16>
-class fast_reverse_vector
-{
-public:
- fast_reverse_vector ( T* initial_segment, size_t segment_size )
- : m_cur_segment(initial_segment)
- , m_cur_segment_size(segment_size)
- , m_pos(segment_size)
- , m_num_segments(0)
- , m_size(0)
- {
- __TBB_ASSERT ( initial_segment && segment_size, "Nonempty initial segment must be supplied");
- }
-
- ~fast_reverse_vector ()
- {
- for ( size_t i = 1; i < m_num_segments; ++i )
- NFS_Free( m_segments[i] );
- }
-
- size_t size () const { return m_size + m_cur_segment_size - m_pos; }
-
- void push_back ( const T& val )
- {
- if ( !m_pos ) {
- m_segments[m_num_segments++] = m_cur_segment;
- __TBB_ASSERT ( m_num_segments < max_segments, "Maximal capacity exceeded" );
- m_size += m_cur_segment_size;
- m_cur_segment_size *= 2;
- m_pos = m_cur_segment_size;
- m_cur_segment = (T*)NFS_Allocate( m_cur_segment_size * sizeof(T), 1, NULL );
- }
- m_cur_segment[--m_pos] = val;
- }
-
- //! Copies the contents of the vector into the dst array.
- /** Can only be used when T is a POD type, as copying does not invoke copy constructors. **/
- void copy_memory ( T* dst ) const
- {
- size_t size = m_cur_segment_size - m_pos;
- memcpy( dst, m_cur_segment + m_pos, size * sizeof(T) );
- dst += size;
- size = m_cur_segment_size / 2;
- for ( long i = (long)m_num_segments - 1; i >= 0; --i ) {
- memcpy( dst, m_segments[i], size * sizeof(T) );
- dst += size;
- size /= 2;
- }
- }
-
-protected:
- //! The current (not completely filled) segment
- T *m_cur_segment;
-
- //! Capacity of m_cur_segment
- size_t m_cur_segment_size;
-
- //! Insertion position in m_cur_segment
- size_t m_pos;
-
- //! Array of filled segments (has fixed size specified by the second template parameter)
- T *m_segments[max_segments];
-
- //! Number of filled segments (the size of m_segments)
- size_t m_num_segments;
-
- //! Number of items in the segments in m_segments
- size_t m_size;
-
-}; // class fast_reverse_vector
-
-//------------------------------------------------------------------------
-// End of general utility section
-//------------------------------------------------------------------------
-
-//! Alignment for a task object
-const size_t task_alignment = 16;
-
-//! Number of bytes reserved for a task prefix
-/** If not exactly sizeof(task_prefix), the extra bytes *precede* the task_prefix. */
-const size_t task_prefix_reservation_size = ((sizeof(internal::task_prefix)-1)/task_alignment+1)*task_alignment;
-
-template<typename SchedulerTraits> class CustomScheduler;
-
-
-class mail_outbox;
-
-struct task_proxy: public task {
- static const intptr pool_bit = 1;
- static const intptr mailbox_bit = 2;
- /* All but two low-order bits represent a (task*).
- Two low-order bits mean:
- 1 = proxy is/was/will be in task pool
- 2 = proxy is/was/will be in mailbox */
- intptr task_and_tag;
-
- //! Pointer to next task_proxy in a mailbox
- task_proxy* next_in_mailbox;
-
- //! Mailbox to which this was mailed.
- mail_outbox* outbox;
-};
-
-//! Internal representation of mail_outbox, without padding.
-class unpadded_mail_outbox {
-protected:
- //! Pointer to first task_proxy in mailbox, or NULL if box is empty.
- task_proxy* my_first;
-
- //! Pointer to pointer that will point to next item in the queue. Never NULL.
- task_proxy** my_last;
-
- //! Owner of mailbox is not executing a task, and has drained its own task pool.
- bool my_is_idle;
-};
-
-//! Class representing where mail is put.
-/** Padded to occupy a cache line. */
-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 );
- } else {
- // There is only one item. Some care is required to pop it.
- my_first = NULL;
- if( (task_proxy**)__TBB_CompareAndSwapW(&my_last, (intptr)&my_first,
- (intptr)&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;
- }
- }
- }
- return first;
- }
-public:
- friend class mail_inbox;
-
- //! Push task_proxy onto the mailbox queue of another thread.
- /** Implementation is wait-free. */
- 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.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;
- }
-
- //! 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
- will be constructed in zeroed memory. */
- void construct() {
- __TBB_ASSERT( sizeof(*this)==NFS_MaxLineSize, NULL );
- __TBB_ASSERT( !my_first, NULL );
- __TBB_ASSERT( !my_last, NULL );
- __TBB_ASSERT( !my_is_idle, NULL );
- my_last=&my_first;
- }
-
- //! Drain the mailbox
- intptr drain() {
- intptr k = 0;
- // No fences here because other threads have already quit.
- for( ; task_proxy* t = my_first; ++k ) {
- my_first = t->next_in_mailbox;
- NFS_Free((char*)t-task_prefix_reservation_size);
- }
- return k;
- }
-
- //! True if thread that owns this mailbox is looking for work.
- bool recipient_is_idle() {
- return my_is_idle;
- }
-};
-
-//! Class representing source of mail.
-class mail_inbox {
- //! Corresponding sink where mail that we receive will be put.
- mail_outbox* my_putter;
-public:
- //! Construct unattached inbox
- mail_inbox() : my_putter(NULL) {}
-
- //! Attach inbox to a corresponding outbox.
- void attach( mail_outbox& putter ) {
- __TBB_ASSERT(!my_putter,"already attached");
- my_putter = &putter;
- }
- //! Detach inbox from its outbox
- void detach() {
- __TBB_ASSERT(my_putter,"not attached");
- my_putter = NULL;
- }
- //! Get next piece of mail, or NULL if mailbox is empty.
- task_proxy* pop() {
- return my_putter->internal_pop();
- }
- //! Indicate whether thread that reads this mailbox is idle.
- /** Raises assertion failure if mailbox is redundantly marked as not idle. */
- void set_is_idle( bool value ) {
- if( my_putter ) {
- __TBB_ASSERT( my_putter->my_is_idle || value, "attempt to redundantly mark mailbox as not idle" );
- my_putter->my_is_idle = value;
- }
- }
-#if TBB_USE_ASSERT
- //! Indicate whether thread that reads this mailbox is idle.
- bool assert_is_idle( bool value ) const {
- __TBB_ASSERT( !my_putter || my_putter->my_is_idle==value, NULL );
- return true;
- }
-#endif /* TBB_USE_ASSERT */
-#if DO_ITT_NOTIFY
- //! Get pointer to corresponding outbox used for ITT_NOTIFY calls.
- void* outbox() const {return my_putter;}
-#endif /* DO_ITT_NOTIFY */
-};
-
-#if __TBB_SCHEDULER_OBSERVER
-//------------------------------------------------------------------------
-// observer_proxy
-//------------------------------------------------------------------------
-class observer_proxy {
- friend class task_scheduler_observer_v3;
- //! Reference count used for garbage collection.
- /** 1 for reference from my task_scheduler_observer.
- 1 for each local_last_observer_proxy that points to me.
- No accounting for predecessor in the global list.
- No accounting for global_last_observer_proxy that points to me. */
- atomic<int> gc_ref_count;
- //! Pointer to next task_scheduler_observer
- /** Valid even when *this has been removed from the global list. */
- observer_proxy* next;
- //! Pointer to previous task_scheduler_observer in global list.
- observer_proxy* prev;
- //! Associated observer
- task_scheduler_observer* observer;
- //! Account for removing reference from p. No effect if p is NULL.
- void remove_ref_slow();
- void remove_from_list();
- observer_proxy( task_scheduler_observer_v3& wo );
-public:
- static observer_proxy* process_list( observer_proxy* local_last, bool is_worker, bool is_entry );
-};
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
-
-//------------------------------------------------------------------------
-// Arena
-//------------------------------------------------------------------------
-
-class Arena;
-class GenericScheduler;
-
-struct WorkerDescriptor {
- //! NULL until worker is published. -1 if worker should not be published.
- GenericScheduler* scheduler;
-
-};
-
-//! The useful contents of an ArenaPrefix
-class UnpaddedArenaPrefix: no_copy
- ,rml::tbb_client
-{
- friend class GenericScheduler;
- template<typename SchedulerTraits> friend class internal::CustomScheduler;
- friend class Arena;
- friend class Governor;
- friend struct WorkerDescriptor;
-
- //! Arena slot to try to acquire first for the next new master.
- unsigned limit;
-
- //! Number of masters that own this arena.
- /** This may be smaller than the number of masters who have entered the arena. */
- unsigned number_of_masters;
-
- //! Total number of slots in the arena
- const unsigned number_of_slots;
-
- //! Number of workers that belong to this arena
- const unsigned number_of_workers;
-
- //! Pointer to the RML server object that services requests for this arena.
- rml::tbb_server* server;
- //! Counter used to allocate job indices
- tbb::atomic<size_t> next_job_index;
-
- //! Stack size of worker threads
- stack_size_type stack_size;
-
- //! Array of workers.
- WorkerDescriptor* worker_list;
-
-#if COUNT_TASK_NODES
- //! Net number of nodes that have been allocated from heap.
- /** Updated each time a scheduler is destroyed. */
- atomic<intptr> task_node_count;
-#endif /* COUNT_TASK_NODES */
-
- //! Estimate of number of available tasks.
- /** The estimate is either 0 (SNAPSHOT_EMPTY), infinity (SNAPSHOT_FULL), or a special value.
- The implementation of Arena::is_busy_or_empty requires that pool_state_t be unsigned. */
- typedef uintptr_t pool_state_t;
-
- //! Current estimate of number of available tasks.
- tbb::atomic<pool_state_t> pool_state;
-
-protected:
- UnpaddedArenaPrefix( unsigned number_of_slots_, unsigned number_of_workers_ ) :
- number_of_masters(1),
- number_of_slots(number_of_slots_),
- number_of_workers(number_of_workers_)
- {
-#if COUNT_TASK_NODES
- task_node_count = 0;
-#endif /* COUNT_TASK_NODES */
- limit = number_of_workers_;
- server = NULL;
- stack_size = 0;
- next_job_index = 0;
- }
- void open_connection_to_rml();
-
-private:
- //! Return reference to corresponding arena.
- Arena& arena();
-
- /*override*/ version_type version() const {
- return 0;
- }
-
- /*override*/ unsigned max_job_count() const {
- return number_of_workers;
- }
-
- /*override*/ size_t min_stack_size() const {
- return stack_size;
- }
-
- /*override*/ policy_type policy() const {
- return throughput;
- }
-
- /*override*/ job* create_one_job();
-
- /*override*/ void cleanup( job& j );
-
- /*override*/ void acknowledge_close_connection();
-
- /*override*/ void process( job& j );
-};
-
-//! The prefix to Arena with padding.
-class ArenaPrefix: public UnpaddedArenaPrefix {
- //! Padding to fill out to multiple of cache line size.
- char pad[(sizeof(UnpaddedArenaPrefix)/NFS_MaxLineSize+1)*NFS_MaxLineSize-sizeof(UnpaddedArenaPrefix)];
-
-public:
- ArenaPrefix( unsigned number_of_slots_, unsigned number_of_workers_ ) :
- UnpaddedArenaPrefix(number_of_slots_,number_of_workers_)
- {
- }
-};
-
-
-struct ArenaSlot {
- // Task pool (the deque of task pointers) of the scheduler that owns this slot
- /** Also is used to specify if the slot is empty or locked:
- 0 - empty
- -1 - locked **/
- task** task_pool;
-
- //! Index of the first ready task in the deque.
- /** Modified by thieves, and by the owner during compaction/reallocation **/
- size_t head;
-
- //! Padding to avoid false sharing caused by the thieves accessing this slot
- char pad1[NFS_MaxLineSize - sizeof(size_t) - sizeof(task**)];
-
- //! Index of the element following the last ready task in the deque.
- /** Modified by the owner thread. **/
- size_t tail;
-
- //! Padding to avoid false sharing caused by the thieves accessing the next slot
- char pad2[NFS_MaxLineSize - sizeof(size_t)];
-};
-
-
-class Arena {
- friend class UnpaddedArenaPrefix;
- friend class GenericScheduler;
- template<typename SchedulerTraits> friend class internal::CustomScheduler;
- friend class Governor;
- friend struct WorkerDescriptor;
-
- //! Get reference to prefix portion
- ArenaPrefix& prefix() const {return ((ArenaPrefix*)(void*)this)[-1];}
-
- //! Get reference to mailbox corresponding to given affinity_id.
- mail_outbox& mailbox( affinity_id id ) {
- __TBB_ASSERT( 0<id, "id must be positive integer" );
- __TBB_ASSERT( id <= prefix().number_of_slots, "id out of bounds" );
- return ((mail_outbox*)&prefix())[-(int)id];
- }
-
- //! Allocate an instance of Arena, and prepare everything to start workers.
- static Arena* allocate_arena( unsigned number_of_slots, unsigned number_of_workers, stack_size_type stack_size );
-
- void free_arena() {
- // Drain mailboxes
- // TODO: each scheduler should plug-and-drain its own mailbox when it terminates.
- intptr drain_count = 0;
- for( unsigned i=1; i<=prefix().number_of_slots; ++i )
- drain_count += mailbox(i).drain();
-#if COUNT_TASK_NODES
- prefix().task_node_count -= drain_count;
-#if !TEST_ASSEMBLY_ROUTINES
- if( prefix().task_node_count ) {
- fprintf(stderr,"warning: leaked %ld task objects\n", long(prefix().task_node_count));
- }
-#endif /* !TEST_ASSEMBLY_ROUTINES */
-#endif /* COUNT_TASK_NODES */
- void* storage = &mailbox(prefix().number_of_slots);
- delete[] prefix().worker_list;
- prefix().~ArenaPrefix();
- NFS_Free( storage );
- }
-
- typedef ArenaPrefix::pool_state_t pool_state_t;
-
- //! No tasks to steal since last snapshot was taken
- static const pool_state_t SNAPSHOT_EMPTY = 0;
-
- //! At least one task has been offered for stealing since the last snapshot started
- static const pool_state_t SNAPSHOT_FULL = pool_state_t(-1);
-
- //! Server is going away and hence further calls to adjust_job_count_estimate are unsafe.
- static const pool_state_t SNAPSHOT_SERVER_GOING_AWAY = pool_state_t(-2);
-
- //! No tasks to steal or snapshot is being taken.
- static bool is_busy_or_empty( pool_state_t s ) {return s<SNAPSHOT_SERVER_GOING_AWAY;}
-
- //! If necessary, inform gate that task was added to pool recently.
- void mark_pool_full();
-
- //! Check if pool is empty.
- /** Return true if pool is empty or being cleaned up. */
- bool check_if_pool_is_empty();
-
- //! Terminate worker threads
- /** Wait for worker threads to complete. */
- void terminate_workers();
-
-
-#if COUNT_TASK_NODES
- //! Returns the number of task objects "living" in worker threads
- inline intptr workers_task_node_count();
-#endif
-
- /** Must be last field */
- ArenaSlot slot[1];
-};
-
-//------------------------------------------------------------------------
-//! Traits classes for scheduler
-//------------------------------------------------------------------------
-
-struct DefaultSchedulerTraits {
- static const int id = 0;
- static const bool itt_possible = true;
- static const bool has_slow_atomic = false;
-};
-
-struct IntelSchedulerTraits {
- static const int id = 1;
- static const bool itt_possible = false;
-#if __TBB_x86_32||__TBB_x86_64
- static const bool has_slow_atomic = true;
-#else
- static const bool has_slow_atomic = false;
-#endif /* __TBB_x86_32||__TBB_x86_64 */
-};
-
-//------------------------------------------------------------------------
-// Class __TBB_InitOnce
-//------------------------------------------------------------------------
-
-//! Class that supports TBB initialization.
-/** It handles acquisition and release of global resources (e.g. TLS) during startup and shutdown,
- as well as synchronization for DoOneTimeInitializations. */
-class __TBB_InitOnce {
- friend void DoOneTimeInitializations();
- friend void ITT_DoUnsafeOneTimeInitialization ();
-
- static atomic<int> count;
-
- //! Platform specific code to acquire resources.
- static void acquire_resources();
-
- //! Platform specific code to release resources.
- static void release_resources();
-
- 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 unsigned char mutex_type;
-
- // Global initialization lock
- static mutex_type InitializationLock;
-
-public:
- static void lock() { __TBB_LockByte( InitializationLock ); }
-
- static void unlock() { __TBB_store_with_release( InitializationLock, 0 ); }
-
- static bool initialization_done() { return __TBB_load_with_acquire(InitializationDone); }
-
- //! Add initial reference to resources.
- /** We assume that dynamic loading of the library prevents any other threads from entering the library
- until this constructor has finished running. */
- __TBB_InitOnce() { add_ref(); }
-
- //! Remove the initial reference to resources.
- /** This is not necessarily the last reference if other threads are still running.
- If the extra reference from DoOneTimeInitializations is present, remove it as well.*/
- ~__TBB_InitOnce();
-
- //! Add reference to resources. If first reference added, acquire the resources.
- static void add_ref() {
- if( ++count==1 )
- acquire_resources();
- }
- //! Remove reference to resources. If last reference removed, release the resources.
- static void remove_ref() {
- int k = --count;
- __TBB_ASSERT(k>=0,"removed __TBB_InitOnce ref that was not added?");
- if( k==0 )
- release_resources();
- }
-}; // class __TBB_InitOnce
-
-//------------------------------------------------------------------------
-// Class Governor
-//------------------------------------------------------------------------
-
-//! The class handles access to the single instance of Arena, and to TLS to keep scheduler instances.
-/** It also supports automatic on-demand intialization of the TBB scheduler.
- The class contains only static data members and methods.*/
-class Governor {
- friend class __TBB_InitOnce;
- friend void ITT_DoUnsafeOneTimeInitialization ();
-
- static basic_tls<GenericScheduler*> theTLS;
- static Arena* theArena;
- static mutex theArenaMutex;
-
- //! Create key for thread-local storage.
- static void create_tls() {
-#if USE_PTHREAD
- int status = theTLS.create(auto_terminate);
-#else
- int status = theTLS.create();
-#endif
- if( status )
- handle_perror(status, "TBB failed to initialize TLS storage\n");
- }
-
- //! Destroy the thread-local storage key.
- static void destroy_tls() {
-#if TBB_USE_ASSERT
- if( __TBB_InitOnce::initialization_done() && theTLS.get() )
- fprintf(stderr, "TBB is unloaded while tbb::task_scheduler_init object is alive?");
-#endif
- int status = theTLS.destroy();
- if( status )
- handle_perror(status, "TBB failed to destroy TLS storage");
- }
-
- //! Obtain the instance of arena to register a new master thread
- /** If there is no active arena, create one. */
- static Arena* obtain_arena( int number_of_threads, stack_size_type thread_stack_size )
- {
- mutex::scoped_lock lock( theArenaMutex );
- Arena* a = theArena;
- if( a ) {
- a->prefix().number_of_masters += 1;
- } else {
- if( number_of_threads==task_scheduler_init::automatic )
- number_of_threads = task_scheduler_init::default_num_threads();
- a = Arena::allocate_arena( 2*number_of_threads, number_of_threads-1,
- thread_stack_size?thread_stack_size:ThreadStackSize );
- __TBB_ASSERT( a->prefix().number_of_masters==1, NULL );
- // Publish the Arena.
- // A memory release fence is not required here, because workers have not started yet,
- // and concurrent masters inspect theArena while holding theArenaMutex.
- __TBB_ASSERT( !theArena, NULL );
- theArena = a;
- // Must create server under lock, otherwise second master might see arena without a server.
- a->prefix().open_connection_to_rml();
- }
- return a;
- }
-
- //! The internal routine to undo automatic initialization.
- /** The signature is written with void* so that the routine
- can be the destructor argument to pthread_key_create. */
- static void auto_terminate(void* scheduler);
-
-public:
- //! Processes scheduler initialization request (possibly nested) in a master thread
- /** If necessary creates new instance of arena and/or local scheduler.
- The auto_init argument specifies if the call is due to automatic initialization. **/
- static GenericScheduler* init_scheduler( int num_threads, stack_size_type stack_size, bool auto_init = false );
-
- //! Processes scheduler termination request (possibly nested) in a master thread
- static void terminate_scheduler( GenericScheduler* s );
-
- //! Dereference arena when a master thread stops using TBB.
- /** If no more masters in the arena, terminate workers and destroy it. */
- static void finish_with_arena() {
- mutex::scoped_lock lock( theArenaMutex );
- Arena* a = theArena;
- __TBB_ASSERT( a, "theArena is missing" );
- if( --(a->prefix().number_of_masters) )
- a = NULL;
- else {
- theArena = NULL;
- // Must do this while holding lock, otherwise terminate message might reach
- // RML thread *after* initialize message reaches it for the next arena, which
- // which causes TLS to be set to new value before old one is erased!
- a->terminate_workers();
- }
- }
-
- static size_t number_of_workers_in_arena() {
- __TBB_ASSERT( theArena, "thread did not activate a task_scheduler_init object?" );
- // No fence required to read theArena, because it does not change after the thread starts.
- return theArena->prefix().number_of_workers;
- }
-
- //! Register TBB scheduler instance in thread local storage.
- inline static void sign_on(GenericScheduler* s);
-
- //! Unregister TBB scheduler instance from thread local storage.
- inline static void sign_off(GenericScheduler* s);
-
- //! Used to check validity of the local scheduler TLS contents.
- static bool is_set ( GenericScheduler* s ) { return theTLS.get() == s; }
-
- //! Obtain the thread local instance of the TBB scheduler.
- /** If the scheduler has not been initialized yet, initialization is done automatically.
- Note that auto-initialized scheduler instance is destroyed only when its thread terminates. **/
- static GenericScheduler* local_scheduler () {
- GenericScheduler* s = theTLS.get();
- return s ? s : init_scheduler( task_scheduler_init::automatic, 0, true );
- }
-
- //! Undo automatic initialization if necessary; call when a thread exits.
- static void terminate_auto_initialized_scheduler() {
- auto_terminate( theTLS.get() );
- }
-}; // class Governor
-
-//------------------------------------------------------------------------
-// Begin shared data layout.
-//
-// The following global data items are read-only after initialization.
-// The first item is aligned on a 128 byte boundary so that it starts a new cache line.
-//------------------------------------------------------------------------
-
-basic_tls<GenericScheduler*> Governor::theTLS;
-Arena * Governor::theArena;
-mutex Governor::theArenaMutex;
-
-//! Number of hardware threads
-/** One more than the default number of workers. */
-static int DefaultNumberOfThreads;
-
-//! T::id for the scheduler traits type T to use for the scheduler
-/** For example, the default value is DefaultSchedulerTraits::id. */
-static int SchedulerTraitsId;
-
-//! Counter of references to global shared resources such as TLS.
-atomic<int> __TBB_InitOnce::count;
-
-__TBB_InitOnce::mutex_type __TBB_InitOnce::InitializationLock;
-
-//! Flag that is set to true after one-time initializations are done.
-bool __TBB_InitOnce::InitializationDone;
-
-#if DO_ITT_NOTIFY
- static bool ITT_Present;
- static bool ITT_InitializationDone;
-#endif
-
-static rml::tbb_factory rml_server_factory;
-//! Set to true if private statically linked RML server should be used instead of shared server.
-static bool use_private_rml;
-
-#if !(_WIN32||_WIN64) || __TBB_TASK_CPP_DIRECTLY_INCLUDED
- static __TBB_InitOnce __TBB_InitOnceHiddenInstance;
-#endif
-
-#if __TBB_SCHEDULER_OBSERVER
-typedef spin_rw_mutex::scoped_lock task_scheduler_observer_mutex_scoped_lock;
-/** aligned_space used here to shut up warnings when mutex destructor is called while threads are still using it. */
-static aligned_space<spin_rw_mutex,1> the_task_scheduler_observer_mutex;
-static observer_proxy* global_first_observer_proxy;
-static observer_proxy* global_last_observer_proxy;
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
-//! Table of primes used by fast random-number generator.
-/** Also serves to keep anything else from being placed in the same
- cache line as the global data items preceding it. */
-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
-};
-
-#if STATISTICS
-//! Class for collecting statistics
-/** There should be only one instance of this class.
- Results are written to a file "statistics.txt" in tab-separated format. */
-static class statistics {
-public:
- statistics() {
- my_file = fopen("statistics.txt","w");
- if( !my_file ) {
- perror("fopen(\"statistics.txt\"\")");
- exit(1);
- }
- fprintf(my_file,"%13s\t%13s\t%13s\t%13s\t%13s\t%13s\n", "execute", "steal", "mail", "proxy_execute", "proxy_steal", "proxy_bypass" );
- }
- ~statistics() {
- fclose(my_file);
- }
- void record( long execute_count, long steal_count, long mail_received_count,
- long proxy_execute_count, long proxy_steal_count, long proxy_bypass_count ) {
- mutex::scoped_lock lock(my_mutex);
- fprintf (my_file,"%13ld\t%13ld\t%13ld\t%13ld\t%13ld\t%13ld\n", execute_count, steal_count, mail_received_count,
- proxy_execute_count, proxy_steal_count, proxy_bypass_count );
- }
-private:
- //! File into which statistics are written.
- FILE* my_file;
- //! Mutex that serializes accesses to my_file
- mutex my_mutex;
-} the_statistics;
-#endif /* STATISTICS */
-
-#if __TBB_EXCEPTIONS
- struct scheduler_list_node_t {
- scheduler_list_node_t *my_prev,
- *my_next;
- };
-
- //! Head of the list of master thread schedulers.
- static scheduler_list_node_t the_scheduler_list_head;
-
- //! Mutex protecting access to the list of schedulers.
- static mutex the_scheduler_list_mutex;
-
-//! Counter that is incremented whenever new cancellation signal is sent to a task group.
-/** Together with GenericScheduler::local_cancel_count 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 being registered or unregistered,
- the global and local counters are compared. If they differ, it means that
- a cancellation signal is being propagated, and registration/deregistration
- routines take slower branch that may block (at most one thread of the pool
- can be blocked at any moment). Otherwise the control path is lock-free and fast. **/
- static uintptr_t global_cancel_count = 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
- 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_EXCEPTIONS */
-
-//------------------------------------------------------------------------
-// End of shared data layout
-//------------------------------------------------------------------------
-
-//! Amount of time to pause between steals.
-/** The default values below were found to be best empirically for K-Means
- on the 32-way Altix and 4-way (*2 for HT) fxqlin04. */
-#if __TBB_ipf
-static const long PauseTime = 1500;
-#else
-static const long PauseTime = 80;
-#endif
-
-//------------------------------------------------------------------------
-// One-time Initializations
-//------------------------------------------------------------------------
-
-//! Defined in cache_aligned_allocator.cpp
-extern void initialize_cache_aligned_allocator();
-
-#if DO_ITT_NOTIFY
-//! Performs initialization of tools support.
-/** Defined in itt_notify.cpp. Must be called in a protected do-once manner.
- \return true if notification hooks were installed, false otherwise. **/
-bool InitializeITT();
-
-/** Thread-unsafe lazy one-time initialization of tools interop.
- Used by both dummy handlers and general TBB one-time initialization routine. **/
-void ITT_DoUnsafeOneTimeInitialization () {
- if ( !ITT_InitializationDone ) {
- ITT_Present = InitializeITT();
- ITT_InitializationDone = true;
- ITT_SYNC_CREATE(&Governor::theArenaMutex, SyncType_GlobalLock, SyncObj_SchedulerInitialization);
- }
-}
-
-/** Thread-safe lazy one-time initialization of tools interop.
- Used by dummy handlers only. **/
-extern "C"
-void ITT_DoOneTimeInitialization() {
- __TBB_InitOnce::lock();
- ITT_DoUnsafeOneTimeInitialization();
- __TBB_InitOnce::unlock();
-}
-#endif /* DO_ITT_NOTIFY */
-
-//! Performs thread-safe lazy one-time general TBB initialization.
-void DoOneTimeInitializations() {
- __TBB_InitOnce::lock();
- // No fence required for load of InitializationDone, because we are inside a critical section.
- if( !__TBB_InitOnce::InitializationDone ) {
- __TBB_InitOnce::add_ref();
- if( GetBoolEnvironmentVariable("TBB_VERSION") )
- PrintVersion();
- bool have_itt = false;
-#if DO_ITT_NOTIFY
- ITT_DoUnsafeOneTimeInitialization();
- have_itt = ITT_Present;
-#endif /* DO_ITT_NOTIFY */
- initialize_cache_aligned_allocator();
- ::rml::factory::status_type status = rml_server_factory.open();
- if( status!=::rml::factory::st_success ) {
- use_private_rml = true;
- PrintExtraVersionInfo( "RML", "private" );
- } else {
- PrintExtraVersionInfo( "RML", "shared" );
- rml_server_factory.call_with_server_info( PrintRMLVersionInfo, (void*)"" );
- }
- if( !have_itt )
- SchedulerTraitsId = IntelSchedulerTraits::id;
-#if __TBB_EXCEPTIONS
- else {
- ITT_SYNC_CREATE(&the_scheduler_list_mutex, SyncType_GlobalLock, SyncObj_SchedulersList);
- }
-#endif /* __TBB_EXCEPTIONS */
- PrintExtraVersionInfo( "SCHEDULER",
- SchedulerTraitsId==IntelSchedulerTraits::id ? "Intel" : "default" );
-#if __TBB_EXCEPTIONS
- the_scheduler_list_head.my_next = &the_scheduler_list_head;
- the_scheduler_list_head.my_prev = &the_scheduler_list_head;
-#endif /* __TBB_EXCEPTIONS */
- __TBB_InitOnce::InitializationDone = true;
- }
- __TBB_InitOnce::unlock();
-}
-
-//------------------------------------------------------------------------
-// Methods of class __TBB_InitOnce
-//------------------------------------------------------------------------
-
-__TBB_InitOnce::~__TBB_InitOnce() {
- remove_ref();
- // It is assumed that InitializationDone is not set after file-scope destructors start running,
- // and thus no race on InitializationDone is possible.
- if( initialization_done() ) {
- // Remove reference that we added in DoOneTimeInitializations.
- remove_ref();
- }
-}
-
-void __TBB_InitOnce::acquire_resources() {
- Governor::create_tls();
-}
-
-void __TBB_InitOnce::release_resources() {
- rml_server_factory.close();
- Governor::destroy_tls();
-}
-
-#if (_WIN32||_WIN64) && !__TBB_TASK_CPP_DIRECTLY_INCLUDED
-//! Windows "DllMain" that handles startup and shutdown of dynamic library.
-extern "C" bool WINAPI DllMain( HANDLE /*hinstDLL*/, DWORD reason, LPVOID /*lpvReserved*/ ) {
- switch( reason ) {
- case DLL_PROCESS_ATTACH:
- __TBB_InitOnce::add_ref();
- break;
- case DLL_PROCESS_DETACH:
- __TBB_InitOnce::remove_ref();
- // It is assumed that InitializationDone is not set after DLL_PROCESS_DETACH,
- // and thus no race on InitializationDone is possible.
- if( __TBB_InitOnce::initialization_done() ) {
- // Remove reference that we added in DoOneTimeInitializations.
- __TBB_InitOnce::remove_ref();
- }
- break;
- case DLL_THREAD_DETACH:
- Governor::terminate_auto_initialized_scheduler();
- break;
- }
- return true;
-}
-#endif /* (_WIN32||_WIN64) && !__TBB_TASK_CPP_DIRECTLY_INCLUDED */
-
-//------------------------------------------------------------------------
-// FastRandom
-//------------------------------------------------------------------------
-
-//! A fast random number generator.
-/** Uses linear congruential method. */
-class FastRandom {
- unsigned x, a;
-public:
- //! Get a random number.
- unsigned short get() {
- unsigned short r = x>>16;
- x = x*a+1;
- return r;
- }
- //! Construct a random number generator.
- FastRandom( unsigned seed ) {
- x = seed;
- a = Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];
- }
-};
-
-//------------------------------------------------------------------------
-// GenericScheduler
-//------------------------------------------------------------------------
-
-// A pure virtual destructor should still have a body
-// so the one for tbb::internal::scheduler::~scheduler() is provided here
-scheduler::~scheduler( ) {}
-
- #define EmptyTaskPool ((task**)0u)
- #define LockedTaskPool ((task**)~0u)
-
-//! Cilk-style task scheduler.
-/** None of the fields here are every read or written by threads other than
- the thread that creates the instance.
-
- Class GenericScheduler is an abstract base class that contains most of the scheduler,
- except for tweaks specific to processors and tools (e.g. VTune).
- The derived template class CustomScheduler<SchedulerTraits> fills in the tweaks. */
-class GenericScheduler: public scheduler
- ,public ::rml::job
-{
- friend class tbb::task;
- friend class UnpaddedArenaPrefix;
- friend class Arena;
- friend class allocate_root_proxy;
- friend class Governor;
-#if __TBB_EXCEPTIONS
- friend class allocate_root_with_context_proxy;
- friend class tbb::task_group_context;
-#endif /* __TBB_EXCEPTIONS */
-#if __TBB_SCHEDULER_OBSERVER
- friend class task_scheduler_observer_v3;
-#endif /* __TBB_SCHEDULER_OBSERVER */
- friend class scheduler;
- template<typename SchedulerTraits> friend class internal::CustomScheduler;
-
- //! If sizeof(task) is <=quick_task_size, it is handled on a free list instead of malloc'd.
- static const size_t quick_task_size = 256-task_prefix_reservation_size;
-
- //! Definitions for bits in task_prefix::extra_state
- enum internal_state_t {
- //! Tag for v1 tasks (i.e. tasks in TBB 1.0 and 2.0)
- es_version_1_task = 0,
- //! Tag for v3 tasks (i.e. tasks in TBB 2.1-2.2)
- es_version_3_task = 1,
- //! Tag for v3 task_proxy.
- es_task_proxy = 0x20,
- //! Set if ref_count might be changed by another thread. Used for debugging.
- es_ref_count_active = 0x40,
- //! Set if the task has been stolen
- es_task_is_stolen = 0x80
- };
-
- static bool is_version_3_task( task& t ) {
- return (t.prefix().extra_state & 0x0F)>=0x1;
- }
-
- //! Position in the call stack specifying its maximal filling when stealing is still allowed
- uintptr_t my_stealing_threshold;
-#if __TBB_ipf
- //! Position in the RSE backup area specifying its maximal filling when stealing is still allowed
- uintptr_t my_rsb_stealing_threshold;
-#endif
-
- static const size_t null_arena_index = ~0u;
-
- //! Index of the arena slot the scheduler occupies now, or occupied last time.
- size_t arena_index;
-
- //! Capacity of ready tasks deque (number of elements - pointers to task).
- size_t task_pool_size;
-
- //! Dummy slot used when scheduler is not in arena
- /** Only its "head" and "tail" members are ever used. The scheduler uses
- the "task_pool" shortcut to access the task deque. **/
- ArenaSlot dummy_slot;
-
- //! Pointer to the slot in the arena we own at the moment.
- /** When out of arena it points to this scheduler's dummy_slot. **/
- mutable ArenaSlot* arena_slot;
-
- bool in_arena () const { return arena_slot != &dummy_slot; }
-
- bool is_local_task_pool_empty () {
- return arena_slot->task_pool == EmptyTaskPool || arena_slot->head >= arena_slot->tail;
- }
-
- //! The arena that I own (if master) or belong to (if worker)
- Arena* const arena;
-
- //! Random number generator used for picking a random victim from which to steal.
- FastRandom random;
-
- //! Free list of small tasks that can be reused.
- task* free_list;
-
- //! Innermost task whose task::execute() is running.
- task* innermost_running_task;
-
- //! Fake root task created by slave threads.
- /** The task is used as the "parent" argument to method wait_for_all. */
- task* dummy_task;
-
- //! Reference count for scheduler
- /** Number of task_scheduler_init objects that point to this scheduler */
- long ref_count;
-
- mail_inbox inbox;
-
- void attach_mailbox( affinity_id id ) {
- __TBB_ASSERT(id>0,NULL);
- inbox.attach( arena->mailbox(id) );
- my_affinity_id = id;
- }
-
- //! The mailbox id assigned to this scheduler.
- /** The id is assigned upon first entry into the arena.
- TODO: how are id's being garbage collected?
- TODO: master thread may enter arena and leave and then reenter.
- We want to give it the same affinity_id upon reentry, if practical.
- */
- affinity_id my_affinity_id;
-
- /* A couple of bools can be located here because space is otherwise just padding after my_affinity_id. */
-
- //! True if this is assigned to thread local storage by registering with Governor.
- bool is_registered;
-
- //! True if *this was created by automatic TBB initialization
- bool is_auto_initialized;
-
-#if __TBB_SCHEDULER_OBSERVER
- //! Last observer_proxy processed by this scheduler
- observer_proxy* local_last_observer_proxy;
-
- //! Notify any entry observers that have been created since the last call by this thread.
- void notify_entry_observers() {
- local_last_observer_proxy = observer_proxy::process_list(local_last_observer_proxy,is_worker(),/*is_entry=*/true);
- }
-
- //! Notify all exit observers that this thread is no longer participating in task scheduling.
- void notify_exit_observers( bool is_worker ) {
- observer_proxy::process_list(local_last_observer_proxy,is_worker,/*is_entry=*/false);
- }
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
-#if COUNT_TASK_NODES
- //! Net number of big task objects that have been allocated but not yet freed.
- intptr task_node_count;
-#endif /* COUNT_TASK_NODES */
-
-#if STATISTICS
- long current_active;
- long current_length;
- //! Number of big tasks that have been malloc'd.
- /** To find total number of tasks malloc'd, compute (current_big_malloc+small_task_count) */
- long current_big_malloc;
- long execute_count;
- //! Number of tasks stolen
- long steal_count;
- //! Number of tasks received from mailbox
- long mail_received_count;
- long proxy_execute_count;
- long proxy_steal_count;
- long proxy_bypass_count;
-#endif /* STATISTICS */
-
- //! Sets up the data necessary for the stealing limiting heuristics
- void init_stack_info ();
-
- //! Returns true if stealing is allowed
- bool can_steal () {
- int anchor;
-#if __TBB_ipf
- return my_stealing_threshold < (uintptr_t)&anchor && (uintptr_t)__TBB_get_bsp() < my_rsb_stealing_threshold;
-#else
- return my_stealing_threshold < (uintptr_t)&anchor;
-#endif
- }
-
- //! Actions common to enter_arena and try_enter_arena
- void do_enter_arena();
-
- //! Used by workers to enter the arena
- /** Does not lock the task pool in case if arena slot has been successfully grabbed. **/
- void enter_arena();
-
- //! Used by masters to try to enter the arena
- /** Does not lock the task pool in case if arena slot has been successfully grabbed. **/
- void try_enter_arena();
-
- //! Leave the arena
- void leave_arena();
-
- //! Locks victim's task pool, and returns pointer to it. The pointer can be NULL.
- task** lock_task_pool( ArenaSlot* victim_arena_slot ) const;
-
- //! Unlocks victim's task pool
- void unlock_task_pool( ArenaSlot* victim_arena_slot, task** victim_task_pool ) const;
-
-
- //! Locks the local task pool
- void acquire_task_pool() const;
-
- //! Unlocks the local task pool
- void release_task_pool() const;
-
- //! Get a task from the local pool.
- //! Checks if t is affinitized to another thread, and if so, bundles it as proxy.
- /** Returns either t or proxy containing t. **/
- task* prepare_for_spawning( task* t );
-
- /** Called only by the pool owner.
- Returns the pointer to the task or NULL if the pool is empty.
- In the latter case compacts the pool. **/
- 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. */
- task* get_mailbox_task();
-
- //! True if t is a task_proxy
- static bool is_proxy( const task& t ) {
- 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 );
-
- //! Steal task from another scheduler's ready pool.
- task* steal_task( ArenaSlot& victim_arena_slot );
-
- /** Initial size of the task deque sufficient to serve without reallocation
- 4 nested paralle_for calls with iteration space of 65535 grains each. **/
- static const size_t min_task_pool_size = 64;
-
- //! Allocate task pool containing at least n elements.
- task** allocate_task_pool( size_t n );
-
- //! Deallocate task pool that was allocated by means of allocate_task_pool.
- static void free_task_pool( task** pool ) {
- __TBB_ASSERT( pool, "attempt to free NULL TaskPool" );
- NFS_Free( pool );
- }
-
- //! Grow ready task deque to at least n elements.
- void grow( size_t n );
-
- //! Initialize a scheduler for a master thread.
- static GenericScheduler* create_master( Arena* a );
-
- //! Perform necessary cleanup when a master thread stops using TBB.
- void cleanup_master();
-
- //! Initialize a scheduler for a worker thread.
- static GenericScheduler* create_worker( Arena& a, size_t index );
-
- //! Perform necessary cleanup when a worker thread finishes.
- static void cleanup_worker( void* arg );
-
-protected:
- GenericScheduler( Arena* arena );
-
-#if TBB_USE_ASSERT
- //! Check that internal data structures are in consistent state.
- /** Raises __TBB_ASSERT failure if inconsistency is found. */
- bool assert_okay() const;
-#endif /* TBB_USE_ASSERT */
-
-public:
- void local_spawn( task& first, task*& next );
- void local_spawn_root_and_wait( task& first, task*& next );
-
- /*override*/
- void spawn( task& first, task*& next ) {
- Governor::local_scheduler()->local_spawn( first, next );
- }
- /*override*/
- void spawn_root_and_wait( task& first, task*& next ) {
- Governor::local_scheduler()->local_spawn_root_and_wait( first, next );
- }
-
- virtual void local_wait_for_all( task& parent, task* child ) = 0;
-
- //! Allocate and construct a scheduler object.
- static GenericScheduler* allocate_scheduler( Arena* arena );
-
- //! Destroy and deallocate scheduler that was created with method allocate.
- void free_scheduler();
-
- //! Allocate task object, either from the heap or a free list.
- /** Returns uninitialized task object with initialized prefix. */
- task& allocate_task( size_t number_of_bytes,
- __TBB_CONTEXT_ARG(task* parent, task_group_context* context) );
-
- //! Optimization hint to free_task that enables it omit unnecessary tests and code.
- enum hint {
- //! No hint
- no_hint=0,
- //! Task is known to have been allocated by this scheduler
- is_local=1,
- //! Task is known to be a small task.
- /** Task should be returned to the free list of *some* scheduler, possibly not this scheduler. */
- is_small=2,
- //! Bitwise-OR of is_local and is_small.
- /** Task should be returned to free list of this scheduler. */
- is_small_local=3
- };
-
- //! Put task on free list.
- /** Does not call destructor. */
- template<hint h>
- void free_task( task& t );
-
- void 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<is_small>(tp);
- }
-
- //! Return task object to the memory allocator.
- void deallocate_task( task& t ) {
-#if TBB_USE_ASSERT
- task_prefix& p = t.prefix();
- p.state = 0xFF;
- p.extra_state = 0xFF;
- poison_pointer(p.next);
-#endif /* TBB_USE_ASSERT */
- NFS_Free((char*)&t-task_prefix_reservation_size);
-#if COUNT_TASK_NODES
- task_node_count -= 1;
-#endif /* COUNT_TASK_NODES */
- }
-
- //! True if running on a worker thread, false otherwise.
- inline bool is_worker() {
- return arena_index < arena->prefix().number_of_workers;
- }
-
-#if TEST_ASSEMBLY_ROUTINES
- /** Defined in test_assembly.cpp */
- void test_assembly_routines();
-#endif /* TEST_ASSEMBLY_ROUTINES */
-
-#if COUNT_TASK_NODES
- intptr get_task_node_count( bool count_arena_workers = false ) {
- return task_node_count + (count_arena_workers? arena->workers_task_node_count(): 0);
- }
-#endif /* COUNT_TASK_NODES */
-
- //! Special value used to mark return_list as not taking any more entries.
- static task* plugged_return_list() {return (task*)(intptr)(-1);}
-
- //! Number of small tasks that have been allocated by this scheduler.
- intptr small_task_count;
-
- //! List of small tasks that have been returned to this scheduler by other schedulers.
- task* 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;
-
- //! Free a small task t that that was allocated by a different scheduler
- void free_nonlocal_small_task( task& t );
-
-#if __TBB_EXCEPTIONS
- //! Padding isolating thread local members from members that can be written to by other threads.
- char _padding1[NFS_MaxLineSize - sizeof(context_list_node_t)];
-
- //! Head of the thread specific list of task group contexts.
- context_list_node_t context_list_head;
-
- //! Mutex protecting access to the list of task group contexts.
- spin_mutex context_list_mutex;
-
- //! Used to form the list of master thread schedulers.
- scheduler_list_node_t my_node;
-
- //! Thread local counter of cancellation requests.
- /** When this counter equals global_cancel_count, the cancellation state known
- to this thread is synchronized with the global cancellation state.
- \sa #global_cancel_count **/
- uintptr_t local_cancel_count;
-
- //! Propagates cancellation request to all descendants of the argument context.
- void propagate_cancellation ( task_group_context* ctx );
-
- //! Propagates cancellation request to contexts registered by this scheduler.
- void propagate_cancellation ();
-#endif /* __TBB_EXCEPTIONS */
-}; // class GenericScheduler
-
-//------------------------------------------------------------------------
-// auto_empty_task
-//------------------------------------------------------------------------
-
-//! Smart holder for the empty task class with automatic destruction
-class auto_empty_task {
- task* my_task;
- GenericScheduler* my_scheduler;
-public:
- auto_empty_task ( __TBB_CONTEXT_ARG(GenericScheduler *s, task_group_context* context) )
- : my_task( new(&s->allocate_task(sizeof(empty_task), __TBB_CONTEXT_ARG(NULL, context))) empty_task )
- , my_scheduler(s)
- {}
- // empty_task has trivial destructor, so there's no need to call it.
- ~auto_empty_task () { my_scheduler->free_task<GenericScheduler::is_small_local>(*my_task); }
-
- operator task& () { return *my_task; }
- task* operator & () { return my_task; }
- task_prefix& prefix () { return my_task->prefix(); }
-}; // class auto_empty_task
-
-//------------------------------------------------------------------------
-// Methods of class Governor that need full definition of GenericScheduler
-//------------------------------------------------------------------------
-
-void Governor::sign_on(GenericScheduler* s) {
- __TBB_ASSERT( !s->is_registered, NULL );
- s->is_registered = true;
- __TBB_InitOnce::add_ref();
- theTLS.set(s);
-}
-
-void Governor::sign_off(GenericScheduler* s) {
- if( s->is_registered ) {
-#if USE_PTHREAD
- __TBB_ASSERT( theTLS.get()==s || (!s->is_worker() && !theTLS.get()), "attempt to unregister a wrong scheduler instance" );
-#else
- __TBB_ASSERT( theTLS.get()==s, "attempt to unregister a wrong scheduler instance" );
-#endif /* USE_PTHREAD */
- theTLS.set(NULL);
- s->is_registered = false;
- __TBB_InitOnce::remove_ref();
- }
-}
-
-GenericScheduler* Governor::init_scheduler( int num_threads, stack_size_type stack_size, bool auto_init ) {
- if( !__TBB_InitOnce::initialization_done() )
- DoOneTimeInitializations();
- GenericScheduler* s = theTLS.get();
- if( s ) {
- s->ref_count += 1;
- return s;
- }
- s = GenericScheduler::create_master( obtain_arena(num_threads, stack_size) );
- __TBB_ASSERT(s, "Somehow a local scheduler creation for a master thread failed");
- s->is_auto_initialized = auto_init;
- return s;
-}
-
-void Governor::terminate_scheduler( GenericScheduler* s ) {
- __TBB_ASSERT( s == theTLS.get(), "Attempt to terminate non-local scheduler instance" );
- if( !--(s->ref_count) )
- s->cleanup_master();
-}
-
-void Governor::auto_terminate(void* arg){
- GenericScheduler* s = static_cast<GenericScheduler*>(arg);
- if( s && s->is_auto_initialized ) {
- if( !--(s->ref_count) ) {
- if ( !theTLS.get() && !s->is_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.
- theTLS.set(s);
- s->cleanup_master();
- theTLS.set(NULL);
- }
- else
- s->cleanup_master();
- }
- }
-}
-
-//------------------------------------------------------------------------
-// GenericScheduler implementation
-//------------------------------------------------------------------------
-
-inline task& GenericScheduler::allocate_task( size_t number_of_bytes,
- __TBB_CONTEXT_ARG(task* parent, task_group_context* context) ) {
- GATHER_STATISTIC(current_active+=1);
- task* t = free_list;
- if( number_of_bytes<=quick_task_size ) {
- if( t ) {
- GATHER_STATISTIC(current_length-=1);
- __TBB_ASSERT( t->state()==task::freed, "free list of tasks is corrupted" );
- free_list = t->prefix().next;
- } else if( return_list ) {
- // No fence required for read of return_list above, because __TBB_FetchAndStoreW has a fence.
- t = (task*)__TBB_FetchAndStoreW( &return_list, 0 );
- __TBB_ASSERT( t, "another thread emptied the return_list" );
- __TBB_ASSERT( t->prefix().origin==this, "task returned to wrong return_list" );
- ITT_NOTIFY( sync_acquired, &return_list );
- free_list = t->prefix().next;
- } else {
- t = (task*)((char*)NFS_Allocate( task_prefix_reservation_size+quick_task_size, 1, NULL ) + task_prefix_reservation_size );
-#if COUNT_TASK_NODES
- ++task_node_count;
-#endif /* COUNT_TASK_NODES */
- t->prefix().origin = this;
- ++small_task_count;
- }
- } else {
- GATHER_STATISTIC(current_big_malloc+=1);
- t = (task*)((char*)NFS_Allocate( task_prefix_reservation_size+number_of_bytes, 1, NULL ) + task_prefix_reservation_size );
-#if COUNT_TASK_NODES
- ++task_node_count;
-#endif /* COUNT_TASK_NODES */
- t->prefix().origin = NULL;
- }
- task_prefix& p = t->prefix();
-#if __TBB_EXCEPTIONS
- p.context = context;
-#endif /* __TBB_EXCEPTIONS */
- p.owner = this;
- p.ref_count = 0;
- // Assign some not outrageously out-of-place value for a while
- p.depth = 0;
- p.parent = parent;
- // In TBB 2.1 and later, the constructor for task sets extra_state to indicate the version of the tbb/task.h header.
- // In TBB 2.0 and earlier, the constructor leaves extra_state as zero.
- p.extra_state = 0;
- p.affinity = 0;
- p.state = task::allocated;
- return *t;
-}
-
-template<GenericScheduler::hint h>
-inline void GenericScheduler::free_task( task& t ) {
- GATHER_STATISTIC(current_active-=1);
- task_prefix& p = t.prefix();
- // Verify that optimization hints are correct.
- __TBB_ASSERT( h!=is_small_local || p.origin==this, NULL );
- __TBB_ASSERT( !(h&is_small) || p.origin, NULL );
-#if TBB_USE_ASSERT
- p.depth = 0xDEADBEEF;
- p.ref_count = 0xDEADBEEF;
- 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==is_small_local || p.origin==this ) {
- GATHER_STATISTIC(current_length+=1);
- p.next = free_list;
- free_list = &t;
- } else if( !(h&is_local) && p.origin ) {
- free_nonlocal_small_task(t);
- } else {
- deallocate_task(t);
- }
-}
-
-void GenericScheduler::free_nonlocal_small_task( task& t ) {
- __TBB_ASSERT( t.state()==task::freed, NULL );
- GenericScheduler& s = *static_cast<GenericScheduler*>(t.prefix().origin);
- __TBB_ASSERT( &s!=this, NULL );
- for(;;) {
- task* old = s.return_list;
- if( old==plugged_return_list() )
- break;
- // Atomically insert t at head of s.return_list
- t.prefix().next = old;
- ITT_NOTIFY( sync_releasing, &s.return_list );
- if( __TBB_CompareAndSwapW( &s.return_list, (intptr)&t, (intptr)old )==(intptr)old )
- return;
- }
- deallocate_task(t);
- if( __TBB_FetchAndDecrementWrelease( &s.small_task_count )==1 ) {
- // We freed the last task allocated by scheduler s, so it's our responsibility
- // to free the scheduler.
- NFS_Free( &s );
- }
-}
-
-//------------------------------------------------------------------------
-// CustomScheduler
-//------------------------------------------------------------------------
-
-//! A scheduler with a customized evaluation loop.
-/** The customization can use SchedulerTraits to make decisions without needing a run-time check. */
-template<typename SchedulerTraits>
-class CustomScheduler: private GenericScheduler {
- typedef CustomScheduler<SchedulerTraits> scheduler_type;
-
- //! Scheduler loop that dispatches tasks.
- /** If child is non-NULL, it is dispatched first.
- Then, until "parent" has a reference count of 1, other task are dispatched or stolen. */
- /*override*/
- void local_wait_for_all( task& parent, task* child );
-
- //! 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*/
- void wait_for_all( task& parent, task* child ) {
- static_cast<CustomScheduler*>(Governor::local_scheduler())->scheduler_type::local_wait_for_all( parent, child );
- }
-
- //! Construct a CustomScheduler
- CustomScheduler( Arena* arena ) : GenericScheduler(arena) {}
-
- static bool tally_completion_of_one_predecessor( task& s ) {
- task_prefix& p = s.prefix();
- if( SchedulerTraits::itt_possible )
- ITT_NOTIFY(sync_releasing, &p.ref_count);
- if( SchedulerTraits::has_slow_atomic && p.ref_count==1 ) {
- p.ref_count=0;
- } else {
- reference_count k = __TBB_FetchAndDecrementWrelease(&p.ref_count);
- __TBB_ASSERT( k>0, "completion of task caused parent's reference count to underflow" );
- if( k!=1 )
- return false;
- }
- if( SchedulerTraits::itt_possible )
- ITT_NOTIFY(sync_acquired, &p.ref_count);
- return true;
- }
-
-public:
- static GenericScheduler* allocate_scheduler( Arena* arena ) {
- __TBB_ASSERT( arena, "missing arena" );
- scheduler_type* s = (scheduler_type*)NFS_Allocate(sizeof(scheduler_type),1,NULL);
- new( s ) scheduler_type( arena );
- __TBB_ASSERT( s->assert_okay(), NULL );
- ITT_SYNC_CREATE(s, SyncType_Scheduler, SyncObj_TaskPoolSpinning);
- return s;
- }
-
- //! 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 );
-};
-
-//------------------------------------------------------------------------
-// AssertOkay
-//------------------------------------------------------------------------
-#if TBB_USE_ASSERT
-/** Logically, this method should be a member of class task.
- But we do not want to publish it, so it is here instead. */
-static bool AssertOkay( const task& task ) {
- __TBB_ASSERT( &task!=NULL, NULL );
- __TBB_ASSERT( (uintptr)&task % task_alignment == 0, "misaligned task" );
- __TBB_ASSERT( (unsigned)task.state()<=(unsigned)task::recycle, "corrupt task (invalid state)" );
- return true;
-}
-#endif /* TBB_USE_ASSERT */
-
-//------------------------------------------------------------------------
-// Methods of Arena
-//------------------------------------------------------------------------
-Arena* Arena::allocate_arena( unsigned number_of_slots, unsigned number_of_workers, stack_size_type stack_size) {
- __TBB_ASSERT( sizeof(ArenaPrefix) % NFS_GetLineSize()==0, "ArenaPrefix not multiple of cache line size" );
- __TBB_ASSERT( sizeof(mail_outbox)==NFS_MaxLineSize, NULL );
- size_t n = sizeof(ArenaPrefix) + number_of_slots*(sizeof(mail_outbox)+sizeof(ArenaSlot));
-
- unsigned char* storage = (unsigned char*)NFS_Allocate( n, 1, NULL );
- memset( storage, 0, n );
- Arena* a = (Arena*)(storage + sizeof(ArenaPrefix)+ number_of_slots*(sizeof(mail_outbox)));
- __TBB_ASSERT( sizeof(a->slot[0]) % NFS_GetLineSize()==0, "Arena::slot size not multiple of cache line size" );
- __TBB_ASSERT( (uintptr)a % NFS_GetLineSize()==0, NULL );
- new( &a->prefix() ) ArenaPrefix( number_of_slots, number_of_workers );
-
- // Allocate the worker_list
- WorkerDescriptor * w = new WorkerDescriptor[number_of_workers];
- memset( w, 0, sizeof(WorkerDescriptor)*(number_of_workers));
- a->prefix().worker_list = w;
-
- // Construct mailboxes.
- for( unsigned j=1; j<=number_of_slots; ++j )
- a->mailbox(j).construct();
-
- a->prefix().stack_size = stack_size;
- size_t k;
- // Mark each worker slot as locked and unused
- for( k=0; k<number_of_workers; ++k ) {
- // All slots are set to null meaning that they are free
- ITT_SYNC_CREATE(a->slot + k, SyncType_Scheduler, SyncObj_WorkerTaskPool);
- ITT_SYNC_CREATE(&w[k].scheduler, SyncType_Scheduler, SyncObj_WorkerLifeCycleMgmt);
- ITT_SYNC_CREATE(&a->mailbox(k+1), SyncType_Scheduler, SyncObj_Mailbox);
- }
- // Mark rest of slots as unused
- for( ; k<number_of_slots; ++k ) {
- ITT_SYNC_CREATE(a->slot + k, SyncType_Scheduler, SyncObj_MasterTaskPool);
- ITT_SYNC_CREATE(&a->mailbox(k+1), SyncType_Scheduler, SyncObj_Mailbox);
- }
-
- return a;
-}
-
-inline void Arena::mark_pool_full() {
- // Double-check idiom that is deliberately sloppy about memory fences.
- // Technically, to avoid missed wakeups, there should be a full memory fence between the point we
- // released the task pool (i.e. spawned task) and read the gate's state. However, adding such a
- // 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().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().pool_state.compare_and_swap( SNAPSHOT_FULL, snapshot )==SNAPSHOT_EMPTY ) {
- if( snapshot!=SNAPSHOT_EMPTY ) {
- // This thread initialized s1 to "busy" and then another thread transitioned
- // pool_state to "empty" in the meantime, which caused the compare_and_swap above
- // to fail. Attempt to transition pool_state from "empty" to "full".
- if( prefix().pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
- // Some other thread transitioned pool_state from "empty", and hence became
- // responsible for waking up workers.
- return;
- }
- }
- // This thread transitioned pool from empty to full state, and thus is responsible for
- // telling RML that there is work to do.
- prefix().server->adjust_job_count_estimate( int(prefix().number_of_workers) );
- }
- }
-}
-
-bool Arena::check_if_pool_is_empty()
-{
- for(;;) {
- pool_state_t snapshot = prefix().pool_state;
- switch( snapshot ) {
- case SNAPSHOT_EMPTY:
- case SNAPSHOT_SERVER_GOING_AWAY:
- return true;
- case SNAPSHOT_FULL: {
- // 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().pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {
- // Got permission. Take the snapshot.
- size_t n = prefix().limit;
- size_t k;
- for( k=0; k<n; ++k )
- if( slot[k].task_pool != EmptyTaskPool && slot[k].head < slot[k].tail )
- break;
- // Test and test-and-set.
- if( prefix().pool_state==busy ) {
- if( k>=n ) {
- if( prefix().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.
- prefix().server->adjust_job_count_estimate( -int(prefix().number_of_workers) );
- return true;
- }
- } else {
- // Undo previous transition SNAPSHOT_FULL-->busy, unless another thread undid it.
- prefix().pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
- }
- }
- }
- return false;
- }
- default:
- // Another thread is taking a snapshot.
- return false;
- }
- }
-}
-
-void Arena::terminate_workers() {
- for(;;) {
- pool_state_t snapshot = prefix().pool_state;
- if( snapshot==SNAPSHOT_SERVER_GOING_AWAY )
- break;
- if( prefix().pool_state.compare_and_swap( SNAPSHOT_SERVER_GOING_AWAY, snapshot )==snapshot ) {
- if( snapshot!=SNAPSHOT_EMPTY )
- prefix().server->adjust_job_count_estimate( -int(prefix().number_of_workers) );
- break;
- }
- }
- prefix().server->request_close_connection();
-}
-
-
-#if COUNT_TASK_NODES
-intptr Arena::workers_task_node_count() {
- intptr result = 0;
- for( unsigned i=0; i<prefix().number_of_workers; ++i ) {
- GenericScheduler* s = prefix().worker_list[i].scheduler;
- if( s )
- result += s->task_node_count;
- }
- return result;
-}
-#endif
-
-//------------------------------------------------------------------------
-// Methods of GenericScheduler
-//------------------------------------------------------------------------
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- // Suppress overzealous compiler warning about using 'this' in base initializer list.
- #pragma warning(push)
- #pragma warning(disable:4355)
-#endif
-
-GenericScheduler::GenericScheduler( Arena* arena_ ) :
- arena_index(null_arena_index),
- task_pool_size(0),
- arena_slot(&dummy_slot),
- arena(arena_),
- random( unsigned(this-(GenericScheduler*)NULL) ),
- free_list(NULL),
- innermost_running_task(NULL),
- dummy_task(NULL),
- ref_count(1),
- my_affinity_id(0),
- is_registered(false),
- is_auto_initialized(false),
-#if __TBB_SCHEDULER_OBSERVER
- local_last_observer_proxy(NULL),
-#endif /* __TBB_SCHEDULER_OBSERVER */
-#if COUNT_TASK_NODES
- task_node_count(0),
-#endif /* COUNT_TASK_NODES */
-#if STATISTICS
- current_active(0),
- current_length(0),
- current_big_malloc(0),
- execute_count(0),
- steal_count(0),
- mail_received_count(0),
- proxy_execute_count(0),
- proxy_steal_count(0),
- proxy_bypass_count(0),
-#endif /* STATISTICS */
- small_task_count(1), // Extra 1 is a guard reference
- return_list(NULL)
-{
- dummy_slot.task_pool = allocate_task_pool( min_task_pool_size );
- dummy_slot.head = dummy_slot.tail = 0;
- dummy_task = &allocate_task( sizeof(task), __TBB_CONTEXT_ARG(NULL, NULL) );
-#if __TBB_EXCEPTIONS
- context_list_head.my_prev = &context_list_head;
- context_list_head.my_next = &context_list_head;
- ITT_SYNC_CREATE(&context_list_mutex, SyncType_Scheduler, SyncObj_ContextsList);
-#endif /* __TBB_EXCEPTIONS */
- dummy_task->prefix().ref_count = 2;
- ITT_SYNC_CREATE(&dummy_task->prefix().ref_count, SyncType_Scheduler, SyncObj_WorkerLifeCycleMgmt);
- ITT_SYNC_CREATE(&return_list, SyncType_Scheduler, SyncObj_TaskReturnList);
- __TBB_ASSERT( assert_okay(), "constructor error" );
-}
-
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- #pragma warning(pop)
-#endif // warning 4355 is back
-
-#if TBB_USE_ASSERT
-bool GenericScheduler::assert_okay() const {
-#if TBB_USE_ASSERT>=2||TEST_ASSEMBLY_ROUTINES
- acquire_task_pool();
- task** tp = dummy_slot.task_pool;
- __TBB_ASSERT( task_pool_size >= min_task_pool_size, NULL );
- __TBB_ASSERT( arena_slot->head <= arena_slot->tail, NULL );
- for ( size_t i = arena_slot->head; i < arena_slot->tail; ++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" );
- }
- release_task_pool();
-#endif /* TBB_USE_ASSERT>=2||TEST_ASSEMBLY_ROUTINES */
- return true;
-}
-#endif /* TBB_USE_ASSERT */
-
-#if __TBB_EXCEPTIONS
-
-void GenericScheduler::propagate_cancellation () {
- spin_mutex::scoped_lock lock(context_list_mutex);
- // Acquire fence is necessary to ensure that the subsequent node->my_next load
- // returned the correct value in case it was just inserted in another thread.
- // The fence also ensures visibility of the correct my_parent value.
- context_list_node_t *node = __TBB_load_with_acquire(context_list_head.my_next);
- while ( node != &context_list_head ) {
- task_group_context *ctx = __TBB_get_object_addr(task_group_context, my_node, node);
- // The absence of acquire fence while reading my_cancellation_requested may result
- // in repeated traversals of the same parents chain if another group (precedent or
- // descendant) belonging to the tree being canceled sends cancellation request of
- // its own around the same time.
- if ( !ctx->my_cancellation_requested )
- ctx->propagate_cancellation_from_ancestors();
- node = node->my_next;
- __TBB_ASSERT( ctx->is_alive(), "Walked into a destroyed context while propagating cancellation" );
- }
-}
-
-/** Propagates cancellation down the tree of dependent contexts by walking each
- thread's local list of contexts **/
-void GenericScheduler::propagate_cancellation ( task_group_context* ctx ) {
- __TBB_ASSERT ( ctx->my_cancellation_requested, "No cancellation request in the context" );
- // The whole propagation algorithm is under the lock in order to ensure correctness
- // in case of parallel cancellations at the different levels of the context tree.
- // See the note 2 at the bottom of the file.
- mutex::scoped_lock lock(the_scheduler_list_mutex);
- // Advance global cancellation state
- __TBB_FetchAndAddWrelease(&global_cancel_count, 1);
- // First propagate to workers using arena to access their context lists
- size_t num_workers = arena->prefix().number_of_workers;
- for ( size_t i = 0; i < num_workers; ++i ) {
- // No fence is necessary here since the context list of worker's scheduler
- // can contain anything of interest only after the first stealing was done
- // by that worker. And doing it applies the necessary fence
- GenericScheduler *s = arena->prefix().worker_list[i].scheduler;
- // If the worker is in the middle of its startup sequence, skip it.
- if ( s )
- s->propagate_cancellation();
- }
- // Then propagate to masters using the global list of master's schedulers
- scheduler_list_node_t *node = the_scheduler_list_head.my_next;
- while ( node != &the_scheduler_list_head ) {
- __TBB_get_object_addr(GenericScheduler, my_node, node)->propagate_cancellation();
- node = node->my_next;
- }
- // Now sync up the local counters
- for ( size_t i = 0; i < num_workers; ++i ) {
- GenericScheduler *s = arena->prefix().worker_list[i].scheduler;
- // If the worker is in the middle of its startup sequence, skip it.
- if ( s )
- s->local_cancel_count = global_cancel_count;
- }
- node = the_scheduler_list_head.my_next;
- while ( node != &the_scheduler_list_head ) {
- __TBB_get_object_addr(GenericScheduler, my_node, node)->local_cancel_count = global_cancel_count;
- node = node->my_next;
- }
-}
-#endif /* __TBB_EXCEPTIONS */
-
-
-
-void GenericScheduler::init_stack_info () {
- // Stacks are growing top-down. Highest address is called "stack base",
- // and the lowest is "stack limit".
-#if USE_WINTHREAD
-#if defined(_MSC_VER)&&_MSC_VER<1400 && !_WIN64
- NT_TIB *pteb = (NT_TIB*)__TBB_machine_get_current_teb();
-#else
- NT_TIB *pteb = (NT_TIB*)NtCurrentTeb();
-#endif
- __TBB_ASSERT( &pteb < pteb->StackBase && &pteb > pteb->StackLimit, "invalid stack info in TEB" );
- __TBB_ASSERT( arena->prefix().stack_size>0, "stack_size not initialized?" );
- // 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.
- // And for master threads we rely on the following fact and assumption:
- // - the default stack size of a master thread on Windows is 1M;
- // - if it was explicitly set by the application it is at least as large as the size of a worker stack.
- if ( is_worker() || arena->prefix().stack_size < MByte )
- my_stealing_threshold = (uintptr_t)pteb->StackBase - arena->prefix().stack_size / 2;
- 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
- // is that the main thread's stack size is not less than that of other threads.
- size_t stack_size = arena->prefix().stack_size;
- void *stack_base = &stack_size;
-#if __TBB_ipf
- void *rsb_base = __TBB_get_bsp();
-#endif
-#if __linux__
- size_t np_stack_size = 0;
- void *stack_limit = NULL;
- pthread_attr_t attr_stack, np_attr_stack;
- if( 0 == pthread_getattr_np(pthread_self(), &np_attr_stack) ) {
- if ( 0 == pthread_attr_getstack(&np_attr_stack, &stack_limit, &np_stack_size) ) {
- if ( 0 == pthread_attr_init(&attr_stack) ) {
- if ( 0 == pthread_attr_getstacksize(&attr_stack, &stack_size) )
- {
- stack_base = (char*)stack_limit + np_stack_size;
- if ( np_stack_size < stack_size ) {
- // We are in a secondary thread. Use reliable data.
-#if __TBB_ipf
- // IA64 stack is split into RSE backup and memory parts
- rsb_base = stack_limit;
- stack_size = np_stack_size/2;
-#else
- stack_size = np_stack_size;
-#endif /* !__TBB_ipf */
- }
- // 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.
- }
- pthread_attr_destroy(&attr_stack);
- }
- }
- pthread_attr_destroy(&np_attr_stack);
- }
-#endif /* __linux__ */
- __TBB_ASSERT( stack_size>0, "stack size must be positive" );
- my_stealing_threshold = (uintptr_t)((char*)stack_base - stack_size/2);
-#if __TBB_ipf
- my_rsb_stealing_threshold = (uintptr_t)((char*)rsb_base + stack_size/2);
-#endif
-#endif /* USE_PTHREAD */
-}
-
-task** GenericScheduler::allocate_task_pool( size_t n ) {
- __TBB_ASSERT( n > task_pool_size, "Cannot shrink the task pool" );
- size_t byte_size = ((n * sizeof(task*) + NFS_MaxLineSize - 1) / NFS_MaxLineSize) * NFS_MaxLineSize;
- task_pool_size = byte_size / sizeof(task*);
- task** new_pool = (task**)NFS_Allocate( byte_size, 1, NULL );
- // No need to clear the fresh deque since valid items are designated by the head and tail members.
-#if TBB_USE_ASSERT>=2
- // But clear it in the high vigilance debug mode
- memset( new_pool, -1, n );
-#endif /* TBB_USE_ASSERT>=2 */
- return new_pool;
-}
-
-void GenericScheduler::grow( size_t new_size ) {
- __TBB_ASSERT( assert_okay(), NULL );
- if ( new_size < 2 * task_pool_size )
- new_size = 2 * task_pool_size;
- task** new_pool = allocate_task_pool( new_size ); // updates task_pool_size
- task** old_pool = dummy_slot.task_pool;
- acquire_task_pool(); // requires the old dummy_slot.task_pool value
- // arena_slot->tail should not be updated before arena_slot->head because their
- // values are used by other threads to check if this task pool is empty.
- size_t new_tail = arena_slot->tail - arena_slot->head;
- __TBB_ASSERT( new_tail <= task_pool_size, "new task pool is too short" );
- memcpy( new_pool, old_pool + arena_slot->head, new_tail * sizeof(task*) );
- arena_slot->head = 0;
- arena_slot->tail = new_tail;
- dummy_slot.task_pool = new_pool;
- release_task_pool(); // updates the task pool pointer in our arena slot
- free_task_pool( old_pool );
- __TBB_ASSERT( assert_okay(), NULL );
-}
-
-
-GenericScheduler* GenericScheduler::allocate_scheduler( Arena* arena ) {
- switch( SchedulerTraitsId ) {
- /* DefaultSchedulerTraits::id is listed explicitly as a case so that the host compiler
- will issue an error message if it is the same as another id in the list. */
- default:
- case DefaultSchedulerTraits::id:
- return CustomScheduler<DefaultSchedulerTraits>::allocate_scheduler(arena);
- case IntelSchedulerTraits::id:
- return CustomScheduler<IntelSchedulerTraits>::allocate_scheduler(arena);
- }
-}
-
-void GenericScheduler::free_scheduler() {
- if( in_arena() ) {
- acquire_task_pool();
- leave_arena();
- }
-#if __TBB_EXCEPTIONS
- task_group_context* &context = dummy_task->prefix().context;
- // Only master thread's dummy task has a context
- if ( context != &dummy_context) {
- //! \todo Add assertion that master's dummy task context does not have children
- context->task_group_context::~task_group_context();
- NFS_Free(context);
- {
- mutex::scoped_lock lock(the_scheduler_list_mutex);
- my_node.my_next->my_prev = my_node.my_prev;
- my_node.my_prev->my_next = my_node.my_next;
- }
- }
-#endif /* __TBB_EXCEPTIONS */
- free_task<is_small_local>( *dummy_task );
-
- // k accounts for a guard reference and each task that we deallocate.
- intptr k = 1;
- for(;;) {
- while( task* t = free_list ) {
- free_list = t->prefix().next;
- deallocate_task(*t);
- ++k;
- }
- if( return_list==plugged_return_list() )
- break;
- free_list = (task*)__TBB_FetchAndStoreW( &return_list, (intptr)plugged_return_list() );
- }
-
-#if COUNT_TASK_NODES
- arena->prefix().task_node_count += task_node_count;
-#endif /* COUNT_TASK_NODES */
-#if STATISTICS
- the_statistics.record( execute_count, steal_count, mail_received_count,
- proxy_execute_count, proxy_steal_count, proxy_bypass_count );
-#endif /* STATISTICS */
- free_task_pool( dummy_slot.task_pool );
- dummy_slot.task_pool = NULL;
- // Update small_task_count last. Doing so sooner might cause another thread to free *this.
- __TBB_ASSERT( small_task_count>=k, "small_task_count corrupted" );
- Governor::sign_off(this);
- if( __TBB_FetchAndAddW( &small_task_count, -k )==k )
- NFS_Free( this );
-}
-
-/** ATTENTION:
- This method is mostly the same as GenericScheduler::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 GenericScheduler::acquire_task_pool() const {
- if ( !in_arena() )
- return; // we are not in arena - nothing to lock
- atomic_backoff backoff;
- bool sync_prepare_done = false;
- for(;;) {
-#if TBB_USE_ASSERT
- __TBB_ASSERT( arena_slot == arena->slot + arena_index, "invalid arena slot index" );
- // 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 = arena_slot->task_pool;
- __TBB_ASSERT( tp == LockedTaskPool || tp == dummy_slot.task_pool, "slot ownership corrupt?" );
-#endif
- if( arena_slot->task_pool != LockedTaskPool &&
- __TBB_CompareAndSwapW( &arena_slot->task_pool, (intptr_t)LockedTaskPool,
- (intptr_t)dummy_slot.task_pool ) == (intptr_t)dummy_slot.task_pool )
- {
- // We acquired our own slot
- ITT_NOTIFY(sync_acquired, arena_slot);
- break;
- }
- else if( !sync_prepare_done ) {
- // Start waiting
- ITT_NOTIFY(sync_prepare, arena_slot);
- sync_prepare_done = true;
- }
- // Someone else acquired a lock, so pause and do exponential backoff.
- backoff.pause();
-#if TEST_ASSEMBLY_ROUTINES
- __TBB_ASSERT( arena_slot->task_pool == LockedTaskPool ||
- arena_slot->task_pool == dummy_slot.task_pool, NULL );
-#endif /* TEST_ASSEMBLY_ROUTINES */
- }
- __TBB_ASSERT( arena_slot->task_pool == LockedTaskPool, "not really acquired task pool" );
-} // GenericScheduler::acquire_task_pool
-
-inline void GenericScheduler::release_task_pool() const {
- if ( !in_arena() )
- return; // we are not in arena - nothing to unlock
- __TBB_ASSERT( arena_slot, "we are not in arena" );
- __TBB_ASSERT( arena_slot->task_pool == LockedTaskPool, "arena slot is not locked" );
- ITT_NOTIFY(sync_releasing, arena_slot);
- __TBB_store_with_release( arena_slot->task_pool, dummy_slot.task_pool );
-}
-
-/** ATTENTION:
- This method is mostly the same as GenericScheduler::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** GenericScheduler::lock_task_pool( ArenaSlot* victim_arena_slot ) const {
- task** victim_task_pool;
- atomic_backoff backoff;
- bool sync_prepare_done = false;
- for(;;) {
- victim_task_pool = victim_arena_slot->task_pool;
- // TODO: Investigate the effect of bailing out on the locked pool without trying to lock it.
- // When doing this update assertion in the end of the method.
- if ( victim_task_pool == EmptyTaskPool ) {
- // The victim thread emptied its task pool - nothing to lock
- if( sync_prepare_done )
- ITT_NOTIFY(sync_cancel, victim_arena_slot);
- break;
- }
- if( victim_task_pool != LockedTaskPool &&
- __TBB_CompareAndSwapW( &victim_arena_slot->task_pool,
- (intptr_t)LockedTaskPool, (intptr_t)victim_task_pool ) == (intptr_t)victim_task_pool )
- {
- // We've locked victim's task pool
- ITT_NOTIFY(sync_acquired, victim_arena_slot);
- break;
- }
- else if( !sync_prepare_done ) {
- // Start waiting
- ITT_NOTIFY(sync_prepare, victim_arena_slot);
- sync_prepare_done = true;
- }
- // 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),
- "not really locked victim's task pool?" );
- return victim_task_pool;
-} // GenericScheduler::lock_task_pool
-
-inline void GenericScheduler::unlock_task_pool( ArenaSlot* 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" );
- ITT_NOTIFY(sync_releasing, victim_arena_slot);
- __TBB_store_with_release( victim_arena_slot->task_pool, victim_task_pool );
-}
-
-
-inline task* GenericScheduler::prepare_for_spawning( task* t ) {
- __TBB_ASSERT( t->state()==task::allocated, "attempt to spawn task that is not in 'allocated' state" );
- t->prefix().owner = this;
- t->prefix().state = task::ready;
-#if TBB_USE_ASSERT
- if( task* parent = t->parent() ) {
- internal::reference_count ref_count = parent->prefix().ref_count;
- __TBB_ASSERT( ref_count>=0, "attempt to spawn task whose parent has a ref_count<0" );
- __TBB_ASSERT( ref_count!=0, "attempt to spawn task whose parent has a ref_count==0 (forgot to set_ref_count?)" );
- parent->prefix().extra_state |= es_ref_count_active;
- }
-#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" );
- if( dst_thread != 0 && dst_thread != my_affinity_id ) {
- 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 = &arena->mailbox(dst_thread);
- proxy.task_and_tag = intptr(t)|3;
- proxy.next_in_mailbox = NULL;
- ITT_NOTIFY( sync_releasing, proxy.outbox );
- // Mail the proxy - after this point t may be destroyed by another thread at any moment.
- proxy.outbox->push(proxy);
- return &proxy;
- }
- return t;
-}
-
-/** Conceptually, this method should be a member of class scheduler.
- But doing so would force us to publish class scheduler in the headers. */
-void GenericScheduler::local_spawn( task& first, task*& next ) {
- __TBB_ASSERT( Governor::is_set(this), NULL );
- __TBB_ASSERT( assert_okay(), NULL );
- if ( &first.prefix().next == &next ) {
- // Single task is being spawned
- if ( arena_slot->tail == task_pool_size ) {
- // 1 compensates for head possibly temporarily incremented by a thief
- if ( arena_slot->head > 1 ) {
- // Move the busy part of the deque to the beginning of the allocated space
- acquire_task_pool();
- arena_slot->tail -= arena_slot->head;
- memmove( dummy_slot.task_pool, dummy_slot.task_pool + arena_slot->head, arena_slot->tail * sizeof(task*) );
- arena_slot->head = 0;
- release_task_pool();
- }
- else {
- grow( task_pool_size + 1 );
- }
- }
- dummy_slot.task_pool[arena_slot->tail] = prepare_for_spawning( &first );
- ITT_NOTIFY(sync_releasing, arena_slot);
- // The following store with release is required on ia64 only
- size_t new_tail = arena_slot->tail + 1;
- __TBB_store_with_release( arena_slot->tail, new_tail );
- __TBB_ASSERT ( arena_slot->tail <= task_pool_size, "task deque end was overwritten" );
- }
- else {
- // Task list is being spawned
- const size_t initial_capacity = 64;
- task *arr[initial_capacity];
- fast_reverse_vector<task*> tasks(arr, initial_capacity);
- task *t_next = NULL;
- for( task* t = &first; ; t = t_next ) {
- // After prepare_for_spawning returns t may already have been destroyed.
- // So milk it while it is alive.
- bool end = &t->prefix().next == &next;
- t_next = t->prefix().next;
- tasks.push_back( prepare_for_spawning(t) );
- if( end )
- break;
- }
- size_t num_tasks = tasks.size();
- __TBB_ASSERT ( arena_index != null_arena_index, "invalid arena slot index" );
- if ( arena_slot->tail + num_tasks > task_pool_size ) {
- // 1 compensates for head possibly temporarily incremented by a thief
- size_t new_size = arena_slot->tail - arena_slot->head + num_tasks + 1;
- if ( new_size <= task_pool_size ) {
- // Move the busy part of the deque to the beginning of the allocated space
- acquire_task_pool();
- arena_slot->tail -= arena_slot->head;
- memmove( dummy_slot.task_pool, dummy_slot.task_pool + arena_slot->head, arena_slot->tail * sizeof(task*) );
- arena_slot->head = 0;
- release_task_pool();
- }
- else {
- grow( new_size );
- }
- }
-#if DO_ITT_NOTIFY
- else {
- // The preceding if-branch issues the same ittnotify inside release_task_pool() or grow() methods
- ITT_NOTIFY(sync_releasing, arena_slot);
- }
-#endif /* DO_ITT_NOTIFY */
- tasks.copy_memory( dummy_slot.task_pool + arena_slot->tail );
- // The following store with release is required on ia64 only
- size_t new_tail = arena_slot->tail + num_tasks;
- __TBB_store_with_release( arena_slot->tail, new_tail );
- __TBB_ASSERT ( arena_slot->tail <= task_pool_size, "task deque end was overwritten" );
- }
- if ( !in_arena() ) {
- if ( is_worker() )
- enter_arena();
- else
- try_enter_arena();
- }
-
- arena->mark_pool_full();
- __TBB_ASSERT( assert_okay(), NULL );
-
- TBB_TRACE(("%p.internal_spawn exit\n", this ));
-}
-
-void GenericScheduler::local_spawn_root_and_wait( task& first, task*& next ) {
- __TBB_ASSERT( Governor::is_set(this), NULL );
- __TBB_ASSERT( &first, NULL );
- auto_empty_task dummy( __TBB_CONTEXT_ARG(this, first.prefix().context) );
- internal::reference_count n = 0;
- for( task* t=&first; ; t=t->prefix().next ) {
- ++n;
- __TBB_ASSERT( !t->prefix().parent, "not a root task, or already running" );
- t->prefix().parent = &dummy;
- if( &t->prefix().next==&next ) break;
-#if __TBB_EXCEPTIONS
- __TBB_ASSERT( t->prefix().context == t->prefix().next->prefix().context,
- "all the root tasks in list must share the same context");
-#endif /* __TBB_EXCEPTIONS */
- }
- dummy.prefix().ref_count = n+1;
- if( n>1 )
- local_spawn( *first.prefix().next, next );
- TBB_TRACE(("spawn_root_and_wait((task_list*)%p): calling %p.loop\n",&first,this));
- local_wait_for_all( dummy, &first );
- TBB_TRACE(("spawn_root_and_wait((task_list*)%p): return\n",&first));
-}
-
-inline task* GenericScheduler::get_mailbox_task() {
- __TBB_ASSERT( my_affinity_id>0, "not in arena" );
- task* result = NULL;
- while( task_proxy* t = inbox.pop() ) {
- intptr 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.
- ITT_NOTIFY( sync_acquired, inbox.outbox() );
- result = (task*)(tat & ~3);
- result->prefix().owner = this;
- break;
- }
- free_task_proxy( *t );
- }
- return result;
-}
-
-inline task* GenericScheduler::strip_proxy( task_proxy* tp ) {
- __TBB_ASSERT( tp->prefix().extra_state==es_task_proxy, NULL );
- intptr 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;
-}
-
-inline task* GenericScheduler::get_task() {
- task* result = NULL;
-retry:
- --arena_slot->tail;
- __TBB_rel_acq_fence();
- if ( (intptr_t)arena_slot->head > (intptr_t)arena_slot->tail ) {
- acquire_task_pool();
- if ( (intptr_t)arena_slot->head <= (intptr_t)arena_slot->tail ) {
- // The thief backed off - grab the task
- __TBB_ASSERT_VALID_TASK_PTR( dummy_slot.task_pool[arena_slot->tail] );
- result = dummy_slot.task_pool[arena_slot->tail];
- __TBB_POISON_TASK_PTR( dummy_slot.task_pool[arena_slot->tail] );
- }
- else {
- __TBB_ASSERT ( arena_slot->head == arena_slot->tail + 1, "victim/thief arbitration algorithm failure" );
- }
- if ( (intptr_t)arena_slot->head < (intptr_t)arena_slot->tail ) {
- release_task_pool();
- }
- else {
- // In any case the deque is empty now, so compact it
- arena_slot->head = arena_slot->tail = 0;
- if ( in_arena() )
- leave_arena();
- }
- }
- else {
- __TBB_ASSERT_VALID_TASK_PTR( dummy_slot.task_pool[arena_slot->tail] );
- result = dummy_slot.task_pool[arena_slot->tail];
- __TBB_POISON_TASK_PTR( dummy_slot.task_pool[arena_slot->tail] );
- }
- if( result && is_proxy(*result) ) {
- result = strip_proxy((task_proxy*)result);
- if( !result ) {
- goto retry;
- }
- GATHER_STATISTIC( ++proxy_execute_count );
- // Following assertion should be true because TBB 2.0 tasks never specify affinity, and hence are not proxied.
- __TBB_ASSERT( is_version_3_task(*result), "backwards compatibility with TBB 2.0 broken" );
- // Task affinity has changed.
- innermost_running_task = result;
- result->note_affinity(my_affinity_id);
- }
- return result;
-} // GenericScheduler::get_task
-
-task* GenericScheduler::steal_task( ArenaSlot& victim_slot ) {
- task** victim_pool = lock_task_pool( &victim_slot );
- if ( !victim_pool )
- return NULL;
- const size_t none = ~0u;
- size_t first_skipped_proxy = none;
- task* result = NULL;
-retry:
- ++victim_slot.head;
- __TBB_rel_acq_fence();
- if ( (intptr_t)victim_slot.head > (intptr_t)victim_slot.tail ) {
- --victim_slot.head;
- }
- else {
- __TBB_ASSERT_VALID_TASK_PTR( victim_pool[victim_slot.head - 1]);
- result = victim_pool[victim_slot.head - 1];
- 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 ( first_skipped_proxy == none )
- first_skipped_proxy = victim_slot.head - 1;
- result = NULL;
- goto retry;
- }
- }
- __TBB_POISON_TASK_PTR(victim_pool[victim_slot.head - 1]);
- }
- if ( first_skipped_proxy != none ) {
- if ( result ) {
- victim_pool[victim_slot.head - 1] = victim_pool[first_skipped_proxy];
- __TBB_POISON_TASK_PTR( victim_pool[first_skipped_proxy] );
- __TBB_store_with_release( victim_slot.head, first_skipped_proxy + 1 );
- }
- else
- __TBB_store_with_release( victim_slot.head, first_skipped_proxy );
- }
- unlock_task_pool( &victim_slot, victim_pool );
- return result;
-}
-
-template<typename SchedulerTraits>
-task* CustomScheduler<SchedulerTraits>::receive_or_steal_task( reference_count& completion_ref_count,
- bool return_if_no_work ) {
- task* t = NULL;
- inbox.set_is_idle( true );
- // 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) {
- if( completion_ref_count==1 ) {
- if( SchedulerTraits::itt_possible ) {
- if( failure_count!=-1 ) {
- ITT_NOTIFY(sync_prepare, &completion_ref_count);
- // Notify Intel(R) Thread Profiler that thread has stopped spinning.
- ITT_NOTIFY(sync_acquired, this);
- }
- ITT_NOTIFY(sync_acquired, &completion_ref_count);
- }
- inbox.set_is_idle( false );
- return NULL;
- }
- size_t n = arena->prefix().limit;
- if( n>1 ) {
- if( my_affinity_id && (t=get_mailbox_task()) ) {
- GATHER_STATISTIC( ++mail_received_count );
- } else {
- // Try to steal a task from a random victim.
- if ( !can_steal() )
- goto fail;
- size_t k = random.get() % (n-1);
- ArenaSlot* victim = &arena->slot[k];
- // The following condition excludes the master that might have
- // already taken our previous place in the arena from the list .
- // of potential victims. But since such a situation can take
- // place only in case of significant oversubscription, keeping
- // the checks simple seems to be preferable to complicating the code.
- if( k >= arena_index )
- ++victim; // Adjusts random distribution to exclude self
- t = steal_task( *victim );
- if( !t ) goto fail;
- if( is_proxy(*t) ) {
- t = strip_proxy((task_proxy*)t);
- if( !t ) goto fail;
- GATHER_STATISTIC( ++proxy_steal_count );
- }
- t->prefix().extra_state |= es_task_is_stolen;
- if( is_version_3_task(*t) ) {
- innermost_running_task = t;
- t->note_affinity( my_affinity_id );
- }
- GATHER_STATISTIC( ++steal_count );
- }
- __TBB_ASSERT(t,NULL);
-#if __TBB_SCHEDULER_OBSERVER
- // No memory fence required for read of global_last_observer_proxy, because prior fence on steal/mailbox suffices.
- if( local_last_observer_proxy!=global_last_observer_proxy ) {
- notify_entry_observers();
- }
-#endif /* __TBB_SCHEDULER_OBSERVER */
- if( SchedulerTraits::itt_possible ) {
- if( failure_count!=-1 ) {
- // FIXME - might be victim, or might be selected from a mailbox
- // Notify Intel(R) Thread Profiler that thread has stopped spinning.
- ITT_NOTIFY(sync_acquired, this);
- }
- }
- inbox.set_is_idle( false );
- break; // jumps to: return t;
- }
-fail:
- if( SchedulerTraits::itt_possible && failure_count==-1 ) {
- // The first attempt to steal work failed, so notify Intel(R) Thread Profiler that
- // the thread has started spinning. Ideally, we would do this notification
- // *before* the first failed attempt to steal, but at that point we do not
- // know that the steal will fail.
- ITT_NOTIFY(sync_prepare, this);
- failure_count = 0;
- }
- // Pause, even if we are going to yield, because the yield might return immediately.
- __TBB_Pause(PauseTime);
- int yield_threshold = 2*int(n);
- if( failure_count>=yield_threshold ) {
- __TBB_Yield();
- if( failure_count>=yield_threshold+100 ) {
- // When a worker thread has nothing to do, return it to RML.
- // For purposes of affinity support, the thread is considered idle while in RML.
- if( return_if_no_work && arena->check_if_pool_is_empty() )
- return NULL;
- failure_count = yield_threshold;
- }
- }
- }
- return t;
-}
-
-#define ConcurrentWaitsEnabled(t) (t.prefix().context->my_version_and_traits & task_group_context::concurrent_wait)
-#define CancellationInfoPresent(t) (t->prefix().context->my_cancellation_requested)
-
-#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
- // TbbCapturedException expression when exact propagation is enabled for the context.
- #define TbbCurrentException(context, TbbCapturedException) \
- context->my_version_and_traits & task_group_context::exact_exception \
- ? tbb_exception_ptr::allocate() \
- : tbb_exception_ptr::allocate( *(TbbCapturedException) );
-#endif /* !TBB_USE_CAPTURED_EXCEPTION */
-
-#define TbbRegisterCurrentException(context, TbbCapturedException) \
- if ( context->cancel_group_execution() ) { \
- /* We are the first to signal cancellation, so store the exception that caused it. */ \
- context->my_exception = TbbCurrentException( context, TbbCapturedException ); \
- }
-
-#define TbbCatchAll(context) \
- catch ( tbb_exception& exc ) { \
- TbbRegisterCurrentException( context, &exc ); \
- } catch ( std::exception& exc ) { \
- TbbRegisterCurrentException( context, captured_exception::allocate(typeid(exc).name(), exc.what()) ); \
- } catch ( ... ) { \
- TbbRegisterCurrentException( context, captured_exception::allocate("...", "Unidentified exception") );\
- }
-
-template<typename SchedulerTraits>
-void CustomScheduler<SchedulerTraits>::local_wait_for_all( task& parent, task* child ) {
- __TBB_ASSERT( Governor::is_set(this), NULL );
- if( child ) {
- child->prefix().owner = this;
- }
- __TBB_ASSERT( parent.ref_count() >= (child && child->parent() == &parent ? 2 : 1), "ref_count is too small" );
- __TBB_ASSERT( assert_okay(), NULL );
- // 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);
-#if __TBB_EXCEPTIONS
- __TBB_ASSERT( parent.prefix().context || (is_worker() && &parent == dummy_task), "parent task does not have context" );
-#endif /* __TBB_EXCEPTIONS */
- task* t = child;
- // Constants all_work_done and all_local_work_done are actually unreacheable
- // refcount values that prevent early quitting the dispatch loop. They are
- // defined to be in the middle of the range of negative values representable
- // by the reference_count type.
- static const reference_count
- // For nested dispatch loops in masters and any dispatch loops in workers
- parents_work_done = 1,
- // For outermost dispatch loops in masters
- all_work_done = (reference_count)3 << (sizeof(reference_count) * 8 - 2),
- // For termination dispatch loops in masters
- all_local_work_done = all_work_done + 1;
- reference_count quit_point;
- if( innermost_running_task == dummy_task ) {
- // We are in the outermost task dispatch loop of a master thread,
- __TBB_ASSERT( !is_worker(), NULL );
- quit_point = &parent == dummy_task ? all_local_work_done : all_work_done;
- } else {
- quit_point = parents_work_done;
- }
- task* old_innermost_running_task = innermost_running_task;
-#if __TBB_EXCEPTIONS
-exception_was_caught:
- try {
-#endif /* __TBB_EXCEPTIONS */
- // Outer loop steals tasks when necessary.
- for(;;) {
- // Middle loop evaluates tasks that are pulled off "array".
- do {
- // Inner loop evaluates tasks that are handed directly to us by other tasks.
- while(t) {
- __TBB_ASSERT( inbox.assert_is_idle(false), NULL );
-#if TBB_USE_ASSERT
- __TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
- __TBB_ASSERT( t->prefix().owner==this, NULL );
-#if __TBB_EXCEPTIONS
- if ( !t->prefix().context->my_cancellation_requested )
-#endif
- __TBB_ASSERT( 1L<<t->state() & (1L<<task::allocated|1L<<task::ready|1L<<task::reexecute), NULL );
- __TBB_ASSERT(assert_okay(),NULL);
-#endif /* TBB_USE_ASSERT */
- task* t_next = NULL;
- innermost_running_task = t;
- t->prefix().state = task::executing;
-#if __TBB_EXCEPTIONS
- if ( !t->prefix().context->my_cancellation_requested )
-#endif
- {
- TBB_TRACE(("%p.wait_for_all: %p.execute\n",this,t));
- GATHER_STATISTIC( ++execute_count );
- t_next = t->execute();
-#if STATISTICS
- if (t_next) {
- affinity_id next_affinity=t_next->prefix().affinity;
- if (next_affinity != 0 && next_affinity != my_affinity_id)
- GATHER_STATISTIC( ++proxy_bypass_count );
- }
-#endif
- }
- if( t_next ) {
- __TBB_ASSERT( t_next->state()==task::allocated,
- "if task::execute() returns task, it must be marked as allocated" );
- // The store here has a subtle secondary effect - it fetches *t_next into cache.
- t_next->prefix().owner = this;
- t_next->prefix().extra_state &= ~es_task_is_stolen;
- }
- __TBB_ASSERT(assert_okay(),NULL);
- switch( task::state_type(t->prefix().state) ) {
- case task::executing: {
- // this block was copied below to case task::recycle
- // when making changes, check it too
- task* s = t->parent();
- __TBB_ASSERT( innermost_running_task==t, NULL );
- __TBB_ASSERT( t->prefix().ref_count==0, "Task still has children after it has been executed" );
- t->~task();
- if( s ) {
- if( tally_completion_of_one_predecessor(*s) ) {
-#if TBB_USE_ASSERT
- s->prefix().extra_state &= ~es_ref_count_active;
-#endif /* TBB_USE_ASSERT */
- s->prefix().owner = this;
-
- if( !t_next ) {
- t_next = s;
- } else {
- local_spawn( *s, s->prefix().next );
- __TBB_ASSERT(assert_okay(),NULL);
- }
- }
- }
- free_task<no_hint>( *t );
- break;
- }
-
- case task::recycle: { // state set by recycle_as_safe_continuation()
- t->prefix().state = task::allocated;
- t->prefix().extra_state &= ~es_task_is_stolen;
- // for safe continuation, need atomically decrement ref_count;
- // the block was copied from above case task::executing, and changed.
- // Use "s" here as name for t, so that code resembles case task::executing more closely.
- task* const& s = t;
- if( tally_completion_of_one_predecessor(*s) ) {
- // Unused load is put here for sake of inserting an "acquire" fence.
-#if TBB_USE_ASSERT
- s->prefix().extra_state &= ~es_ref_count_active;
- __TBB_ASSERT( s->prefix().owner==this, "ownership corrupt?" );
-#endif /* TBB_USE_ASSERT */
- if( !t_next ) {
- t_next = s;
- } else {
- local_spawn( *s, s->prefix().next );
- __TBB_ASSERT(assert_okay(),NULL);
- }
- }
- break;
- }
-
- case task::reexecute: // set by recycle_to_reexecute()
- __TBB_ASSERT( t_next && t_next != t, "reexecution requires that method 'execute' return another task" );
- TBB_TRACE(("%p.wait_for_all: put task %p back into array",this,t));
- t->prefix().state = task::allocated;
- t->prefix().extra_state &= ~es_task_is_stolen;
- local_spawn( *t, t->prefix().next );
- __TBB_ASSERT(assert_okay(),NULL);
- break;
- case task::allocated:
- t->prefix().extra_state &= ~es_task_is_stolen;
- break;
-#if TBB_USE_ASSERT
- case task::ready:
- __TBB_ASSERT( false, "task is in READY state upon return from method execute()" );
- break;
- default:
- __TBB_ASSERT( false, "illegal state" );
-#else
- default: // just to shut up some compilation warnings
- break;
-#endif /* TBB_USE_ASSERT */
- }
-
- t = t_next;
- } // end of scheduler bypass loop
- __TBB_ASSERT(assert_okay(),NULL);
-
- // If the parent's descendants are finished with and we are not in
- // the outermost dispatch loop of a master thread, then we are done.
- // This is necessary to prevent unbounded stack growth in case of deep
- // wait_for_all nesting.
- // Note that we cannot return from master's outermost dispatch loop
- // until we process all the tasks in the local pool, since in case
- // of multiple masters this could have left some of them forever
- // waiting for their stolen children to be processed.
- if ( parent.prefix().ref_count == quit_point )
- break;
- t = get_task();
- __TBB_ASSERT(!t || !is_proxy(*t),"unexpected proxy");
-#if TBB_USE_ASSERT
- __TBB_ASSERT(assert_okay(),NULL);
- if(t) {
- AssertOkay(*t);
- __TBB_ASSERT( t->prefix().owner==this, "thread got task that it does not own" );
- }
-#endif /* TBB_USE_ASSERT */
- } while( t ); // end of local task array processing loop
-
- if ( quit_point == all_local_work_done ) {
- __TBB_ASSERT( arena_slot == &dummy_slot && arena_slot->head == 0 && arena_slot->tail == 0, NULL );
- innermost_running_task = old_innermost_running_task;
- return;
- }
- __TBB_ASSERT( arena->prefix().number_of_workers>0||parent.prefix().ref_count==1, "deadlock detected" );
- // old_innermost_running_task is NULL *iff* a worker thread is in its "inborn" dispath loop
- // (i.e. its execution stack is empty), and it should return from there if no work is available.
- t = receive_or_steal_task( parent.prefix().ref_count, !old_innermost_running_task );
- if (!t) {
- if( parent.prefix().ref_count==1 ) goto done;
- __TBB_ASSERT( is_worker() && !old_innermost_running_task, "a thread exits dispatch loop prematurely" );
- innermost_running_task = NULL;
- return;
- }
- __TBB_ASSERT(t,NULL);
- __TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
- t->prefix().owner = this;
- } // end of stealing loop
-#if __TBB_EXCEPTIONS
- } TbbCatchAll( t->prefix().context );
-
- if( task::state_type(t->prefix().state) == task::recycle ) { // state set by recycle_as_safe_continuation()
- t->prefix().state = task::allocated;
- // for safe continuation, need to atomically decrement ref_count;
- if( SchedulerTraits::itt_possible )
- ITT_NOTIFY(sync_releasing, &t->prefix().ref_count);
- if( __TBB_FetchAndDecrementWrelease(&t->prefix().ref_count)==1 ) {
- if( SchedulerTraits::itt_possible )
- ITT_NOTIFY(sync_acquired, &t->prefix().ref_count);
- }else{
- t = NULL;
- }
- }
- goto exception_was_caught;
-#endif /* __TBB_EXCEPTIONS */
-done:
- if ( !ConcurrentWaitsEnabled(parent) )
- parent.prefix().ref_count = 0;
-#if TBB_USE_ASSERT
- parent.prefix().extra_state &= ~es_ref_count_active;
-#endif /* TBB_USE_ASSERT */
- innermost_running_task = old_innermost_running_task;
-#if __TBB_EXCEPTIONS
- __TBB_ASSERT(parent.prefix().context && dummy_task->prefix().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 ( innermost_running_task == dummy_task && parent_ctx == dummy_task->prefix().context ) {
- // 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;
- __TBB_ASSERT(dummy_task->prefix().context == parent_ctx || !CancellationInfoPresent(dummy_task),
- "Unexpected exception or cancellation data in the dummy task");
- // If possible, add assertion that master's dummy task context does not have children
- }
- if ( pe )
- pe->throw_self();
- }
- __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(dummy_task),
- "Worker's dummy task context modified");
- __TBB_ASSERT(innermost_running_task != dummy_task || !CancellationInfoPresent(dummy_task),
- "Unexpected exception or cancellation data in the master's dummy task");
-#endif /* __TBB_EXCEPTIONS */
- __TBB_ASSERT( assert_okay(), NULL );
-}
-
-#undef CancellationInfoPresent
-
-inline void GenericScheduler::do_enter_arena() {
- arena_slot = &arena->slot[arena_index];
- __TBB_ASSERT ( arena_slot->head == arena_slot->tail, "task deque of a free slot must be empty" );
- arena_slot->head = dummy_slot.head;
- arena_slot->tail = dummy_slot.tail;
- // Release signal on behalf of previously spawned tasks (when this thread was not in arena yet)
- ITT_NOTIFY(sync_releasing, arena_slot);
- __TBB_store_with_release( arena_slot->task_pool, dummy_slot.task_pool );
- // We'll leave arena only when it's empty, so clean up local instances of indices.
- dummy_slot.head = dummy_slot.tail = 0;
-}
-
-void GenericScheduler::enter_arena() {
- __TBB_ASSERT ( is_worker(), "only workers should use enter_arena()" );
- __TBB_ASSERT ( arena, "no arena: initialization not completed?" );
- __TBB_ASSERT ( !in_arena(), "worker already in arena?" );
- __TBB_ASSERT ( arena_index < arena->prefix().number_of_workers, "invalid worker arena slot index" );
- __TBB_ASSERT ( arena->slot[arena_index].task_pool == EmptyTaskPool, "someone else grabbed my arena slot?" );
- do_enter_arena();
-}
-
-void GenericScheduler::try_enter_arena() {
- __TBB_ASSERT ( !is_worker(), "only masters should use try_enter_arena()" );
- __TBB_ASSERT ( arena, "no arena: initialization not completed?" );
- __TBB_ASSERT ( !in_arena(), "master already in arena?" );
- __TBB_ASSERT ( arena_index >= arena->prefix().number_of_workers &&
- arena_index < arena->prefix().number_of_slots, "invalid arena slot hint value" );
-
-
- size_t h = arena_index;
- // We do not lock task pool upon successful entering arena
- if( arena->slot[h].task_pool != EmptyTaskPool ||
- __TBB_CompareAndSwapW( &arena->slot[h].task_pool, (intptr_t)LockedTaskPool,
- (intptr_t)EmptyTaskPool ) != (intptr_t)EmptyTaskPool )
- {
- // Hinted arena slot is already busy, try some of the others at random
- unsigned first = arena->prefix().number_of_workers,
- last = arena->prefix().number_of_slots;
- unsigned n = last - first - 1;
- /// \todo Is this limit reasonable?
- size_t max_attempts = last - first;
- for (;;) {
- size_t k = first + random.get() % n;
- if( k >= h )
- ++k; // Adjusts random distribution to exclude previously tried slot
- h = k;
- if( arena->slot[h].task_pool == EmptyTaskPool &&
- __TBB_CompareAndSwapW( &arena->slot[h].task_pool, (intptr_t)LockedTaskPool,
- (intptr_t)EmptyTaskPool ) == (intptr_t)EmptyTaskPool )
- {
- break;
- }
- if ( --max_attempts == 0 ) {
- // After so many attempts we are still unable to find a vacant arena slot.
- // Cease the vain effort and work outside of arena for a while.
- return;
- }
- }
- }
- // Successfully claimed a slot in the arena.
- ITT_NOTIFY(sync_acquired, &arena->slot[h]);
- __TBB_ASSERT ( arena->slot[h].task_pool == LockedTaskPool, "Arena slot is not actually acquired" );
- arena_index = h;
- do_enter_arena();
- attach_mailbox( affinity_id(h+1) );
-}
-
-void GenericScheduler::leave_arena() {
- __TBB_ASSERT( in_arena(), "Not in arena" );
- // Do not reset arena_index. It will be used to (attempt to) re-acquire the slot next time
- __TBB_ASSERT( &arena->slot[arena_index] == arena_slot, "Arena slot and slot index mismatch" );
- __TBB_ASSERT ( arena_slot->task_pool == LockedTaskPool, "Task pool must be locked when leaving arena" );
- __TBB_ASSERT ( arena_slot->head == arena_slot->tail, "Cannot leave arena when the task pool is not empty" );
- if ( !is_worker() ) {
- my_affinity_id = 0;
- inbox.detach();
- }
- ITT_NOTIFY(sync_releasing, &arena->slot[arena_index]);
- __TBB_store_with_release( arena_slot->task_pool, EmptyTaskPool );
- arena_slot = &dummy_slot;
-}
-
-
-GenericScheduler* GenericScheduler::create_worker( Arena& a, size_t index ) {
- GenericScheduler* s = GenericScheduler::allocate_scheduler(&a);
-
- // Put myself into the arena
-#if __TBB_EXCEPTIONS
- s->dummy_task->prefix().context = &dummy_context;
- // Sync up the local cancellation state with the global one. No need for fence here.
- s->local_cancel_count = global_cancel_count;
-#endif /* __TBB_EXCEPTIONS */
- s->attach_mailbox( index+1 );
- s->arena_index = index;
- s->init_stack_info();
-
- __TBB_store_with_release( a.prefix().worker_list[index].scheduler, s );
- return s;
-}
-
-
-GenericScheduler* GenericScheduler::create_master( Arena* arena ) {
- GenericScheduler* s = GenericScheduler::allocate_scheduler( arena );
- task& t = *s->dummy_task;
- s->innermost_running_task = &t;
- t.prefix().ref_count = 1;
- Governor::sign_on(s);
-#if __TBB_EXCEPTIONS
- // Context to be used by root tasks by default (if the user has not specified one).
- // Allocation is done by NFS allocator because we cannot reuse memory allocated
- // for task objects since the free list is empty at the moment.
- t.prefix().context = new ( NFS_Allocate(sizeof(task_group_context), 1, NULL) ) task_group_context(task_group_context::isolated);
- scheduler_list_node_t &node = s->my_node;
- {
- mutex::scoped_lock lock(the_scheduler_list_mutex);
- node.my_next = the_scheduler_list_head.my_next;
- node.my_prev = &the_scheduler_list_head;
- the_scheduler_list_head.my_next->my_prev = &node;
- the_scheduler_list_head.my_next = &node;
-#endif /* __TBB_EXCEPTIONS */
- unsigned last = arena->prefix().number_of_slots,
- cur_limit = arena->prefix().limit;
- // This slot index assignment is just a hint to ...
- if ( cur_limit < last ) {
- // ... to prevent competition between the first few masters.
- s->arena_index = cur_limit++;
- // In the absence of exception handling this code is a subject to data
- // race in case of multiple masters concurrently entering empty arena.
- // But it does not affect correctness, and can only result in a few
- // masters competing for the same arena slot during the first acquisition.
- // The cost of competition is low in comparison to that of oversubscription.
- arena->prefix().limit = cur_limit;
- }
- else {
- // ... to minimize the probability of competition between multiple masters.
- unsigned first = arena->prefix().number_of_workers;
- s->arena_index = first + s->random.get() % (last - first);
- }
-#if __TBB_EXCEPTIONS
- }
-#endif
- s->init_stack_info();
-#if __TBB_EXCEPTIONS
- // Sync up the local cancellation state with the global one. No need for fence here.
- s->local_cancel_count = global_cancel_count;
-#endif
- __TBB_ASSERT( &task::self()==&t, NULL );
-#if __TBB_SCHEDULER_OBSERVER
- // Process any existing observers.
- s->notify_entry_observers();
-#endif /* __TBB_SCHEDULER_OBSERVER */
- return s;
-}
-
-
-void GenericScheduler::cleanup_worker( void* arg ) {
- TBB_TRACE(("%p.cleanup_worker entered\n",arg));
- GenericScheduler& s = *(GenericScheduler*)arg;
- __TBB_ASSERT( s.dummy_slot.task_pool, "cleaning up worker with missing task pool" );
-#if __TBB_SCHEDULER_OBSERVER
- s.notify_exit_observers(/*is_worker=*/true);
-#endif /* __TBB_SCHEDULER_OBSERVER */
- __TBB_ASSERT( s.arena_slot->task_pool == EmptyTaskPool || s.arena_slot->head == s.arena_slot->tail,
- "worker has unfinished work at run down" );
- s.free_scheduler();
-}
-
-void GenericScheduler::cleanup_master() {
- TBB_TRACE(("%p.cleanup_master entered\n",this));
- GenericScheduler& s = *this; // for similarity with cleanup_worker
- __TBB_ASSERT( s.dummy_slot.task_pool, "cleaning up master with missing task pool" );
-#if __TBB_SCHEDULER_OBSERVER
- s.notify_exit_observers(/*is_worker=*/false);
-#endif /* __TBB_SCHEDULER_OBSERVER */
- if ( !is_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.dummy_task, NULL );
- __TBB_ASSERT ( Governor::is_set(this), "Other thread reused our TLS key during the task pool cleanup" );
- }
- s.free_scheduler();
- Governor::finish_with_arena();
-}
-
-//------------------------------------------------------------------------
-// UnpaddedArenaPrefix
-//------------------------------------------------------------------------
-inline Arena& UnpaddedArenaPrefix::arena() {
- return *static_cast<Arena*>(static_cast<void*>( static_cast<ArenaPrefix*>(this)+1 ));
-}
+#include <new>
-void UnpaddedArenaPrefix::process( job& j ) {
- GenericScheduler& s = static_cast<GenericScheduler&>(j);
- __TBB_ASSERT( Governor::is_set(&s), NULL );
- __TBB_ASSERT( !s.innermost_running_task, NULL );
- // Try to steal a task.
- // Passing reference count is technically unnecessary in this context,
- // but omitting it here would add checks inside the function.
- task* t = s.receive_or_steal_task( s.dummy_task->prefix().ref_count, /*return_if_no_work=*/true );
- if (t) {
- // A side effect of receive_or_steal_task is that innermost_running_task can be set.
- // But for the outermost dispatch loop of a worker it has to be NULL.
- s.innermost_running_task = NULL;
- s.local_wait_for_all(*s.dummy_task,t);
- }
- __TBB_ASSERT( s.inbox.assert_is_idle(true), NULL );
- __TBB_ASSERT( !s.innermost_running_task, NULL );
-}
+// Do not include task.h directly. Use scheduler_common.h instead
+#include "scheduler_common.h"
+#include "governor.h"
+#include "scheduler.h"
+#include "itt_notify.h"
-void UnpaddedArenaPrefix::cleanup( job& j ) {
- GenericScheduler& s = static_cast<GenericScheduler&>(j);
- GenericScheduler::cleanup_worker( &s );
-}
+#include "tbb/cache_aligned_allocator.h"
+#include "tbb/partitioner.h"
-void UnpaddedArenaPrefix::open_connection_to_rml() {
- __TBB_ASSERT( !server, NULL );
- __TBB_ASSERT( stack_size>0, NULL );
- if( !use_private_rml ) {
- ::rml::factory::status_type status = rml_server_factory.make_server( server, *this );
- if( status==::rml::factory::st_success ) {
- __TBB_ASSERT( server, NULL );
- return;
- }
- use_private_rml = true;
- fprintf(stderr,"warning from TBB: make_server failed with status %x, falling back on private rml",status);
- }
- server = rml::make_private_server( *this );
-}
+namespace tbb {
-void UnpaddedArenaPrefix::acknowledge_close_connection() {
- arena().free_arena();
-}
+using namespace std;
-::rml::job* UnpaddedArenaPrefix::create_one_job() {
- GenericScheduler* s = GenericScheduler::create_worker( arena(), next_job_index++ );
- Governor::sign_on(s);
- return s;
-}
+namespace internal {
//------------------------------------------------------------------------
// Methods of allocate_root_proxy
//------------------------------------------------------------------------
task& allocate_root_proxy::allocate( size_t size ) {
- internal::GenericScheduler* v = Governor::local_scheduler();
+ internal::generic_scheduler* v = governor::local_scheduler();
__TBB_ASSERT( v, "thread did not activate a task_scheduler_init object?" );
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
task_prefix& p = v->innermost_running_task->prefix();
+
+ ITT_STACK_CREATE(p.context->itt_caller);
#endif
// New root task becomes part of the currently running task's cancellation context
return v->allocate_task( size, __TBB_CONTEXT_ARG(NULL, p.context) );
}
void allocate_root_proxy::free( task& task ) {
- internal::GenericScheduler* v = Governor::local_scheduler();
+ internal::generic_scheduler* v = governor::local_scheduler();
__TBB_ASSERT( v, "thread does not have initialized task_scheduler_init object?" );
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
// No need to do anything here as long as there is no context -> task connection
-#endif /* __TBB_EXCEPTIONS */
- v->free_task<GenericScheduler::is_local>( task );
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ v->free_task<local_task>( task );
}
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
//------------------------------------------------------------------------
// Methods of allocate_root_with_context_proxy
//------------------------------------------------------------------------
task& allocate_root_with_context_proxy::allocate( size_t size ) const {
- internal::GenericScheduler* v = Governor::local_scheduler();
+ internal::generic_scheduler* v = governor::local_scheduler();
__TBB_ASSERT( v, "thread did not activate a task_scheduler_init object?" );
task_prefix& p = v->innermost_running_task->prefix();
task& t = v->allocate_task( size, __TBB_CONTEXT_ARG(NULL, &my_context) );
@@ -3303,7 +88,7 @@ task& allocate_root_with_context_proxy::allocate( size_t size ) const {
// flow in exchange of a bit higher probability that in cases when cancellation
// is in flight we will take deeper traversal branch. Normally cache coherency
// mechanisms are efficient enough to deliver updated value most of the time.
- uintptr_t local_count_snapshot = ((GenericScheduler*)my_context.my_owner)->local_cancel_count;
+ uintptr_t local_count_snapshot = ((generic_scheduler*)my_context.my_owner)->local_cancel_count;
__TBB_store_with_release(my_context.my_parent, p.context);
uintptr_t global_count_snapshot = __TBB_load_with_acquire(global_cancel_count);
if ( !my_context.my_cancellation_requested ) {
@@ -3325,16 +110,17 @@ task& allocate_root_with_context_proxy::allocate( size_t size ) const {
my_context.my_kind = task_group_context::binding_completed;
}
// else the context either has already been associated with its parent or is isolated
+ ITT_STACK_CREATE(my_context.itt_caller);
return t;
}
void allocate_root_with_context_proxy::free( task& task ) const {
- internal::GenericScheduler* v = Governor::local_scheduler();
+ internal::generic_scheduler* v = governor::local_scheduler();
__TBB_ASSERT( v, "thread does not have initialized task_scheduler_init object?" );
// No need to do anything here as long as unbinding is performed by context destructor only.
- v->free_task<GenericScheduler::is_local>( task );
+ v->free_task<local_task>( task );
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//------------------------------------------------------------------------
// Methods of allocate_continuation_proxy
@@ -3342,7 +128,7 @@ void allocate_root_with_context_proxy::free( task& task ) const {
task& allocate_continuation_proxy::allocate( size_t size ) const {
task& t = *((task*)this);
__TBB_ASSERT( AssertOkay(t), NULL );
- GenericScheduler* s = Governor::local_scheduler();
+ generic_scheduler* s = governor::local_scheduler();
task* parent = t.parent();
t.prefix().parent = NULL;
return s->allocate_task( size, __TBB_CONTEXT_ARG(parent, t.prefix().context) );
@@ -3351,7 +137,7 @@ task& allocate_continuation_proxy::allocate( size_t size ) const {
void allocate_continuation_proxy::free( task& mytask ) const {
// Restore the parent as it was before the corresponding allocate was called.
((task*)this)->prefix().parent = mytask.parent();
- Governor::local_scheduler()->free_task<GenericScheduler::is_local>(mytask);
+ governor::local_scheduler()->free_task<local_task>(mytask);
}
//------------------------------------------------------------------------
@@ -3360,21 +146,20 @@ void allocate_continuation_proxy::free( task& mytask ) const {
task& allocate_child_proxy::allocate( size_t size ) const {
task& t = *((task*)this);
__TBB_ASSERT( AssertOkay(t), NULL );
- GenericScheduler* s = Governor::local_scheduler();
+ generic_scheduler* s = governor::local_scheduler();
return s->allocate_task( size, __TBB_CONTEXT_ARG(&t, t.prefix().context) );
}
void allocate_child_proxy::free( task& mytask ) const {
- Governor::local_scheduler()->free_task<GenericScheduler::is_local>(mytask);
+ governor::local_scheduler()->free_task<local_task>(mytask);
}
//------------------------------------------------------------------------
// Methods of allocate_additional_child_of_proxy
//------------------------------------------------------------------------
task& allocate_additional_child_of_proxy::allocate( size_t size ) const {
- __TBB_ASSERT( AssertOkay(self), NULL );
parent.increment_ref_count();
- GenericScheduler* s = Governor::local_scheduler();
+ generic_scheduler* s = governor::local_scheduler();
return s->allocate_task( size, __TBB_CONTEXT_ARG(&parent, parent.prefix().context) );
}
@@ -3387,7 +172,7 @@ void allocate_additional_child_of_proxy::free( task& task ) const {
// reference count might have become zero before the corresponding call to
// allocate_additional_child_of_proxy::allocate.
parent.internal_decrement_ref_count();
- Governor::local_scheduler()->free_task<GenericScheduler::is_local>(task);
+ governor::local_scheduler()->free_task<local_task>(task);
}
//------------------------------------------------------------------------
@@ -3395,7 +180,7 @@ void allocate_additional_child_of_proxy::free( task& task ) const {
//------------------------------------------------------------------------
size_t get_initial_auto_partitioner_divisor() {
const size_t X_FACTOR = 4;
- return X_FACTOR * (Governor::number_of_workers_in_arena()+1);
+ return X_FACTOR * (governor::max_number_of_workers()+1);
}
//------------------------------------------------------------------------
@@ -3403,19 +188,19 @@ size_t get_initial_auto_partitioner_divisor() {
//------------------------------------------------------------------------
void affinity_partitioner_base_v3::resize( unsigned factor ) {
// Check factor to avoid asking for number of workers while there might be no arena.
- size_t new_size = factor ? factor*(Governor::number_of_workers_in_arena()+1) : 0;
+ size_t new_size = factor ? factor*(governor::max_number_of_workers()+1) : 0;
if( new_size!=my_size ) {
if( my_array ) {
NFS_Free( my_array );
// Following two assignments must be done here for sake of exception safety.
my_array = NULL;
my_size = 0;
- }
+ }
if( new_size ) {
my_array = static_cast<affinity_id*>(NFS_Allocate(new_size,sizeof(affinity_id), NULL ));
memset( my_array, 0, sizeof(affinity_id)*new_size );
my_size = new_size;
- }
+ }
}
}
@@ -3423,220 +208,13 @@ void affinity_partitioner_base_v3::resize( unsigned factor ) {
using namespace tbb::internal;
-#if __TBB_EXCEPTIONS
-
-//------------------------------------------------------------------------
-// captured_exception
-//------------------------------------------------------------------------
-
-inline
-void copy_string ( char*& dst, const char* src ) {
- if ( src ) {
- size_t len = strlen(src) + 1;
- dst = (char*)allocate_via_handler_v3(len);
- strncpy (dst, src, len);
- }
- else
- dst = NULL;
-}
-
-void captured_exception::set ( const char* name, const char* info ) throw()
-{
- copy_string(const_cast<char*&>(my_exception_name), name);
- copy_string(const_cast<char*&>(my_exception_info), info);
-}
-
-void captured_exception::clear () throw() {
- deallocate_via_handler_v3 (const_cast<char*>(my_exception_name));
- deallocate_via_handler_v3 (const_cast<char*>(my_exception_info));
-}
-
-captured_exception* captured_exception::move () throw() {
- captured_exception *e = (captured_exception*)allocate_via_handler_v3(sizeof(captured_exception));
- if ( e ) {
- ::new (e) captured_exception();
- e->my_exception_name = my_exception_name;
- e->my_exception_info = my_exception_info;
- e->my_dynamic = true;
- my_exception_name = my_exception_info = NULL;
- }
- return e;
-}
-
-void captured_exception::destroy () throw() {
- __TBB_ASSERT ( my_dynamic, "Method destroy can be used only on objects created by clone or allocate" );
- if ( my_dynamic ) {
- this->captured_exception::~captured_exception();
- deallocate_via_handler_v3 (this);
- }
-}
-
-captured_exception* captured_exception::allocate ( const char* name, const char* info ) {
- captured_exception *e = (captured_exception*)allocate_via_handler_v3( sizeof(captured_exception) );
- if ( e ) {
- ::new (e) captured_exception(name, info);
- e->my_dynamic = true;
- }
- return e;
-}
-
-const char* captured_exception::name() const throw() {
- return my_exception_name;
-}
-
-const char* captured_exception::what() const throw() {
- return my_exception_info;
-}
-
-
-//------------------------------------------------------------------------
-// tbb_exception_ptr
-//------------------------------------------------------------------------
-
-#if !TBB_USE_CAPTURED_EXCEPTION
-
-namespace internal {
-
-template<typename T>
-tbb_exception_ptr* AllocateExceptionContainer( const T& src ) {
- tbb_exception_ptr *eptr = (tbb_exception_ptr*)allocate_via_handler_v3( sizeof(tbb_exception_ptr) );
- if ( eptr )
- new (eptr) tbb_exception_ptr(src);
- return eptr;
-}
-
-tbb_exception_ptr* tbb_exception_ptr::allocate () {
- return AllocateExceptionContainer( std::current_exception() );
-}
-
-tbb_exception_ptr* tbb_exception_ptr::allocate ( const tbb_exception& ) {
- return AllocateExceptionContainer( std::current_exception() );
-}
-
-tbb_exception_ptr* tbb_exception_ptr::allocate ( captured_exception& src ) {
- tbb_exception_ptr *res = AllocateExceptionContainer( src );
- src.destroy();
- return res;
-}
-
-void tbb_exception_ptr::destroy () throw() {
- this->tbb_exception_ptr::~tbb_exception_ptr();
- deallocate_via_handler_v3 (this);
-}
-
-} // namespace internal
-#endif /* !TBB_USE_CAPTURED_EXCEPTION */
-
-
-//------------------------------------------------------------------------
-// task_group_context
-//------------------------------------------------------------------------
-
-task_group_context::~task_group_context () {
- if ( my_kind != isolated ) {
- GenericScheduler *s = (GenericScheduler*)my_owner;
- __TBB_ASSERT ( Governor::is_set(s), "Task group context is destructed by wrong thread" );
- my_node.my_next->my_prev = my_node.my_prev;
- uintptr_t local_count_snapshot = s->local_cancel_count;
- my_node.my_prev->my_next = my_node.my_next;
- __TBB_rel_acq_fence();
- if ( local_count_snapshot != global_cancel_count ) {
- // Another thread was propagating cancellation request when we removed
- // ourselves from the list. We must ensure that it does not access us
- // when this destructor finishes. We'll be able to acquire the lock
- // below only after the other thread finishes with us.
- spin_mutex::scoped_lock lock(s->context_list_mutex);
- }
- }
-#if TBB_USE_DEBUG
- my_version_and_traits = 0xDeadBeef;
-#endif /* TBB_USE_DEBUG */
- if ( my_exception )
- my_exception->destroy();
-}
-
-void task_group_context::init () {
- __TBB_ASSERT ( sizeof(uintptr_t) < 32, "Layout of my_version_and_traits must be reconsidered on this platform" );
- __TBB_ASSERT ( sizeof(task_group_context) == 2 * NFS_MaxLineSize, "Context class has wrong size - check padding and members alignment" );
- __TBB_ASSERT ( (uintptr_t(this) & (sizeof(my_cancellation_requested) - 1)) == 0, "Context is improperly aligned" );
- __TBB_ASSERT ( my_kind == isolated || my_kind == bound, "Context can be created only as isolated or bound" );
- my_parent = NULL;
- my_cancellation_requested = 0;
- my_exception = NULL;
- if ( my_kind == bound ) {
- GenericScheduler *s = Governor::local_scheduler();
- my_owner = s;
- __TBB_ASSERT ( my_owner, "Thread has not activated a task_scheduler_init object?" );
- // Backward links are used by this thread only, thus no fences are necessary
- my_node.my_prev = &s->context_list_head;
- s->context_list_head.my_next->my_prev = &my_node;
- // The only operation on the thread local list of contexts that may be performed
- // concurrently is its traversal by another thread while propagating cancellation
- // request. Therefore the release fence below is necessary to ensure that the new
- // value of my_node.my_next is visible to the traversing thread
- // after it reads new value of v->context_list_head.my_next.
- my_node.my_next = s->context_list_head.my_next;
- __TBB_store_with_release(s->context_list_head.my_next, &my_node);
- }
-}
-
-bool task_group_context::cancel_group_execution () {
- __TBB_ASSERT ( my_cancellation_requested == 0 || my_cancellation_requested == 1, "Invalid cancellation state");
- if ( my_cancellation_requested || __TBB_CompareAndSwapW(&my_cancellation_requested, 1, 0) ) {
- // This task group has already been canceled
- return false;
- }
- Governor::local_scheduler()->propagate_cancellation(this);
- return true;
-}
-
-bool task_group_context::is_group_execution_cancelled () const {
- return my_cancellation_requested != 0;
-}
-
-// IMPORTANT: It is assumed that this method is not used concurrently!
-void task_group_context::reset () {
- //! \todo Add assertion that this context does not have children
- // No fences are necessary since this context can be accessed from another thread
- // only after stealing happened (which means necessary fences were used).
- if ( my_exception ) {
- my_exception->destroy();
- my_exception = NULL;
- }
- my_cancellation_requested = 0;
-}
-
-void task_group_context::propagate_cancellation_from_ancestors () {
- task_group_context *parent = my_parent;
- while ( parent && !parent->my_cancellation_requested )
- parent = parent->my_parent;
- if ( parent ) {
- // One of our ancestor groups was canceled. Cancel all its descendants.
- task_group_context *ctx = this;
- do {
- __TBB_store_with_release(ctx->my_cancellation_requested, 1);
- ctx = ctx->my_parent;
- } while ( ctx != parent );
- }
-}
-
-void task_group_context::register_pending_exception () {
- if ( my_cancellation_requested )
- return;
- try {
- throw;
- } TbbCatchAll( this );
-}
-
-#endif /* __TBB_EXCEPTIONS */
-
//------------------------------------------------------------------------
// task
//------------------------------------------------------------------------
void task::internal_set_ref_count( int count ) {
__TBB_ASSERT( count>=0, "count must not be negative" );
- __TBB_ASSERT( !(prefix().extra_state&GenericScheduler::es_ref_count_active), "ref_count race detected" );
+ __TBB_ASSERT( !(prefix().extra_state & es_ref_count_active), "ref_count race detected" );
ITT_NOTIFY(sync_releasing, &prefix().ref_count);
prefix().ref_count = count;
}
@@ -3651,7 +229,7 @@ internal::reference_count task::internal_decrement_ref_count() {
}
task& task::self() {
- GenericScheduler *v = Governor::local_scheduler();
+ generic_scheduler *v = governor::local_scheduler();
__TBB_ASSERT( v->assert_okay(), NULL );
__TBB_ASSERT( v->innermost_running_task, NULL );
return *v->innermost_running_task;
@@ -3661,7 +239,7 @@ bool task::is_owned_by_current_thread() const {
return true;
}
-void task::destroy( task& victim ) {
+void interface5::internal::task_base::destroy( task& victim ) {
__TBB_ASSERT( victim.prefix().ref_count== (ConcurrentWaitsEnabled(victim) ? 1 : 0), "Task being destroyed must not have children" );
__TBB_ASSERT( victim.state()==task::allocated, "illegal state for victim task" );
task* parent = victim.parent();
@@ -3669,12 +247,13 @@ void task::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).
}
- Governor::local_scheduler()->free_task<GenericScheduler::no_hint>( victim );
+ governor::local_scheduler()->free_task<no_hint>( victim );
}
void task::spawn_and_wait_for_all( task_list& list ) {
- GenericScheduler* s = Governor::local_scheduler();
+ generic_scheduler* s = governor::local_scheduler();
task* t = list.first;
if( t ) {
if( &t->prefix().next!=list.next_ptr )
@@ -3690,233 +269,5 @@ void task::spawn_and_wait_for_all( task_list& list ) {
void task::note_affinity( affinity_id ) {
}
-//------------------------------------------------------------------------
-// task_scheduler_init
-//------------------------------------------------------------------------
-
-/** Left out-of-line for the sake of the backward binary compatibility **/
-void task_scheduler_init::initialize( int number_of_threads ) {
- initialize( number_of_threads, 0 );
-}
-
-void task_scheduler_init::initialize( int number_of_threads, stack_size_type thread_stack_size ) {
- if( number_of_threads!=deferred ) {
- __TBB_ASSERT( !my_scheduler, "task_scheduler_init already initialized" );
- __TBB_ASSERT( number_of_threads==-1 || number_of_threads>=1,
- "number_of_threads for task_scheduler_init must be -1 or positive" );
- my_scheduler = Governor::init_scheduler( number_of_threads, thread_stack_size );
- } else {
- __TBB_ASSERT( !thread_stack_size, "deferred initialization ignores stack size setting" );
- }
-}
-
-void task_scheduler_init::terminate() {
- GenericScheduler* s = static_cast<GenericScheduler*>(my_scheduler);
- my_scheduler = NULL;
- __TBB_ASSERT( s, "task_scheduler_init::terminate without corresponding task_scheduler_init::initialize()");
- Governor::terminate_scheduler(s);
-}
-
-int task_scheduler_init::default_num_threads() {
- // No memory fence required, because at worst each invoking thread calls NumberOfHardwareThreads.
- int n = DefaultNumberOfThreads;
- if( !n ) {
- DefaultNumberOfThreads = n = DetectNumberOfWorkers();
- }
- return n;
-}
-
-#if __TBB_SCHEDULER_OBSERVER
-//------------------------------------------------------------------------
-// Methods of observer_proxy
-//------------------------------------------------------------------------
-namespace internal {
-
-#if TBB_USE_ASSERT
-static atomic<int> observer_proxy_count;
-
-struct check_observer_proxy_count {
- ~check_observer_proxy_count() {
- if( observer_proxy_count!=0 ) {
- fprintf(stderr,"warning: leaked %ld observer_proxy objects\n", long(observer_proxy_count));
- }
- }
-};
-
-static check_observer_proxy_count the_check_observer_proxy_count;
-#endif /* TBB_USE_ASSERT */
-
-observer_proxy::observer_proxy( task_scheduler_observer_v3& tso ) : next(NULL), observer(&tso) {
-#if TBB_USE_ASSERT
- ++observer_proxy_count;
-#endif /* TBB_USE_ASSERT */
- // 1 for observer
- gc_ref_count = 1;
- {
- // Append to the global list
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
- observer_proxy* p = global_last_observer_proxy;
- prev = p;
- if( p )
- p->next=this;
- else
- global_first_observer_proxy = this;
- global_last_observer_proxy = this;
- }
-}
-
-void observer_proxy::remove_from_list() {
- // Take myself off the global list.
- if( next )
- next->prev = prev;
- else
- global_last_observer_proxy = prev;
- if( prev )
- prev->next = next;
- else
- global_first_observer_proxy = next;
-#if TBB_USE_ASSERT
- poison_pointer(prev);
- poison_pointer(next);
- gc_ref_count = -666;
-#endif /* TBB_USE_ASSERT */
-}
-
-void observer_proxy::remove_ref_slow() {
- int r = gc_ref_count;
- while(r>1) {
- __TBB_ASSERT( r!=0, NULL );
- int r_old = gc_ref_count.compare_and_swap(r-1,r);
- if( r_old==r ) {
- // Successfully decremented count.
- return;
- }
- r = r_old;
- }
- __TBB_ASSERT( r==1, NULL );
- // Reference count might go to zero
- {
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
- r = --gc_ref_count;
- if( !r ) {
- remove_from_list();
- }
- }
- if( !r ) {
- __TBB_ASSERT( gc_ref_count == -666, NULL );
-#if TBB_USE_ASSERT
- --observer_proxy_count;
-#endif /* TBB_USE_ASSERT */
- delete this;
- }
-}
-
-observer_proxy* observer_proxy::process_list( observer_proxy* local_last, bool is_worker, bool is_entry ) {
- // Pointer p marches though the list.
- // If is_entry, start with our previous list position, otherwise start at beginning of list.
- observer_proxy* p = is_entry ? local_last : NULL;
- for(;;) {
- task_scheduler_observer* tso=NULL;
- // Hold lock on list only long enough to advance to next proxy in list.
- {
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/false);
- do {
- if( local_last && local_last->observer ) {
- // 2 = 1 for observer and 1 for local_last
- __TBB_ASSERT( local_last->gc_ref_count>=2, NULL );
- // Can decrement count quickly, because it cannot become zero here.
- --local_last->gc_ref_count;
- local_last = NULL;
- } else {
- // Use slow form of decrementing the reference count, after lock is released.
- }
- if( p ) {
- // We were already processing the list.
- if( observer_proxy* q = p->next ) {
- // Step to next item in list.
- p=q;
- } else {
- // At end of list.
- if( is_entry ) {
- // Remember current position in the list, so we can start at on the next call.
- ++p->gc_ref_count;
- } else {
- // Finishin running off the end of the list
- p=NULL;
- }
- goto done;
- }
- } else {
- // Starting pass through the list
- p = global_first_observer_proxy;
- if( !p )
- goto done;
- }
- tso = p->observer;
- } while( !tso );
- ++p->gc_ref_count;
- ++tso->my_busy_count;
- }
- __TBB_ASSERT( !local_last || p!=local_last, NULL );
- if( local_last )
- local_last->remove_ref_slow();
- // Do not hold any locks on the list while calling user's code.
- try {
- if( is_entry )
- tso->on_scheduler_entry( is_worker );
- else
- tso->on_scheduler_exit( is_worker );
- } catch(...) {
- // Suppress exception, because user routines are supposed to be observing, not changing
- // behavior of a master or worker thread.
-#if TBB_USE_ASSERT
- fprintf(stderr,"warning: %s threw exception\n",is_entry?"on_scheduler_entry":"on_scheduler_exit");
-#endif /* __TBB_USE_ASSERT */
- }
- intptr bc = --tso->my_busy_count;
- __TBB_ASSERT_EX( bc>=0, "my_busy_count underflowed" );
- local_last = p;
- }
-done:
- // Return new value to be used as local_last next time.
- if( local_last )
- local_last->remove_ref_slow();
- __TBB_ASSERT( !p || is_entry, NULL );
- return p;
-}
-
-void task_scheduler_observer_v3::observe( bool state ) {
- if( state ) {
- if( !my_proxy ) {
- if( !__TBB_InitOnce::initialization_done() )
- DoOneTimeInitializations();
- my_busy_count = 0;
- my_proxy = new observer_proxy(*this);
- if( GenericScheduler* s = Governor::local_scheduler() ) {
- // Notify newly created observer of its own thread.
- // Any other pending observers are notified too.
- s->notify_entry_observers();
- }
- }
- } else {
- if( observer_proxy* proxy = my_proxy ) {
- my_proxy = NULL;
- __TBB_ASSERT( proxy->gc_ref_count>=1, "reference for observer missing" );
- {
- task_scheduler_observer_mutex_scoped_lock lock(the_task_scheduler_observer_mutex.begin()[0],/*is_writer=*/true);
- proxy->observer = NULL;
- }
- proxy->remove_ref_slow();
- while( my_busy_count ) {
- __TBB_Yield();
- }
- }
- }
-}
-
-} // namespace internal
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
} // namespace tbb
-
diff --git a/src/tbb/task_group_context.cpp b/src/tbb/task_group_context.cpp
new file mode 100644
index 0000000..3e03187
--- /dev/null
+++ b/src/tbb/task_group_context.cpp
@@ -0,0 +1,285 @@
+/*
+ Copyright 2005-2010 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 "scheduler.h"
+
+#include "tbb/task.h"
+#include "tbb/tbb_exception.h"
+#include "tbb/cache_aligned_allocator.h"
+#include "itt_notify.h"
+
+#if __SUNPRO_CC
+#include <string.h>
+#endif
+
+namespace tbb {
+
+#if __TBB_TASK_GROUP_CONTEXT
+
+using namespace internal;
+
+//------------------------------------------------------------------------
+// captured_exception
+//------------------------------------------------------------------------
+
+inline char* duplicate_string ( const char* src ) {
+ char* dst = NULL;
+ if ( src ) {
+ size_t len = strlen(src) + 1;
+ dst = (char*)allocate_via_handler_v3(len);
+ strncpy (dst, src, len);
+ }
+ return dst;
+}
+
+void captured_exception::set ( const char* name, const char* info ) throw() {
+ my_exception_name = duplicate_string( name );
+ my_exception_info = duplicate_string( info );
+}
+
+void captured_exception::clear () throw() {
+ deallocate_via_handler_v3 (const_cast<char*>(my_exception_name));
+ deallocate_via_handler_v3 (const_cast<char*>(my_exception_info));
+}
+
+captured_exception* captured_exception::move () throw() {
+ captured_exception *e = (captured_exception*)allocate_via_handler_v3(sizeof(captured_exception));
+ if ( e ) {
+ ::new (e) captured_exception();
+ e->my_exception_name = my_exception_name;
+ e->my_exception_info = my_exception_info;
+ e->my_dynamic = true;
+ my_exception_name = my_exception_info = NULL;
+ }
+ return e;
+}
+
+void captured_exception::destroy () throw() {
+ __TBB_ASSERT ( my_dynamic, "Method destroy can be used only on objects created by clone or allocate" );
+ if ( my_dynamic ) {
+ this->captured_exception::~captured_exception();
+ deallocate_via_handler_v3 (this);
+ }
+}
+
+captured_exception* captured_exception::allocate ( const char* name, const char* info ) {
+ captured_exception *e = (captured_exception*)allocate_via_handler_v3( sizeof(captured_exception) );
+ if ( e ) {
+ ::new (e) captured_exception(name, info);
+ e->my_dynamic = true;
+ }
+ return e;
+}
+
+const char* captured_exception::name() const throw() {
+ return my_exception_name;
+}
+
+const char* captured_exception::what() const throw() {
+ return my_exception_info;
+}
+
+
+//------------------------------------------------------------------------
+// tbb_exception_ptr
+//------------------------------------------------------------------------
+
+#if !TBB_USE_CAPTURED_EXCEPTION
+
+namespace internal {
+
+template<typename T>
+tbb_exception_ptr* AllocateExceptionContainer( const T& src ) {
+ tbb_exception_ptr *eptr = (tbb_exception_ptr*)allocate_via_handler_v3( sizeof(tbb_exception_ptr) );
+ if ( eptr )
+ new (eptr) tbb_exception_ptr(src);
+ return eptr;
+}
+
+tbb_exception_ptr* tbb_exception_ptr::allocate () {
+ return AllocateExceptionContainer( std::current_exception() );
+}
+
+tbb_exception_ptr* tbb_exception_ptr::allocate ( const tbb_exception& ) {
+ return AllocateExceptionContainer( std::current_exception() );
+}
+
+tbb_exception_ptr* tbb_exception_ptr::allocate ( captured_exception& src ) {
+ tbb_exception_ptr *res = AllocateExceptionContainer( src );
+ src.destroy();
+ return res;
+}
+
+void tbb_exception_ptr::destroy () throw() {
+ this->tbb_exception_ptr::~tbb_exception_ptr();
+ deallocate_via_handler_v3 (this);
+}
+
+} // namespace internal
+#endif /* !TBB_USE_CAPTURED_EXCEPTION */
+
+
+//------------------------------------------------------------------------
+// task_group_context
+//------------------------------------------------------------------------
+
+task_group_context::~task_group_context () {
+ if ( my_kind != isolated ) {
+ generic_scheduler *s = (generic_scheduler*)my_owner;
+ if ( governor::is_set(s) ) {
+ // Local update of the context list
+ uintptr_t local_count_snapshot = s->local_cancel_count;
+ s->local_ctx_list_update = 1;
+ __TBB_rel_acq_fence();
+ if ( s->nonlocal_ctx_list_update ) {
+ spin_mutex::scoped_lock lock(s->context_list_mutex);
+ my_node.my_prev->my_next = my_node.my_next;
+ my_node.my_next->my_prev = my_node.my_prev;
+ s->local_ctx_list_update = 0;
+ }
+ else {
+ my_node.my_prev->my_next = my_node.my_next;
+ my_node.my_next->my_prev = my_node.my_prev;
+ __TBB_store_with_release( s->local_ctx_list_update, 0 );
+ if ( local_count_snapshot != global_cancel_count ) {
+ // Another thread was propagating cancellation request when we removed
+ // ourselves from the list. We must ensure that it does not access us
+ // when this destructor finishes. We'll be able to acquire the lock
+ // below only after the other thread finishes with us.
+ spin_mutex::scoped_lock lock(s->context_list_mutex);
+ }
+ }
+ }
+ else {
+ // Nonlocal update of the context list
+ if ( __TBB_FetchAndStoreW(&my_kind, dying) == detached ) {
+ my_node.my_prev->my_next = my_node.my_next;
+ my_node.my_next->my_prev = my_node.my_prev;
+ }
+ else {
+ __TBB_FetchAndAddW(&s->nonlocal_ctx_list_update, 1);
+ spin_wait_until_eq( s->local_ctx_list_update, 0u );
+ s->context_list_mutex.lock();
+ my_node.my_prev->my_next = my_node.my_next;
+ my_node.my_next->my_prev = my_node.my_prev;
+ s->context_list_mutex.unlock();
+ __TBB_FetchAndAddW(&s->nonlocal_ctx_list_update, -1);
+ }
+ }
+ }
+#if TBB_USE_DEBUG
+ my_version_and_traits = 0xDeadBeef;
+#endif /* TBB_USE_DEBUG */
+ if ( my_exception )
+ my_exception->destroy();
+ if (itt_caller != ITT_CALLER_NULL) ITT_STACK(caller_destroy, itt_caller);
+}
+
+void task_group_context::init () {
+ __TBB_ASSERT ( sizeof(uintptr_t) < 32, "Layout of my_version_and_traits must be reconsidered on this platform" );
+ __TBB_ASSERT ( sizeof(task_group_context) == 2 * NFS_MaxLineSize, "Context class has wrong size - check padding and members alignment" );
+ __TBB_ASSERT ( (uintptr_t(this) & (sizeof(my_cancellation_requested) - 1)) == 0, "Context is improperly aligned" );
+ __TBB_ASSERT ( my_kind == isolated || my_kind == bound, "Context can be created only as isolated or bound" );
+ my_parent = NULL;
+ my_cancellation_requested = 0;
+ my_exception = NULL;
+ itt_caller = ITT_CALLER_NULL;
+ if ( my_kind == bound ) {
+ generic_scheduler *s = governor::local_scheduler();
+ my_owner = s;
+ __TBB_ASSERT ( my_owner, "Thread has not activated a task_scheduler_init object?" );
+ // Backward links are used by this thread only, thus no fences are necessary
+ my_node.my_prev = &s->context_list_head;
+ s->context_list_head.my_next->my_prev = &my_node;
+ // The only operation on the thread local list of contexts that may be performed
+ // concurrently is its traversal by another thread while propagating cancellation
+ // request. Therefore the release fence below is necessary to ensure that the new
+ // value of my_node.my_next is visible to the traversing thread
+ // after it reads new value of v->context_list_head.my_next.
+ my_node.my_next = s->context_list_head.my_next;
+ __TBB_store_with_release(s->context_list_head.my_next, &my_node);
+ }
+}
+
+bool task_group_context::cancel_group_execution () {
+ __TBB_ASSERT ( my_cancellation_requested == 0 || my_cancellation_requested == 1, "Invalid cancellation state");
+ if ( my_cancellation_requested || __TBB_CompareAndSwapW(&my_cancellation_requested, 1, 0) ) {
+ // This task group has already been canceled
+ return false;
+ }
+#if __TBB_ARENA_PER_MASTER
+ governor::local_scheduler()->my_arena->propagate_cancellation( *this );
+#else /* !__TBB_ARENA_PER_MASTER */
+ governor::local_scheduler()->propagate_cancellation( *this );
+#endif /* !__TBB_ARENA_PER_MASTER */
+ return true;
+}
+
+bool task_group_context::is_group_execution_cancelled () const {
+ return my_cancellation_requested != 0;
+}
+
+// IMPORTANT: It is assumed that this method is not used concurrently!
+void task_group_context::reset () {
+ //! \todo Add assertion that this context does not have children
+ // No fences are necessary since this context can be accessed from another thread
+ // only after stealing happened (which means necessary fences were used).
+ if ( my_exception ) {
+ my_exception->destroy();
+ my_exception = NULL;
+ }
+ my_cancellation_requested = 0;
+}
+
+void task_group_context::propagate_cancellation_from_ancestors () {
+ task_group_context *parent = my_parent;
+ while ( parent && !parent->my_cancellation_requested )
+ parent = parent->my_parent;
+ if ( parent ) {
+ // One of our ancestor groups was canceled. Cancel all its descendants.
+ task_group_context *ctx = this;
+ do {
+ __TBB_store_with_release(ctx->my_cancellation_requested, 1);
+ ctx = ctx->my_parent;
+ } while ( ctx != parent );
+ }
+}
+
+void task_group_context::register_pending_exception () {
+ if ( my_cancellation_requested )
+ return;
+#if TBB_USE_EXCEPTIONS
+ try {
+ throw;
+ } TbbCatchAll( this );
+#endif /* TBB_USE_EXCEPTIONS */
+}
+
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+} // namespace tbb
diff --git a/src/tbb/task_stream.h b/src/tbb/task_stream.h
new file mode 100644
index 0000000..8ba4865
--- /dev/null
+++ b/src/tbb/task_stream.h
@@ -0,0 +1,170 @@
+/*
+ Copyright 2005-2010 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#ifndef _TBB_task_stream_H
+#define _TBB_task_stream_H
+
+#include "tbb/tbb_stddef.h"
+
+#if __TBB_ARENA_PER_MASTER
+
+#include <deque>
+#include <climits>
+#include "tbb/atomic.h" // for __TBB_Atomic*
+#include "tbb/spin_mutex.h"
+#include "tbb/tbb_allocator.h"
+#include "scheduler_common.h"
+#include "tbb_misc.h" // for FastRandom
+
+namespace tbb {
+namespace internal {
+
+//! Essentially, this is just a pair of a queue and a mutex to protect the queue.
+/** The reason std::pair is not used is that the code would look less clean
+ if field names were replaced with 'first' and 'second'. **/
+template< typename T, typename mutex_t >
+struct queue_and_mutex {
+ typedef std::deque< T, tbb_allocator<T> > queue_base_t;
+
+ queue_base_t my_queue;
+ mutex_t my_mutex;
+
+ queue_and_mutex () : my_queue(), my_mutex() {}
+ ~queue_and_mutex () {}
+};
+
+const uintptr_t one = 1;
+
+inline void set_one_bit( uintptr_t& dest, int pos ) {
+ __TBB_ASSERT( pos>=0, NULL );
+ __TBB_ASSERT( pos<32, NULL );
+ __TBB_AtomicOR( &dest, one<<pos );
+}
+
+inline void clear_one_bit( uintptr_t& dest, int pos ) {
+ __TBB_ASSERT( pos>=0, NULL );
+ __TBB_ASSERT( pos<32, NULL );
+ __TBB_AtomicAND( &dest, ~(one<<pos) );
+}
+
+inline bool is_bit_set( uintptr_t val, int pos ) {
+ __TBB_ASSERT( pos>=0, NULL );
+ __TBB_ASSERT( pos<32, NULL );
+ return (val & (one<<pos)) != 0;
+}
+
+//! The container for "fairness-oriented" aka "enqueued" tasks.
+class task_stream {
+ typedef queue_and_mutex <task*, spin_mutex> lane_t;
+ unsigned N;
+ uintptr_t population;
+ FastRandom random;
+ padded<lane_t>* lanes;
+
+public:
+ task_stream() : N(), population(), random(unsigned(&N-(unsigned*)NULL)), lanes()
+ {
+ __TBB_ASSERT( sizeof(population) * CHAR_BIT >= 32, NULL );
+ }
+
+ void initialize( unsigned n_lanes ) {
+ N = n_lanes>=32 ? 32 : n_lanes>2 ? 1<<(__TBB_Log2(n_lanes-1)+1) : 2;
+ __TBB_ASSERT( N==32 || N>=n_lanes && ((N-1)&N)==0, "number of lanes miscalculated");
+ lanes = new padded<lane_t>[N];
+ __TBB_ASSERT( !population, NULL );
+ }
+
+ ~task_stream() { if (lanes) delete[] lanes; }
+
+ //! Push a task into a lane.
+ void push( task* source, unsigned& last_random ) {
+ // Lane selection is random. Each thread should keep a separate seed value.
+ unsigned idx;
+ for( ; ; ) {
+ idx = random.get(last_random) & (N-1);
+ spin_mutex::scoped_lock lock;
+ if( lock.try_acquire(lanes[idx].my_mutex) ) {
+ lanes[idx].my_queue.push_back(source);
+ set_one_bit( population, idx );
+ break;
+ }
+ }
+ }
+ //! Try finding and popping a task.
+ /** Does not change destination if unsuccessful. */
+ void pop( task*& dest, unsigned& last_used_lane ) {
+ if( !population ) return; // keeps the hot path shorter
+ // Lane selection is round-robin. Each thread should keep its last used lane.
+ unsigned idx = (last_used_lane+1)&(N-1);
+ for( ; population; idx=(idx+1)&(N-1) ) {
+ if( is_bit_set( population, idx ) ) {
+ lane_t& lane = lanes[idx];
+ spin_mutex::scoped_lock lock;
+ if( lock.try_acquire(lane.my_mutex) && !lane.my_queue.empty() ) {
+ dest = lane.my_queue.front();
+ lane.my_queue.pop_front();
+ if( lane.my_queue.empty() )
+ clear_one_bit( population, idx );
+ break;
+ }
+ }
+ }
+ last_used_lane = idx;
+ }
+
+ //! Checks existence of a task.
+ bool empty() {
+ return !population;
+ }
+ //! Destroys all remaining tasks in every lane. Returns the number of destroyed tasks.
+ /** Tasks are not executed, because it would potentially create more tasks at a late stage.
+ The scheduler is really expected to execute all tasks before task_stream destruction. */
+ intptr_t drain() {
+ intptr_t result = 0;
+ for(unsigned i=0; i<N; ++i) {
+ lane_t& lane = lanes[i];
+ spin_mutex::scoped_lock lock(lane.my_mutex);
+ for(lane_t::queue_base_t::iterator it=lane.my_queue.begin();
+ it!=lane.my_queue.end(); ++it, ++result)
+ {
+ task* t = *it;
+ tbb::task::destroy(*t);
+ }
+ lane.my_queue.clear();
+ clear_one_bit( population, i );
+ }
+ return result;
+ }
+}; // task_stream
+
+} // namespace internal
+} // namespace tbb
+
+#endif /* __TBB_ARENA_PER_MASTER */
+
+#endif /* _TBB_task_stream_H */
diff --git a/src/tbb/tbb_main.cpp b/src/tbb/tbb_main.cpp
new file mode 100644
index 0000000..bace385
--- /dev/null
+++ b/src/tbb/tbb_main.cpp
@@ -0,0 +1,249 @@
+/*
+ Copyright 2005-2010 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_main.h"
+#include "governor.h"
+#include "tbb_misc.h"
+#include "itt_notify.h"
+
+namespace tbb {
+namespace internal {
+
+//------------------------------------------------------------------------
+// Begin shared data layout.
+// The following global data items are mostly read-only after initialization.
+//------------------------------------------------------------------------
+
+//! Padding in order to prevent false sharing.
+static const char _pad[NFS_MaxLineSize - sizeof(int)] = {};
+
+//------------------------------------------------------------------------
+// governor data
+basic_tls<generic_scheduler*> governor::theTLS;
+#if !__TBB_ARENA_PER_MASTER
+arena* governor::theArena;
+mutex governor::theArenaMutex;
+unsigned governor::NumWorkers;
+#endif /* !__TBB_ARENA_PER_MASTER */
+unsigned governor::DefaultNumberOfThreads;
+rml::tbb_factory governor::theRMLServerFactory;
+bool governor::UsePrivateRML;
+
+#if __TBB_ARENA_PER_MASTER
+//------------------------------------------------------------------------
+// market data
+market* market::theMarket;
+market::global_market_mutex_type market::theMarketMutex;
+#endif /* __TBB_ARENA_PER_MASTER */
+
+//------------------------------------------------------------------------
+// One time initialization data
+
+//! Counter of references to global shared resources such as TLS.
+atomic<int> __TBB_InitOnce::count;
+
+__TBB_InitOnce::mutex_type __TBB_InitOnce::InitializationLock;
+
+//! Flag that is set to true after one-time initializations are done.
+bool __TBB_InitOnce::InitializationDone;
+
+#if DO_ITT_NOTIFY
+ static bool ITT_Present;
+ static bool ITT_InitializationDone;
+#endif
+
+#if !(_WIN32||_WIN64) || __TBB_TASK_CPP_DIRECTLY_INCLUDED
+ static __TBB_InitOnce __TBB_InitOnceHiddenInstance;
+#endif
+
+//------------------------------------------------------------------------
+// generic_scheduler data
+
+//! Pointer to the scheduler factory function
+generic_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );
+
+//! Table of primes used by fast random-number generator (FastRandom).
+/** Also serves to keep anything else from being placed in the same
+ cache line as the global data items preceding it. */
+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
+};
+
+//------------------------------------------------------------------------
+// End of shared data layout
+//------------------------------------------------------------------------
+
+//------------------------------------------------------------------------
+// Shared data accessors
+//------------------------------------------------------------------------
+
+unsigned GetPrime ( unsigned seed ) {
+ return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];
+}
+
+//------------------------------------------------------------------------
+// __TBB_InitOnce
+//------------------------------------------------------------------------
+
+void __TBB_InitOnce::add_ref() {
+ if( ++count==1 )
+ governor::acquire_resources();
+}
+
+void __TBB_InitOnce::remove_ref() {
+ int k = --count;
+ __TBB_ASSERT(k>=0,"removed __TBB_InitOnce ref that was not added?");
+ if( k==0 )
+ governor::release_resources();
+}
+
+//------------------------------------------------------------------------
+// One-time Initializations
+//------------------------------------------------------------------------
+
+//! Defined in cache_aligned_allocator.cpp
+void initialize_cache_aligned_allocator();
+
+//! Defined in scheduler.cpp
+void Scheduler_OneTimeInitialization ( bool itt_present );
+
+#if DO_ITT_NOTIFY
+//! Performs initialization of tools support.
+/** Defined in itt_notify.cpp. Must be called in a protected do-once manner.
+ \return true if notification hooks were installed, false otherwise. **/
+bool InitializeITT();
+
+/** Thread-unsafe lazy one-time initialization of tools interop.
+ Used by both dummy handlers and general TBB one-time initialization routine. **/
+void ITT_DoUnsafeOneTimeInitialization () {
+ if ( !ITT_InitializationDone ) {
+ ITT_Present = InitializeITT();
+ ITT_InitializationDone = true;
+#if __TBB_ARENA_PER_MASTER
+ ITT_SYNC_CREATE(&market::theMarketMutex, SyncType_GlobalLock, SyncObj_SchedulerInitialization);
+#else /* !__TBB_ARENA_PER_MASTER */
+ ITT_SYNC_CREATE(&governor::theArenaMutex, SyncType_GlobalLock, SyncObj_SchedulerInitialization);
+#endif /* !__TBB_ARENA_PER_MASTER */
+ }
+}
+
+/** Thread-safe lazy one-time initialization of tools interop.
+ Used by dummy handlers only. **/
+extern "C"
+void ITT_DoOneTimeInitialization() {
+ __TBB_InitOnce::lock();
+ ITT_DoUnsafeOneTimeInitialization();
+ __TBB_InitOnce::unlock();
+}
+#endif /* DO_ITT_NOTIFY */
+
+//! Performs thread-safe lazy one-time general TBB initialization.
+void DoOneTimeInitializations() {
+ __TBB_InitOnce::lock();
+ // No fence required for load of InitializationDone, because we are inside a critical section.
+ if( !__TBB_InitOnce::InitializationDone ) {
+ __TBB_InitOnce::add_ref();
+ if( GetBoolEnvironmentVariable("TBB_VERSION") )
+ PrintVersion();
+ bool have_itt = false;
+#if DO_ITT_NOTIFY
+ ITT_DoUnsafeOneTimeInitialization();
+ have_itt = ITT_Present;
+#endif /* DO_ITT_NOTIFY */
+ initialize_cache_aligned_allocator();
+ governor::print_version_info();
+ PrintExtraVersionInfo( "SCHEDULER", have_itt ? "default" : "Intel" );
+ Scheduler_OneTimeInitialization( have_itt );
+ __TBB_InitOnce::InitializationDone = true;
+ }
+ __TBB_InitOnce::unlock();
+}
+
+#if (_WIN32||_WIN64) && !__TBB_TASK_CPP_DIRECTLY_INCLUDED
+//! Windows "DllMain" that handles startup and shutdown of dynamic library.
+extern "C" bool WINAPI DllMain( HANDLE /*hinstDLL*/, DWORD reason, LPVOID /*lpvReserved*/ ) {
+ switch( reason ) {
+ case DLL_PROCESS_ATTACH:
+ __TBB_InitOnce::add_ref();
+ break;
+ case DLL_PROCESS_DETACH:
+ __TBB_InitOnce::remove_ref();
+ // It is assumed that InitializationDone is not set after DLL_PROCESS_DETACH,
+ // and thus no race on InitializationDone is possible.
+ if( __TBB_InitOnce::initialization_done() ) {
+ // Remove reference that we added in DoOneTimeInitializations.
+ __TBB_InitOnce::remove_ref();
+ }
+ break;
+ case DLL_THREAD_DETACH:
+ governor::terminate_auto_initialized_scheduler();
+ break;
+ }
+ return true;
+}
+#endif /* (_WIN32||_WIN64) && !__TBB_TASK_CPP_DIRECTLY_INCLUDED */
+
+void itt_store_pointer_with_release_v3( void* dst, void* src ) {
+ ITT_NOTIFY(sync_releasing, dst);
+ __TBB_store_with_release(*static_cast<void**>(dst),src);
+}
+
+void* itt_load_pointer_with_acquire_v3( const void* src ) {
+ void* result = __TBB_load_with_acquire(*static_cast<void*const*>(src));
+ ITT_NOTIFY(sync_acquired, const_cast<void*>(src));
+ return result;
+}
+
+void* itt_load_pointer_v3( const void* src ) {
+ void* result = *static_cast<void*const*>(src);
+ return result;
+}
+
+void itt_set_sync_name_v3( void* obj, const tchar* name) {
+ ITT_SYNC_RENAME(obj, name);
+ (void)obj, (void)name; // Prevents compiler warning when ITT support is switched off
+}
+
+
+} // namespace internal
+} // namespace tbb
diff --git a/src/tbb/tbb_main.h b/src/tbb/tbb_main.h
new file mode 100644
index 0000000..b207b34
--- /dev/null
+++ b/src/tbb/tbb_main.h
@@ -0,0 +1,106 @@
+/*
+ Copyright 2005-2010 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_tbb_main_H
+#define _TBB_tbb_main_H
+
+#include "tbb/atomic.h"
+
+namespace tbb {
+
+namespace internal {
+
+void DoOneTimeInitializations ();
+
+//------------------------------------------------------------------------
+// __TBB_InitOnce
+//------------------------------------------------------------------------
+
+//! Class that supports TBB initialization.
+/** It handles acquisition and release of global resources (e.g. TLS) during startup and shutdown,
+ as well as synchronization for DoOneTimeInitializations. */
+class __TBB_InitOnce {
+ friend void DoOneTimeInitializations();
+ friend void ITT_DoUnsafeOneTimeInitialization ();
+
+ static atomic<int> count;
+
+ //! Platform specific code to acquire resources.
+ static void acquire_resources();
+
+ //! Platform specific code to release resources.
+ static void release_resources();
+
+ //! 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 unsigned char mutex_type;
+
+ // Global initialization lock
+ static mutex_type InitializationLock;
+
+public:
+ static void lock() { __TBB_LockByte( InitializationLock ); }
+
+ static void unlock() { __TBB_store_with_release( InitializationLock, 0 ); }
+
+ static bool initialization_done() { return __TBB_load_with_acquire(InitializationDone); }
+
+ //! Add initial reference to resources.
+ /** We assume that dynamic loading of the library prevents any other threads
+ from entering the library until this constructor has finished running. **/
+ __TBB_InitOnce() { add_ref(); }
+
+ //! Remove the initial reference to resources.
+ /** This is not necessarily the last reference if other threads are still running. **/
+ ~__TBB_InitOnce() {
+ remove_ref();
+ // We assume that InitializationDone is not set after file-scope destructors
+ // start running, and thus no race on InitializationDone is possible.
+ if( initialization_done() ) {
+ // Remove an extra reference that was added in DoOneTimeInitializations.
+ remove_ref();
+ }
+ }
+ //! Add reference to resources. If first reference added, acquire the resources.
+ static void add_ref();
+
+ //! Remove reference to resources. If last reference removed, release the resources.
+ static void remove_ref();
+}; // class __TBB_InitOnce
+
+
+} // namespace internal
+
+} // namespace tbb
+
+#endif /* _TBB_tbb_main_H */
diff --git a/src/tbb/tbb_misc.cpp b/src/tbb/tbb_misc.cpp
index 5a04e59..ae16421 100644
--- a/src/tbb/tbb_misc.cpp
+++ b/src/tbb/tbb_misc.cpp
@@ -30,27 +30,29 @@
// an executing program.
#include "tbb/tbb_stddef.h"
-// Out-of-line TBB assertion handling routines are instantiated here.
-#include "tbb_assert_impl.h"
-
+#include "tbb_assert_impl.h" // Out-of-line TBB assertion handling routines are instantiated here.
+#include "tbb/tbb_exception.h"
+#include "tbb/tbb_machine.h"
#include "tbb_misc.h"
#include <cstdio>
#include <cstdlib>
+
+#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 <cstring>
-#if defined(__EXCEPTIONS) || defined(_CPPUNWIND) || defined(__SUNPRO_CC)
- #include "tbb/tbb_exception.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
#endif
using namespace std;
-#include "tbb/tbb_machine.h"
-
namespace tbb {
-#if defined(__EXCEPTIONS) || defined(_CPPUNWIND) || defined(__SUNPRO_CC)
-// The above preprocessor symbols are defined by compilers when exception handling is enabled.
-// However, in some cases it could be disabled for this file.
-
const char* bad_last_alloc::what() const throw() { return "bad allocation in previous or concurrent attempt"; }
const char* improper_lock::what() const throw() { return "attempted recursive lock on critical section or non-recursive mutex"; }
const char* invalid_multiple_scheduling::what() const throw() { return "The same task_handle object cannot be executed more than once"; }
@@ -58,46 +60,97 @@ const char* missing_wait::what() const throw() { return "wait() was not called o
namespace internal {
+#if TBB_USE_EXCEPTIONS
+ #define DO_THROW(exc, init_args) throw exc init_args;
+#else /* !TBB_USE_EXCEPTIONS */
+ #define PRINT_ERROR_AND_ABORT(exc_name, msg) \
+ fprintf (stderr, "Exception %s with message %s would've been thrown, " \
+ "if exception handling were not disabled. Aborting.\n", exc_name, msg); \
+ fflush(stderr); \
+ abort();
+ #define DO_THROW(exc, init_args) PRINT_ERROR_AND_ABORT(#exc, #init_args)
+#endif /* !TBB_USE_EXCEPTIONS */
+
+
+/* The "what" should be fairly short, not more than about 128 characters.
+ Because we control all the call sites to handle_perror, it is pointless
+ to bullet-proof it for very long strings.
+
+ Design note: ADR put this routine off to the side in tbb_misc.cpp instead of
+ Task.cpp because the throw generates a pathetic lot of code, and ADR wanted
+ this large chunk of code to be placed on a cold page. */
void handle_perror( int error_code, const char* what ) {
- char buf[128];
+ char buf[256];
+ __TBB_ASSERT( strlen(what) < sizeof(buf) - 64, "Error description is too long" );
sprintf(buf,"%s: ",what);
char* end = strchr(buf,0);
size_t n = buf+sizeof(buf)-end;
strncpy( end, strerror( error_code ), n );
// Ensure that buffer ends in terminator.
buf[sizeof(buf)-1] = 0;
+#if TBB_USE_EXCEPTIONS
throw runtime_error(buf);
+#else
+ PRINT_ERROR_AND_ABORT( "runtime_error", buf);
+#endif /* !TBB_USE_EXCEPTIONS */
}
-void throw_bad_last_alloc_exception_v4() { throw_exception(eid_bad_last_alloc); }
+#if _WIN32||_WIN64
+void handle_win_error( int error_code ) {
+ char buf[512];
+ FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, error_code, 0, buf, sizeof(buf), NULL );
+#if TBB_USE_EXCEPTIONS
+ throw runtime_error(buf);
+#else
+ PRINT_ERROR_AND_ABORT( "runtime_error", buf);
+#endif /* !TBB_USE_EXCEPTIONS */
+}
+#endif // _WIN32||_WIN64
+
+void throw_bad_last_alloc_exception_v4() {
+ throw_exception_v4(eid_bad_last_alloc);
+}
void throw_exception_v4 ( exception_id eid ) {
+ __TBB_ASSERT ( eid > 0 && eid < eid_max, "Unknown exception ID" );
switch ( eid ) {
- case eid_bad_alloc: throw std::bad_alloc();
- case eid_bad_last_alloc: throw bad_last_alloc();
- case eid_nonpositive_step: throw std::invalid_argument("Step must be positive");
- case eid_out_of_range: throw out_of_range("Index out of requested size range");
- case eid_segment_range_error: throw range_error ("Index out of allocated segment slots");
- case eid_index_range_error: throw range_error ("Index is not allocated");
- case eid_missing_wait: throw missing_wait();
- case eid_invalid_multiple_scheduling: throw invalid_multiple_scheduling();
- case eid_improper_lock: throw improper_lock();
- default:
- __TBB_ASSERT ( eid > 0 && eid < eid_max, "Unknown exception ID" );
+ case eid_bad_alloc: DO_THROW( bad_alloc, () );
+ case eid_bad_last_alloc: DO_THROW( bad_last_alloc, () );
+ case eid_nonpositive_step: DO_THROW( invalid_argument, ("Step must be positive") );
+ case eid_out_of_range: DO_THROW( out_of_range, ("Index out of requested size range") );
+ case eid_segment_range_error: DO_THROW( range_error, ("Index out of allocated segment slots") );
+ case eid_index_range_error: DO_THROW( range_error, ("Index is not allocated") );
+ case eid_missing_wait: DO_THROW( missing_wait, () );
+ case eid_invalid_multiple_scheduling: DO_THROW( invalid_multiple_scheduling, () );
+ case eid_improper_lock: DO_THROW( improper_lock, () );
+ case eid_possible_deadlock: DO_THROW( runtime_error, ("Resource deadlock would occur") );
+ case eid_operation_not_permitted: DO_THROW( runtime_error, ("Operation not permitted") );
+ case eid_condvar_wait_failed: DO_THROW( runtime_error, ("Wait on condition variable failed") );
+ case eid_invalid_load_factor: DO_THROW( out_of_range, ("Invalid hash load factor") );
+ case eid_invalid_buckets_number: DO_THROW( out_of_range, ("Invalid number of buckets") );
+ case eid_invalid_swap: DO_THROW( invalid_argument, ("swap() is invalid on non-equal allocators") );
+ case eid_reservation_length_error: DO_THROW( length_error, ("reservation size exceeds permitted max size") );
+ case eid_invalid_key: DO_THROW( out_of_range, ("invalid key") );
+ default: break;
}
+#if !TBB_USE_EXCEPTIONS && __APPLE__
+ out_of_range e1("");
+ length_error e2("");
+ range_error e3("");
+ invalid_argument e4("");
+#endif /* !TBB_USE_EXCEPTIONS && __APPLE__ */
}
-} //namespace internal
-
-#endif //__EXCEPTIONS || _CPPUNWIND
-
-namespace internal {
-
+#if _XBOX
+bool GetBoolEnvironmentVariable( const char * name ) { return false;}
+#else
bool GetBoolEnvironmentVariable( const char * name ) {
if( const char* s = getenv(name) )
return strcmp(s,"0") != 0;
return false;
}
+#endif /* !_XBOX */
#include "tbb_version.h"
@@ -116,8 +169,7 @@ void PrintExtraVersionInfo( const char* category, const char* description ) {
fprintf(stderr, "%s: %s\t%s\n", "TBB", category, description );
}
-void PrintRMLVersionInfo( void* arg, const char* server_info )
-{
+void PrintRMLVersionInfo( void* arg, const char* server_info ) {
PrintExtraVersionInfo( server_info, (const char *)arg );
}
diff --git a/src/tbb/tbb_misc.h b/src/tbb/tbb_misc.h
index 21b7f13..34478de 100644
--- a/src/tbb/tbb_misc.h
+++ b/src/tbb/tbb_misc.h
@@ -33,7 +33,13 @@
#include "tbb/tbb_machine.h"
#if _WIN32||_WIN64
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
#include <windows.h>
+#endif
#elif defined(__linux__)
#include <sys/sysinfo.h>
#elif defined(__sun)
@@ -47,23 +53,77 @@
#endif
namespace tbb {
-
namespace internal {
+const size_t MByte = 1<<20;
+
+#if !defined(__TBB_WORDSIZE)
+ const size_t ThreadStackSize = 1*MByte;
+#elif __TBB_WORDSIZE<=4
+ const size_t ThreadStackSize = 2*MByte;
+#else
+ const size_t ThreadStackSize = 4*MByte;
+#endif
+
#if defined(__TBB_DetectNumberOfWorkers)
+
static inline int DetectNumberOfWorkers() {
return __TBB_DetectNumberOfWorkers();
}
-#else
+#else /* !__TBB_DetectNumberOfWorkers */
#if _WIN32||_WIN64
+
+#if _XBOX
+
+// This port uses only 2 hardware threads for TBB on XBOX 360.
+// Others are left to sound etc.
+// Change the following mask to allow TBB use more HW threads.
+static const int XBOX360_HARDWARE_THREAD_MASK = 0x0C;
+
+static inline int DetectNumberOfWorkers()
+{
+ char a[XBOX360_HARDWARE_THREAD_MASK]; //compile time assert - at least one bit should be set always
+ a[0]=0;
+
+ return ((XBOX360_HARDWARE_THREAD_MASK >> 0) & 1) +
+ ((XBOX360_HARDWARE_THREAD_MASK >> 1) & 1) +
+ ((XBOX360_HARDWARE_THREAD_MASK >> 2) & 1) +
+ ((XBOX360_HARDWARE_THREAD_MASK >> 3) & 1) +
+ ((XBOX360_HARDWARE_THREAD_MASK >> 4) & 1) +
+ ((XBOX360_HARDWARE_THREAD_MASK >> 5) & 1) + 1; //+1 - tbb is creating DetectNumberOfWorkers()-1 threads in arena
+}
+
+static inline int GetHardwareThreadIndex(int workerThreadIndex)
+{
+ workerThreadIndex %= DetectNumberOfWorkers()-1;
+ int m = XBOX360_HARDWARE_THREAD_MASK;
+ int index = 0;
+ int skipcount = workerThreadIndex;
+ while (true)
+ {
+ if ((m & 1)!=0)
+ {
+ if (skipcount==0) break;
+ skipcount--;
+ }
+ m >>= 1;
+ index++;
+ }
+ return index;
+}
+
+#else /* !_XBOX */
+
static inline int DetectNumberOfWorkers() {
SYSTEM_INFO si;
GetSystemInfo(&si);
return static_cast<int>(si.dwNumberOfProcessors);
}
+#endif /* !_XBOX */
+
#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun)
static inline int DetectNumberOfWorkers() {
long number_of_workers;
@@ -95,23 +155,12 @@ static inline int DetectNumberOfWorkers() {
#else
#error DetectNumberOfWorkers: OS detection method is unknown
-
#endif /* os kind */
-#endif
-
-// assertion_failure is declared in tbb/tbb_stddef.h because it user code
-// needs to see its declaration.
+#endif /* !__TBB_DetectNumberOfWorkers */
-//! Throw std::runtime_error of form "(what): (strerror of error_code)"
-/* The "what" should be fairly short, not more than about 64 characters.
- Because we control all the call sites to handle_perror, it is pointless
- to bullet-proof it for very long strings.
-
- Design note: ADR put this routine off to the side in tbb_misc.cpp instead of
- Task.cpp because the throw generates a pathetic lot of code, and ADR wanted
- this large chunk of code to be placed on a cold page. */
-void __TBB_EXPORTED_FUNC handle_perror( int error_code, const char* what );
+//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info
+void handle_win_error( int error_code );
//! True if environment variable with given name is set and not 0; otherwise false.
bool GetBoolEnvironmentVariable( const char * name );
@@ -125,8 +174,60 @@ void PrintExtraVersionInfo( const char* category, const char* description );
//! A callback routine to print RML version information on stderr
void PrintRMLVersionInfo( void* arg, const char* server_info );
-} // namespace internal
+// For TBB compilation only; not to be used in public headers
+#if defined(min) || defined(max)
+#undef min
+#undef max
+#endif
+
+//! Utility template function returning lesser of the two values.
+/** Provided here to avoid including not strict safe <algorithm>.\n
+ In case operands cause signed/unsigned or size mismatch warnings it is caller's
+ responsibility to do the appropriate cast before calling the function. **/
+template<typename T1, typename T2>
+T1 min ( const T1& val1, const T2& val2 ) {
+ return val1 < val2 ? val1 : val2;
+}
+
+//! Utility template function returning greater of the two values.
+/** Provided here to avoid including not strict safe <algorithm>.\n
+ In case operands cause signed/unsigned or size mismatch warnings it is caller's
+ responsibility to do the appropriate cast before calling the function. **/
+template<typename T1, typename T2>
+T1 max ( const T1& val1, const T2& val2 ) {
+ return val1 < val2 ? val2 : val1;
+}
+
+//------------------------------------------------------------------------
+// FastRandom
+//------------------------------------------------------------------------
+
+/** Defined in tbb_main.cpp **/
+unsigned GetPrime ( unsigned seed );
+
+//! A fast random number generator.
+/** Uses linear congruential method. */
+class FastRandom {
+ unsigned 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( unsigned& seed ) {
+ unsigned short r = (unsigned short)(seed>>16);
+ seed = seed*a+1;
+ return r;
+ }
+ //! Construct a random number generator.
+ FastRandom( unsigned seed ) {
+ x = seed;
+ a = GetPrime( seed );
+ }
+};
+} // namespace internal
} // namespace tbb
#endif /* _TBB_tbb_misc_H */
diff --git a/src/tbb/tbb_thread.cpp b/src/tbb/tbb_thread.cpp
index 68b6570..40cb56f 100644
--- a/src/tbb/tbb_thread.cpp
+++ b/src/tbb/tbb_thread.cpp
@@ -28,17 +28,14 @@
#if _WIN32||_WIN64
#include <process.h> /* Need _beginthreadex from there */
-#include <stdexcept> /* Need std::runtime_error from there */
-#include <string> /* Need std::string from there */
-#endif // _WIN32||_WIN64
-#include "tbb_misc.h" // for handle_perror
+#endif
+#include "tbb_misc.h" // handle_win_error, ThreadStackSize
#include "tbb/tbb_stddef.h"
#include "tbb/tbb_thread.h"
#include "tbb/tbb_allocator.h"
#include "tbb/task_scheduler_init.h" /* Need task_scheduler_init::default_num_threads() */
namespace tbb {
-
namespace internal {
//! Allocate a closure
@@ -53,27 +50,6 @@ void free_closure_v3( void *ptr )
deallocate_via_handler_v3( ptr );
}
-#if _WIN32||_WIN64
-void handle_win_error( int error_code )
-{
- LPTSTR msg_buf;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- error_code,
- 0,
- (LPTSTR) &msg_buf,
- 0, NULL );
- const std::string msg_str(msg_buf);
- LocalFree(msg_buf);
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
- throw std::runtime_error(msg_str);
-#endif
-}
-#endif // _WIN32||_WIN64
-
void tbb_thread_v3::join()
{
__TBB_ASSERT( joinable(), "thread should be joinable when join called" );
@@ -108,22 +84,13 @@ void tbb_thread_v3::detach() {
my_handle = 0;
}
-const size_t MB = 1<<20;
-#if !defined(__TBB_WORDSIZE)
-const size_t ThreadStackSize = 1*MB;
-#elif __TBB_WORDSIZE<=4
-const size_t ThreadStackSize = 2*MB;
-#else
-const size_t ThreadStackSize = 4*MB;
-#endif
-
void tbb_thread_v3::internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine),
void* closure ) {
#if _WIN32||_WIN64
unsigned thread_id;
// The return type of _beginthreadex is "uintptr_t" on new MS compilers,
- // and 'unsigned long' on old MS compilers. Our uintptr works for both.
- uintptr status = _beginthreadex( NULL, ThreadStackSize, start_routine,
+ // and 'unsigned long' on old MS compilers. uintptr_t works for both.
+ uintptr_t status = _beginthreadex( NULL, ThreadStackSize, start_routine,
closure, 0, &thread_id );
if( status==0 )
handle_perror(errno,"__beginthreadex");
@@ -202,5 +169,4 @@ void thread_sleep_v3(const tick_count::interval_t &i)
}
} // internal
-
} // tbb
diff --git a/src/tbb/tls.h b/src/tbb/tls.h
index cf10afe..7f508a3 100644
--- a/src/tbb/tls.h
+++ b/src/tbb/tls.h
@@ -32,8 +32,14 @@
#if USE_PTHREAD
#include <pthread.h>
#else /* assume USE_WINTHREAD */
+#if defined(_XBOX)
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
#include <windows.h>
#endif
+#endif
namespace tbb {
diff --git a/src/tbb/tools_api/_ittnotify_static.h b/src/tbb/tools_api/_ittnotify_static.h
deleted file mode 100644
index 9a3238d..0000000
--- a/src/tbb/tools_api/_ittnotify_static.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- Copyright 2005-2010 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 "_config.h"
-
-#ifndef ITT_STUB
-#define ITT_STUB ITT_STUBV
-#endif /* ITT_STUB */
-
-#ifndef ITTAPI_CALL
-#define ITTAPI_CALL CDECL
-#endif /* ITTAPI_CALL */
-
-/* parameters for macro:
- type, func_name, arguments, params, func_name_in_dll, group
- */
-
-ITT_STUBV(void, pause,(void),(), pause, __itt_control_group)
-
-ITT_STUBV(void, resume,(void),(), resume, __itt_control_group)
-
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-
-ITT_STUB(int, markA,(__itt_mark_type mt, const char *parameter),(mt,parameter), markA, __itt_mark_group)
-
-ITT_STUB(int, markW,(__itt_mark_type mt, const wchar_t *parameter),(mt,parameter), markW, __itt_mark_group)
-
-ITT_STUB(int, mark_globalA,(__itt_mark_type mt, const char *parameter),(mt,parameter), mark_globalA, __itt_mark_group)
-
-ITT_STUB(int, mark_globalW,(__itt_mark_type mt, const wchar_t *parameter),(mt,parameter), mark_globalW, __itt_mark_group)
-
-ITT_STUBV(void, thread_set_nameA,( const char *name),(name), thread_set_nameA, __itt_thread_group)
-
-ITT_STUBV(void, thread_set_nameW,( const wchar_t *name),(name), thread_set_nameW, __itt_thread_group)
-
-ITT_STUBV(void, sync_createA,(void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute), sync_createA, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, sync_createW,(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (addr, objtype, objname, attribute), sync_createW, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, sync_renameA, (void *addr, const char *name), (addr, name), sync_renameA, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, sync_renameW, (void *addr, const wchar_t *name), (addr, name), sync_renameW, __itt_sync_group | __itt_fsync_group)
-#else /* WIN32 */
-
-ITT_STUB(int, mark,(__itt_mark_type mt, const char *parameter),(mt,parameter), mark, __itt_mark_group)
-ITT_STUB(int, mark_global,(__itt_mark_type mt, const char *parameter),(mt,parameter), mark_global, __itt_mark_group)
-
-ITT_STUBV(void, sync_set_name,(void *addr, const char *objtype, const char *objname, int attribute),(addr,objtype,objname,attribute), sync_set_name, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, thread_set_name,( const char *name),(name), thread_set_name, __itt_thread_group)
-
-ITT_STUBV(void, sync_create,(void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute), sync_create, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, sync_rename, (void *addr, const char *name), (addr, name), sync_rename, __itt_sync_group | __itt_fsync_group)
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-ITT_STUBV(void, sync_destroy,(void *addr), (addr), sync_destroy, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUB(int, mark_off,(__itt_mark_type mt),(mt), mark_off, __itt_mark_group)
-ITT_STUB(int, mark_global_off,(__itt_mark_type mt),(mt), mark_global_off, __itt_mark_group)
-
-ITT_STUBV(void, thread_ignore,(void),(), thread_ignore, __itt_thread_group)
-
-ITT_STUBV(void, sync_prepare,(void* addr),(addr), sync_prepare, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, sync_cancel,(void *addr),(addr), sync_cancel, __itt_sync_group)
-
-ITT_STUBV(void, sync_acquired,(void *addr),(addr), sync_acquired, __itt_sync_group)
-
-ITT_STUBV(void, sync_releasing,(void* addr),(addr), sync_releasing, __itt_sync_group)
-
-ITT_STUBV(void, sync_released,(void* addr),(addr), sync_released, __itt_sync_group)
-
-ITT_STUBV(void, memory_read,( void *address, size_t size ), (address, size), memory_read, __itt_all_group)
-ITT_STUBV(void, memory_write,( void *address, size_t size ), (address, size), memory_write, __itt_all_group)
-ITT_STUBV(void, memory_update,( void *address, size_t size ), (address, size), memory_update, __itt_all_group)
-
-ITT_STUB(int, jit_notify_event,(__itt_jit_jvm_event event_type, void* event_data),(event_type, event_data), jit_notify_event, __itt_jit_group)
-
-#ifndef NO_ITT_LEGACY
-
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-ITT_STUB(__itt_mark_type, mark_createA,(const char *name),(name), mark_createA, __itt_mark_group)
-ITT_STUB(__itt_mark_type, mark_createW,(const wchar_t *name),(name), mark_createW, __itt_mark_group)
-#else /* WIN32 */
-ITT_STUB(__itt_mark_type, mark_create,(const char *name),(name), mark_create, __itt_mark_group)
-#endif
-ITT_STUBV(void, fsync_prepare,(void* addr),(addr), sync_prepare, __itt_fsync_group)
-
-ITT_STUBV(void, fsync_cancel,(void *addr),(addr), sync_cancel, __itt_fsync_group)
-
-ITT_STUBV(void, fsync_acquired,(void *addr),(addr), sync_acquired, __itt_fsync_group)
-
-ITT_STUBV(void, fsync_releasing,(void* addr),(addr), sync_releasing, __itt_fsync_group)
-
-ITT_STUBV(void, fsync_released,(void* addr),(addr), sync_released, __itt_fsync_group)
-
-ITT_STUBV(void, notify_sync_prepare,(void *p),(p), notify_sync_prepare, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, notify_sync_cancel,(void *p),(p), notify_sync_cancel, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, notify_sync_acquired,(void *p),(p), notify_sync_acquired, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, notify_sync_releasing,(void *p),(p), notify_sync_releasing, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, notify_cpath_target,(void),(), notify_cpath_target, __itt_all_group)
-
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-ITT_STUBV(void, sync_set_nameA,(void *addr, const char *objtype, const char *objname, int attribute),(addr,objtype,objname,attribute), sync_set_nameA, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUBV(void, sync_set_nameW,(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute),(addr,objtype,objname,attribute), sync_set_nameW, __itt_sync_group | __itt_fsync_group)
-
-ITT_STUB (int, thr_name_setA,( char *name, int namelen ),(name,namelen), thr_name_setA, __itt_thread_group)
-
-ITT_STUB (int, thr_name_setW,( wchar_t *name, int namelen ),(name,namelen), thr_name_setW, __itt_thread_group)
-
-ITT_STUB (__itt_event, event_createA,( char *name, int namelen ),(name,namelen), event_createA, __itt_mark_group)
-
-ITT_STUB (__itt_event, event_createW,( wchar_t *name, int namelen ),(name,namelen), event_createW, __itt_mark_group)
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-ITT_STUB (int, thr_name_set,( char *name, int namelen ),(name,namelen), thr_name_set, __itt_thread_group)
-
-ITT_STUB (__itt_event, event_create,( char *name, int namelen ),(name,namelen), event_create, __itt_mark_group)
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-ITT_STUBV(void, thr_ignore,(void),(), thr_ignore, __itt_thread_group)
-
-ITT_STUB (int, event_start,( __itt_event event ),(event), event_start, __itt_mark_group)
-
-ITT_STUB (int, event_end,( __itt_event event ),(event), event_end, __itt_mark_group)
-
-ITT_STUB (__itt_state_t, state_get, (void), (), state_get, __itt_all_group)
-ITT_STUB (__itt_state_t, state_set,( __itt_state_t state), (state), state_set, __itt_all_group)
-ITT_STUB (__itt_obj_state_t, obj_mode_set, ( __itt_obj_prop_t prop, __itt_obj_state_t state), (prop, state), obj_mode_set, __itt_all_group)
-ITT_STUB (__itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t prop, __itt_thr_state_t state), (prop, state), thr_mode_set, __itt_all_group)
-
-ITT_STUB (const char*, api_version,(void),(), api_version, __itt_all_group)
-ITT_STUB (unsigned int, jit_get_new_method_id, (void), (), jit_get_new_method_id, __itt_jit_group)
-
-#endif /* NO_ITT_LEGACY */
-
diff --git a/src/tbb/tools_api/_disable_warnings.h b/src/tbb/tools_api/disable_warnings.h
similarity index 71%
rename from src/tbb/tools_api/_disable_warnings.h
rename to src/tbb/tools_api/disable_warnings.h
index 84e341b..28100e1 100644
--- a/src/tbb/tools_api/_disable_warnings.h
+++ b/src/tbb/tools_api/disable_warnings.h
@@ -26,17 +26,22 @@
the GNU General Public License.
*/
-#include "_config.h"
+#include "ittnotify_config.h"
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-#pragma warning (disable: 593) /* parameter "XXXX" was set but never used */
-#pragma warning (disable: 344) /* typedef name has already been declared (with same type) */
-#pragma warning (disable: 174) /* expression has no effect */
+#pragma warning (disable: 593) /* parameter "XXXX" was set but never used */
+#pragma warning (disable: 344) /* typedef name has already been declared (with same type) */
+#pragma warning (disable: 174) /* expression has no effect */
+#pragma warning (disable: 4127) /* conditional expression is constant */
+#pragma warning (disable: 4306) /* conversion from '?' to '?' of greater size */
-#elif defined __INTEL_COMPILER
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if defined __INTEL_COMPILER
#pragma warning (disable: 869) /* parameter "XXXXX" was never referenced */
#pragma warning (disable: 1418) /* external function definition with no prior declaration */
+#pragma warning (disable: 1419) /* external declaration in primary source file */
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __INTEL_COMPILER */
diff --git a/src/tbb/tools_api/internal/ittnotify.h b/src/tbb/tools_api/internal/ittnotify.h
new file mode 100644
index 0000000..f037807
--- /dev/null
+++ b/src/tbb/tools_api/internal/ittnotify.h
@@ -0,0 +1,661 @@
+/*
+ Copyright 2005-2010 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 _INTERNAL_ITTNOTIFY_H_
+#define _INTERNAL_ITTNOTIFY_H_
+/**
+ * @file
+ * @brief Internal User API functions and types
+ */
+
+/** @cond exclude_from_documentation */
+#ifndef ITT_OS_WIN
+# define ITT_OS_WIN 1
+#endif /* ITT_OS_WIN */
+
+#ifndef ITT_OS_LINUX
+# define ITT_OS_LINUX 2
+#endif /* ITT_OS_LINUX */
+
+#ifndef ITT_OS_MAC
+# define ITT_OS_MAC 3
+#endif /* ITT_OS_MAC */
+
+#ifndef ITT_OS
+# if defined WIN32 || defined _WIN32
+# define ITT_OS ITT_OS_WIN
+# elif defined( __APPLE__ ) && defined( __MACH__ )
+# define ITT_OS ITT_OS_MAC
+# else
+# define ITT_OS ITT_OS_LINUX
+# endif
+#endif /* ITT_OS */
+
+#ifndef ITT_PLATFORM_WIN
+# define ITT_PLATFORM_WIN 1
+#endif /* ITT_PLATFORM_WIN */
+
+#ifndef ITT_PLATFORM_POSIX
+# define ITT_PLATFORM_POSIX 2
+#endif /* ITT_PLATFORM_POSIX */
+
+#ifndef ITT_PLATFORM
+# if ITT_OS==ITT_OS_WIN
+# define ITT_PLATFORM ITT_PLATFORM_WIN
+# else
+# define ITT_PLATFORM ITT_PLATFORM_POSIX
+# endif /* _WIN32 */
+#endif /* ITT_PLATFORM */
+
+#include <stddef.h>
+#include <stdarg.h>
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <tchar.h>
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef CDECL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define CDECL __cdecl
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define CDECL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* CDECL */
+
+#ifndef STDCALL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define STDCALL __stdcall
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define STDCALL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI CDECL
+#define LIBITTAPI /* nothing */
+
+#define ITT_JOIN_AUX(p,n) p##n
+#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n)
+
+#ifndef INTEL_ITTNOTIFY_PREFIX
+# define INTEL_ITTNOTIFY_PREFIX __itt_
+#endif /* INTEL_ITTNOTIFY_PREFIX */
+#ifndef INTEL_ITTNOTIFY_POSTFIX
+# define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#endif /* INTEL_ITTNOTIFY_POSTFIX */
+
+#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+#define ITTNOTIFY_NAME(n) ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))
+
+#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)
+#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)
+
+#ifdef ITT_STUB
+#undef ITT_STUB
+#endif
+#ifdef ITT_STUBV
+#undef ITT_STUBV
+#endif
+#define ITT_STUBV(api,type,name,args,params) \
+ typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args; \
+ extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);
+#define ITT_STUB ITT_STUBV
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+/** @endcond */
+
+/**
+ * @defgroup internal Internal API
+ * @{
+ * @}
+ */
+
+/**
+ * @defgroup makrs Marks
+ * @ingroup internal
+ * Marks group
+ * @warning Internal API:
+ * - It is not shipped to outside of Intel
+ * - It is delivered to internal Intel teams using e-mail or SVN access only
+ * @{
+ */
+/** @brief user mark type */
+typedef int __itt_mark_type;
+
+/**
+ * @brief Creates a user mark type with the specified name using char or Unicode string.
+ * @param[in] name - name of mark to create
+ * @return Returns a handle to the mark type
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_mark_type ITTAPI __itt_mark_createA(const char *name);
+__itt_mark_type ITTAPI __itt_mark_createW(const wchar_t *name);
+#ifdef UNICODE
+# define __itt_mark_create __itt_mark_createW
+# define __itt_mark_create_ptr __itt_mark_createW_ptr
+#else /* UNICODE */
+# define __itt_mark_create __itt_mark_createA
+# define __itt_mark_create_ptr __itt_mark_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_mark_type ITTAPI __itt_mark_create(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char *name), (name))
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name), (name))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_mark_type, mark_create, (const char *name), (name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_createA ITTNOTIFY_DATA(mark_createA)
+#define __itt_mark_createA_ptr ITTNOTIFY_NAME(mark_createA)
+#define __itt_mark_createW ITTNOTIFY_DATA(mark_createW)
+#define __itt_mark_createW_ptr ITTNOTIFY_NAME(mark_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_create ITTNOTIFY_DATA(mark_create)
+#define __itt_mark_create_ptr ITTNOTIFY_NAME(mark_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_createA(name) (__itt_mark_type)0
+#define __itt_mark_createA_ptr 0
+#define __itt_mark_createW(name) (__itt_mark_type)0
+#define __itt_mark_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_create(name) (__itt_mark_type)0
+#define __itt_mark_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_createA_ptr 0
+#define __itt_mark_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Creates a "discrete" user mark type of the specified type and an optional parameter using char or Unicode string.
+ *
+ * - The mark of "discrete" type is placed to collection results in case of success. It appears in overtime view(s) as a special tick sign.
+ * - The call is "synchronous" - function returns after mark is actually added to results.
+ * - This function is useful, for example, to mark different phases of application
+ * (beginning of the next mark automatically meand end of current region).
+ * - Can be used together with "continuous" marks (see below) at the same collection session
+ * @param[in] mt - mark, created by __itt_mark_create(const char* name) function
+ * @param[in] parameter - string parameter of mark
+ * @return Returns zero value in case of success, non-zero value otherwise.
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int ITTAPI __itt_markA(__itt_mark_type mt, const char *parameter);
+int ITTAPI __itt_markW(__itt_mark_type mt, const wchar_t *parameter);
+#ifdef UNICODE
+# define __itt_mark __itt_markW
+# define __itt_mark_ptr __itt_markW_ptr
+#else /* UNICODE */
+# define __itt_mark __itt_markA
+# define __itt_mark_ptr __itt_markA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int ITTAPI __itt_mark(__itt_mark_type mt, const char *parameter);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, markA, (__itt_mark_type mt, const char *parameter), (mt, parameter))
+ITT_STUB(ITTAPI, int, markW, (__itt_mark_type mt, const wchar_t *parameter), (mt, parameter))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark, (__itt_mark_type mt, const char *parameter), (mt, parameter))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_markA ITTNOTIFY_DATA(markA)
+#define __itt_markA_ptr ITTNOTIFY_NAME(markA)
+#define __itt_markW ITTNOTIFY_DATA(markW)
+#define __itt_markW_ptr ITTNOTIFY_NAME(markW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark ITTNOTIFY_DATA(mark)
+#define __itt_mark_ptr ITTNOTIFY_NAME(mark)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_markA(mt, parameter) (int)0
+#define __itt_markA_ptr 0
+#define __itt_markW(mt, parameter) (int)0
+#define __itt_markW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark(mt, parameter) (int)0
+#define __itt_mark_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_markA_ptr 0
+#define __itt_markW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Use this if necessary to create a "discrete" user event type (mark) for process
+ * rather then for one thread
+ * @see int __itt_mark(__itt_mark_type mt, const char* parameter);
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int ITTAPI __itt_mark_globalA(__itt_mark_type mt, const char *parameter);
+int ITTAPI __itt_mark_globalW(__itt_mark_type mt, const wchar_t *parameter);
+#ifdef UNICODE
+# define __itt_mark_global __itt_mark_globalW
+# define __itt_mark_global_ptr __itt_mark_globalW_ptr
+#else /* UNICODE */
+# define __itt_mark_global __itt_mark_globalA
+# define __itt_mark_global_ptr __itt_mark_globalA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int ITTAPI __itt_mark_global(__itt_mark_type mt, const char *parameter);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, mark_globalA, (__itt_mark_type mt, const char *parameter), (mt, parameter))
+ITT_STUB(ITTAPI, int, mark_globalW, (__itt_mark_type mt, const wchar_t *parameter), (mt, parameter))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark_global, (__itt_mark_type mt, const char *parameter), (mt, parameter))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_globalA ITTNOTIFY_DATA(mark_globalA)
+#define __itt_mark_globalA_ptr ITTNOTIFY_NAME(mark_globalA)
+#define __itt_mark_globalW ITTNOTIFY_DATA(mark_globalW)
+#define __itt_mark_globalW_ptr ITTNOTIFY_NAME(mark_globalW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_global ITTNOTIFY_DATA(mark_global)
+#define __itt_mark_global_ptr ITTNOTIFY_NAME(mark_global)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_globalA(mt, parameter) (int)0
+#define __itt_mark_globalA_ptr 0
+#define __itt_mark_globalW(mt, parameter) (int)0
+#define __itt_mark_globalW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_global(mt, parameter) (int)0
+#define __itt_mark_global_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_globalA_ptr 0
+#define __itt_mark_globalW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_global_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Creates an "end" point for "continuous" mark with specified name.
+ *
+ * - Returns zero value in case of success, non-zero value otherwise.
+ * Also returns non-zero value when preceding "begin" point for the
+ * mark with the same name failed to be created or not created.
+ * - The mark of "continuous" type is placed to collection results in
+ * case of success. It appears in overtime view(s) as a special tick
+ * sign (different from "discrete" mark) together with line from
+ * corresponding "begin" mark to "end" mark.
+ * @note Continuous marks can overlap and be nested inside each other.
+ * Discrete mark can be nested inside marked region
+ * @param[in] mt - mark, created by __itt_mark_create(const char* name) function
+ * @return Returns zero value in case of success, non-zero value otherwise.
+ */
+int ITTAPI __itt_mark_off(__itt_mark_type mt);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, int, mark_off, (__itt_mark_type mt), (mt))
+#define __itt_mark_off ITTNOTIFY_DATA(mark_off)
+#define __itt_mark_off_ptr ITTNOTIFY_NAME(mark_off)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_mark_off(mt) (int)0
+#define __itt_mark_off_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_mark_off_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Use this if necessary to create an "end" point for mark of process
+ * @see int __itt_mark_off(__itt_mark_type mt);
+ */
+int ITTAPI __itt_mark_global_off(__itt_mark_type mt);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, int, mark_global_off, (__itt_mark_type mt), (mt))
+#define __itt_mark_global_off ITTNOTIFY_DATA(mark_global_off)
+#define __itt_mark_global_off_ptr ITTNOTIFY_NAME(mark_global_off)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_mark_global_off(mt) (int)0
+#define __itt_mark_global_off_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_mark_global_off_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} marks group */
+
+/**
+ * @defgroup counters Counters
+ * @ingroup internal
+ * Counters group
+ * @{
+ */
+/**
+ * @brief opaque structure for counter identification
+ */
+typedef struct ___itt_counter *__itt_counter;
+
+/**
+ * @brief Create a counter with given name/domain for the calling thread
+ *
+ * After __itt_counter_create() is called, __itt_counter_inc() / __itt_counter_inc_delta() can be used
+ * to increment the counter on any thread
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_counter ITTAPI __itt_counter_createA(const char *name, const char *domain);
+__itt_counter ITTAPI __itt_counter_createW(const wchar_t *name, const wchar_t *domain);
+#ifdef UNICODE
+# define __itt_counter_create __itt_counter_createW
+# define __itt_counter_create_ptr __itt_counter_createW_ptr
+#else /* UNICODE */
+# define __itt_counter_create __itt_counter_createA
+# define __itt_counter_create_ptr __itt_counter_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_counter ITTAPI __itt_counter_create(const char *name, const char *domain);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char *name, const char *domain), (name, domain))
+ITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain), (name, domain))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_counter, counter_create, (const char *name, const char *domain), (name, domain))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_createA ITTNOTIFY_DATA(counter_createA)
+#define __itt_counter_createA_ptr ITTNOTIFY_NAME(counter_createA)
+#define __itt_counter_createW ITTNOTIFY_DATA(counter_createW)
+#define __itt_counter_createW_ptr ITTNOTIFY_NAME(counter_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create ITTNOTIFY_DATA(counter_create)
+#define __itt_counter_create_ptr ITTNOTIFY_NAME(counter_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_createA(name, domain)
+#define __itt_counter_createA_ptr 0
+#define __itt_counter_createW(name, domain)
+#define __itt_counter_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create(name, domain)
+#define __itt_counter_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_createA_ptr 0
+#define __itt_counter_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Destroy the counter identified by the pointer previously returned by __itt_counter_create()
+ */
+void ITTAPI __itt_counter_destroy(__itt_counter id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_destroy, (__itt_counter id), (id))
+#define __itt_counter_destroy ITTNOTIFY_VOID(counter_destroy)
+#define __itt_counter_destroy_ptr ITTNOTIFY_NAME(counter_destroy)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_destroy(id)
+#define __itt_counter_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Increment the counter value
+ */
+void ITTAPI __itt_counter_inc(__itt_counter id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_inc, (__itt_counter id), (id))
+#define __itt_counter_inc ITTNOTIFY_VOID(counter_inc)
+#define __itt_counter_inc_ptr ITTNOTIFY_NAME(counter_inc)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_inc(id)
+#define __itt_counter_inc_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_inc_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Increment the counter value with x
+ */
+void ITTAPI __itt_counter_inc_delta(__itt_counter id, unsigned long long value);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value), (id, value))
+#define __itt_counter_inc_delta ITTNOTIFY_VOID(counter_inc_delta)
+#define __itt_counter_inc_delta_ptr ITTNOTIFY_NAME(counter_inc_delta)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_inc_delta(id, value)
+#define __itt_counter_inc_delta_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_inc_delta_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} counters group */
+
+/**
+ * @defgroup stitch Stack Stitching
+ * @ingroup internal
+ * Stack Stitching group
+ * @{
+ */
+/**
+ * @brief opaque structure for counter identification
+ */
+typedef struct ___itt_caller *__itt_caller;
+
+/**
+ * @brief Create the stitch point e.g. a point in call stack where other stacks should be stitched to.
+ * The function returns a unique identifier which is used to match the cut points with corresponding stitch points.
+ */
+__itt_caller ITTAPI __itt_stack_caller_create(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void), ())
+#define __itt_stack_caller_create ITTNOTIFY_DATA(stack_caller_create)
+#define __itt_stack_caller_create_ptr ITTNOTIFY_NAME(stack_caller_create)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_caller_create() (__itt_caller)0
+#define __itt_stack_caller_create_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_caller_create_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Destroy the inforamtion about stitch point identified by the pointer previously returned by __itt_stack_caller_create()
+ */
+void ITTAPI __itt_stack_caller_destroy(__itt_caller id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id), (id))
+#define __itt_stack_caller_destroy ITTNOTIFY_VOID(stack_caller_destroy)
+#define __itt_stack_caller_destroy_ptr ITTNOTIFY_NAME(stack_caller_destroy)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_caller_destroy(id)
+#define __itt_stack_caller_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_caller_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Sets the cut point. Stack from each event which occurs after this call will be cut
+ * at the same stack level the function was called and stitched to the corresponding stitch point.
+ */
+void ITTAPI __itt_stack_callee_enter(__itt_caller id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, stack_callee_enter, (__itt_caller id), (id))
+#define __itt_stack_callee_enter ITTNOTIFY_VOID(stack_callee_enter)
+#define __itt_stack_callee_enter_ptr ITTNOTIFY_NAME(stack_callee_enter)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_callee_enter(id)
+#define __itt_stack_callee_enter_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_callee_enter_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief This function eliminates the cut point which was set by latest __itt_stack_callee_enter().
+ */
+void ITTAPI __itt_stack_callee_leave(__itt_caller id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, stack_callee_leave, (__itt_caller id), (id))
+#define __itt_stack_callee_leave ITTNOTIFY_VOID(stack_callee_leave)
+#define __itt_stack_callee_leave_ptr ITTNOTIFY_NAME(stack_callee_leave)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_callee_leave(id)
+#define __itt_stack_callee_leave_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_callee_leave_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @} stitch group */
+
+/* ***************************************************************************************************************************** */
+
+/** @cond exclude_from_documentation */
+typedef enum __itt_error_code {
+ __itt_error_success = 0, /*!< no error */
+ __itt_error_no_module = 1, /*!< module can't be loaded */
+ /* %1$s -- library name; win: %2$d -- system error code; unx: %2$s -- system error message. */
+ __itt_error_no_symbol = 2, /*!< symbol not found */
+ /* %1$s -- library name, %2$s -- symbol name. */
+ __itt_error_unknown_group = 3, /*!< unknown group specified */
+ /* %1$s -- env var name, %2$s -- group name. */
+ __itt_error_cant_read_env = 4, /*!< GetEnvironmentVariable() failed */
+ /* %1$s -- env var name, %2$d -- system error. */
+ __itt_error_env_too_long = 5, /*!< variable value too long */
+ /* %1$s -- env var name, %2$d -- actual length of the var, %3$d -- max allowed length. */
+ __itt_error_system = 6 /*!< pthread_mutexattr_init or pthread_mutex_init failed */
+ /* %1$s -- function name, %2$d -- errno. */
+} __itt_error_code;
+
+typedef void (__itt_error_notification_t)(__itt_error_code code, va_list);
+__itt_error_notification_t* __itt_set_error_handler(__itt_error_notification_t*);
+
+const char* ITTAPI __itt_api_version(void);
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#define __itt_error_handler ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, error_handler)
+void __itt_error_handler(__itt_error_code code, va_list args);
+extern const int ITTNOTIFY_NAME(err);
+#define __itt_err ITTNOTIFY_NAME(err)
+ITT_STUB(ITTAPI, const char*, api_version, (void), ())
+#define __itt_api_version ITTNOTIFY_DATA(api_version)
+#define __itt_api_version_ptr ITTNOTIFY_NAME(api_version)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_api_version() (const char*)0
+#define __itt_api_version_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_api_version_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/** @endcond */
+
+#endif /* _INTERNAL_ITTNOTIFY_H_ */
diff --git a/src/tbb/tools_api/ittnotify.h b/src/tbb/tools_api/ittnotify.h
index dbacfd2..254f7d3 100644
--- a/src/tbb/tools_api/ittnotify.h
+++ b/src/tbb/tools_api/ittnotify.h
@@ -26,35 +26,32 @@
the GNU General Public License.
*/
-/** @mainpage
+#ifndef _ITTNOTIFY_H_
+#define _ITTNOTIFY_H_
+/**
+ * @file
+ * @brief Public User API functions and types
+ * @mainpage
* Ability to control the collection during runtime. User API can be inserted into the user application.
* Commands include:
- - Pause/resume analysis
- - Stop analysis and application, view results
- - Cancel analysis and application without generating results
- - Mark current time in results
+ * - Collection control
+ * - Marking
+ * - Thread manipulation
+ * - User-defined synchronization primitives
+ *
* The User API provides ability to control the collection, set marks at the execution of specific user code and
- * specify custom synchronization primitives implemented without standard system APIs.
- *
+ * specify custom synchronization primitives implemented without standard system APIs.
+ *
* Use case: User inserts API calls to the desired places in her code. The code is then compiled and
- * linked with static part of User API library. User can recompile the code with specific macro defined
- * to enable API calls. If this macro is not defined there is no run-time overhead and no need to link
+ * linked with static part of User API library. User can recompile the code with specific macro defined
+ * to enable API calls. If this macro is not defined there is no run-time overhead and no need to link
* with static part of User API library. During runtime the static library loads and initializes the dynamic part.
* In case of instrumentation-based collection, only a stub library is loaded; otherwise a proxy library is loaded,
* which calls the collector.
- *
- * User API set is native (C/C++) only (no MRTE support). As amitigation can use JNI or C/C++ function
- * call from managed code where needed. If the collector causes significant overhead or data storage, then
+ *
+ * User API set is native (C/C++) only (no MRTE support). As a mitigation can use JNI or C/C++ function
+ * call from managed code where needed. If the collector causes significant overhead or data storage, then
* pausing analysis should reduce the overhead to minimal levels.
-*/
-/** @example example.cpp
- * @brief The following example program shows the usage of User API
- */
-
-#ifndef _ITTNOTIFY_H_
-#define _ITTNOTIFY_H_
-/** @file ittnotify.h
- * @brief Header file which contains declaration of user API functions and types
*/
/** @cond exclude_from_documentation */
@@ -82,7 +79,7 @@
#ifndef ITT_PLATFORM_WIN
# define ITT_PLATFORM_WIN 1
-#endif /* ITT_PLATFORM_WIN */
+#endif /* ITT_PLATFORM_WIN */
#ifndef ITT_PLATFORM_POSIX
# define ITT_PLATFORM_POSIX 2
@@ -96,1139 +93,1317 @@
# endif /* _WIN32 */
#endif /* ITT_PLATFORM */
-
+#include <stddef.h>
+#include <stdarg.h>
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#include <tchar.h>
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define ITTAPI_CALL CDECL
-
#ifndef CDECL
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# define CDECL
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define CDECL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* CDECL */
-/** @endcond */
-
-/** @brief user event type */
-typedef int __itt_mark_type;
-typedef int __itt_event;
-typedef int __itt_state_t;
-
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-# ifdef UNICODE
- typedef wchar_t __itt_char;
-# else /* UNICODE */
- typedef char __itt_char;
-# endif /* UNICODE */
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @brief Typedef for char or wchar_t (if Unicode symbol is allowed) on Windows.
- * And typedef for char on Linux.
- */
- typedef char __itt_char;
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @cond exclude_from_documentation */
-typedef enum __itt_obj_state {
- __itt_obj_state_err = 0,
- __itt_obj_state_clr = 1,
- __itt_obj_state_set = 2,
- __itt_obj_state_use = 3
-} __itt_obj_state_t;
-
-typedef enum __itt_thr_state {
- __itt_thr_state_err = 0,
- __itt_thr_state_clr = 1,
- __itt_thr_state_set = 2
-} __itt_thr_state_t;
-
-typedef enum __itt_obj_prop {
- __itt_obj_prop_watch = 1,
- __itt_obj_prop_ignore = 2,
- __itt_obj_prop_sharable = 3
-} __itt_obj_prop_t;
-
-typedef enum __itt_thr_prop {
- __itt_thr_prop_quiet = 1
-} __itt_thr_prop_t;
-/** @endcond */
-typedef enum __itt_error_code {
- __itt_error_success = 0, /*!< no error */
- __itt_error_no_module = 1, /*!< module can't be loaded */
- __itt_error_no_symbol = 2, /*!< symbol not found */
- __itt_error_unknown_group = 3, /*!< unknown group specified */
- __itt_error_cant_read_env = 4 /*!< variable value too long */
-} __itt_error_code;
-
-typedef void (__itt_error_notification_t)(__itt_error_code code, const char* msg);
-
-/*******************************************
- * Various constants used by JIT functions *
- *******************************************/
-
- /*! @enum ___itt_jit_jvm_event
- * event notification
- */
- typedef enum ___itt_jit_jvm_event
- {
-
- __itt_JVM_EVENT_TYPE_SHUTDOWN = 2, /*!< Shutdown. Program exiting. EventSpecificData NA*/
- __itt_JVM_EVENT_TYPE_METHOD_LOAD_FINISHED=13,/*!< JIT profiling. Issued after method code jitted into memory but before code is executed
- * event_data is an __itt_JIT_Method_Load */
- __itt_JVM_EVENT_TYPE_METHOD_UNLOAD_START /*!< JIT profiling. Issued before unload. Method code will no longer be executed, but code and info are still in memory.
- * The VTune profiler may capture method code only at this point. event_data is __itt_JIT_Method_Id */
-
- } __itt_jit_jvm_event;
-
-/*! @enum ___itt_jit_environment_type
- * @brief Enumerator for the environment of methods
- */
-typedef enum ___itt_jit_environment_type
-{
- __itt_JIT_JITTINGAPI = 2
-} __itt_jit_environment_type;
-
-/**********************************
- * Data structures for the events *
- **********************************/
-
- /*! @struct ___itt_jit_method_id
- * @brief structure for the events: __itt_iJVM_EVENT_TYPE_METHOD_UNLOAD_START
- */
-typedef struct ___itt_jit_method_id
-{
- /** @brief Id of the method (same as the one passed in the __itt_JIT_Method_Load struct */
- unsigned int method_id;
-
-} *__itt_pjit_method_id, __itt_jit_method_id;
-
-/*! @struct ___itt_jit_line_number_info
- * @brief structure for the events: __itt_iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED
- */
-typedef struct ___itt_jit_line_number_info
-{
- /** @brief x86 Offset from the begining of the method */
- unsigned int offset;
- /** @brief source line number from the begining of the source file. */
- unsigned int line_number;
-
-} *__itt_pjit_line_number_info, __itt_jit_line_number_info;
-/*! @struct ___itt_jit_method_load
- * @brief structure for the events: __itt_iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED
- */
-typedef struct ___itt_jit_method_load
-{
- /** @brief unique method ID - can be any unique value, (except 0 - 999) */
- unsigned int method_id;
- /** @brief method name (can be with or without the class and signature, in any case the class name will be added to it) */
- char* method_name;
- /** @brief virtual address of that method - This determines the method range for the iJVM_EVENT_TYPE_ENTER/LEAVE_METHOD_ADDR events */
- void* method_load_address;
- /** @brief Size in memory - Must be exact */
- unsigned int method_size;
- /** @brief Line Table size in number of entries - Zero if none */
- unsigned int line_number_size;
- /** @brief Pointer to the begining of the line numbers info array */
- __itt_pjit_line_number_info line_number_table;
- /** @brief unique class ID */
- unsigned int class_id;
- /** @brief class file name */
- char* class_file_name;
- /** @brief source file name */
- char* source_file_name;
- /** @brief bits supplied by the user for saving in the JIT file... */
- void* user_data;
- /** @brief the size of the user data buffer */
- unsigned int user_data_size;
- /** @note no need to fill this field, it's filled by VTune */
- __itt_jit_environment_type env;
-} *__itt_pjit_method_load, __itt_jit_method_load;
-
-/**
- * @brief General behavior: application continues to run, but no profiling information is being collected
-
- * - Pausing occurs not only for the current thread but for all process as well as spawned processes
- * - Intel(R) Parallel Inspector: does not analyze or report errors that involve memory access.
- * - Intel(R) Parallel Inspector: Other errors are reported as usual. Pausing data collection in
- Intel(R) Parallel Inspector only pauses tracing and analyzing memory access. It does not pause
- tracing or analyzing threading APIs.
- * - Intel(R) Parallel Amplifier: does continue to record when new threads are started
- * - Other effects: possible reduction of runtime overhead
- */
-void ITTAPI_CALL __itt_pause(void);
+#ifndef STDCALL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define STDCALL __stdcall
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define STDCALL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI CDECL
+#define LIBITTAPI /* nothing */
+
+#ifdef INTEL_ITTNOTIFY_ENABLE_LEGACY
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# pragma message("WARNING!!! Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro")
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+// #warning usage leads to ICC's compilation error
+// # warning "Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro"
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# include "legacy/ittnotify.h"
+#endif /* INTEL_ITTNOTIFY_ENABLE_LEGACY */
-/**
- * @brief General behavior: application continues to run, collector resumes profiling information
- * collection for all threads and processes of profiled application
- */
-void ITTAPI_CALL __itt_resume(void);
+#define ITT_JOIN_AUX(p,n) p##n
+#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n)
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-__itt_mark_type ITTAPI_CALL __itt_mark_createA(const char *name);
-__itt_mark_type ITTAPI_CALL __itt_mark_createW(const wchar_t *name);
-#ifdef UNICODE
-# define __itt_mark_create __itt_mark_createW
-# define __itt_mark_create_ptr __itt_mark_createW_ptr
-#else /* UNICODE */
-# define __itt_mark_create __itt_mark_createA
-# define __itt_mark_create_ptr __itt_mark_createA_ptr
-#endif /* UNICODE */
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @brief Creates a user event type (mark) with the specified name using char or Unicode string.
- * @param[in] name - name of mark to create
- * @return Returns a handle to the mark type
- */
-__itt_mark_type ITTAPI_CALL __itt_mark_create(const __itt_char* name);
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#ifndef INTEL_ITTNOTIFY_PREFIX
+# define INTEL_ITTNOTIFY_PREFIX __itt_
+#endif /* INTEL_ITTNOTIFY_PREFIX */
+#ifndef INTEL_ITTNOTIFY_POSTFIX
+# define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#endif /* INTEL_ITTNOTIFY_POSTFIX */
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-int ITTAPI_CALL __itt_markA(__itt_mark_type mt, const char *parameter);
-int ITTAPI_CALL __itt_markW(__itt_mark_type mt, const wchar_t *parameter);
+#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+#define ITTNOTIFY_NAME(n) ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))
-int ITTAPI_CALL __itt_mark_globalA(__itt_mark_type mt, const char *parameter);
-int ITTAPI_CALL __itt_mark_globalW(__itt_mark_type mt, const wchar_t *parameter);
+#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)
+#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)
-#ifdef UNICODE
-# define __itt_mark __itt_markW
-# define __itt_mark_ptr __itt_markW_ptr
+#ifdef ITT_STUB
+#undef ITT_STUB
+#endif
+#ifdef ITT_STUBV
+#undef ITT_STUBV
+#endif
+#define ITT_STUBV(api,type,name,args,params) \
+ typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args; \
+ extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);
+#define ITT_STUB ITT_STUBV
-# define __itt_mark_global __itt_mark_globalW
-# define __itt_mark_global_ptr __itt_mark_globalW_ptr
-#else /* UNICODE */
-# define __itt_mark __itt_markA
-# define __itt_mark_ptr __itt_markA_ptr
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+/** @endcond */
-# define __itt_mark_global __itt_mark_globalA
-# define __itt_mark_global_ptr __itt_mark_globalA_ptr
-#endif /* UNICODE */
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @brief Creates a "discrete" user event type (mark) of the specified type and an optional parameter using char or Unicode string.
-
- * - The mark of "discrete" type is placed to collection results in case of success. It appears in overtime view(s) as a special tick sign.
- * - The call is "synchronous" - function returns after mark is actually added to results.
- * - This function is useful, for example, to mark different phases of application (beginning of the next mark automatically meand end of current region).
- * - Can be used together with "continuous" marks (see below) at the same collection session
- * @param[in] mt - mark, created by __itt_mark_create(const __itt_char* name) function
- * @param[in] parameter - string parameter of mark
- * @return Returns zero value in case of success, non-zero value otherwise.
+/**
+ * @defgroup public Public API
+ * @{
+ * @}
*/
-int ITTAPI_CALL __itt_mark(__itt_mark_type mt, const __itt_char* parameter);
-/** @brief Use this if necessary to create a "discrete" user event type (mark) for process
- * rather then for one thread
- * @see int ITTAPI_CALL __itt_mark(__itt_mark_type mt, const __itt_char* parameter);
+
+/**
+ * @defgroup control Collection Control
+ * @ingroup public
+ * General behavior: application continues to run, but no profiling information is being collected
+ *
+ * Pausing occurs not only for the current thread but for all process as well as spawned processes
+ * - Intel(R) Parallel Inspector:
+ * - Does not analyze or report errors that involve memory access.
+ * - Other errors are reported as usual. Pausing data collection in
+ * Intel(R) Parallel Inspector only pauses tracing and analyzing
+ * memory access. It does not pause tracing or analyzing threading APIs.
+ * .
+ * - Intel(R) Parallel Amplifier:
+ * - Does continue to record when new threads are started.
+ * .
+ * - Other effects:
+ * - Possible reduction of runtime overhead.
+ * .
+ * @{
*/
-int ITTAPI_CALL __itt_mark_global(__itt_mark_type mt, const __itt_char* parameter);
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/**
- * @brief Creates an "end" point for "continuous" mark with specified name.
-
- * - Returns zero value in case of success, non-zero value otherwise. Also returns non-zero value when preceding "begin" point for the mark with the same name failed to be created or not created. (*)
- * - The mark of "continuous" type is placed to collection results in case of success. It appears in overtime view(s) as a special tick sign (different from "discrete" mark) together with line from corresponding "begin" mark to "end" mark. (*) * - Continuous marks can overlap (*) and be nested inside each other. Discrete mark can be nested inside marked region
- *
- * @param[in] mt - mark, created by __itt_mark_create(const __itt_char* name) function
- *
- * @return Returns zero value in case of success, non-zero value otherwise.
+/** @brief Pause collection */
+void ITTAPI __itt_pause(void);
+/** @brief Resume collection */
+void ITTAPI __itt_resume(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, pause, (void), ())
+ITT_STUBV(ITTAPI, void, resume, (void), ())
+#define __itt_pause ITTNOTIFY_VOID(pause)
+#define __itt_pause_ptr ITTNOTIFY_NAME(pause)
+#define __itt_resume ITTNOTIFY_VOID(resume)
+#define __itt_resume_ptr ITTNOTIFY_NAME(resume)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_pause()
+#define __itt_pause_ptr 0
+#define __itt_resume()
+#define __itt_resume_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_pause_ptr 0
+#define __itt_resume_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} control group */
+
+/**
+ * @defgroup threads Threads
+ * @ingroup public
+ * Threads name group
+ * @{
*/
-int ITTAPI_CALL __itt_mark_off(__itt_mark_type mt);
-/** @brief Use this if necessary to create an "end" point for mark of process
- * @see int ITTAPI_CALL __itt_mark_off(__itt_mark_type mt);
+/**
+ * @brief Sets thread name using char or Unicode string
+ * @param[in] name - name of thread
*/
-int ITTAPI_CALL __itt_mark_global_off(__itt_mark_type mt);
-
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-void ITTAPI_CALL __itt_thread_set_nameA(const char *name);
-void ITTAPI_CALL __itt_thread_set_nameW(const wchar_t *name);
+void ITTAPI __itt_thread_set_nameA(const char *name);
+void ITTAPI __itt_thread_set_nameW(const wchar_t *name);
#ifdef UNICODE
-# define __itt_thread_set_name __itt_thread_set_nameW
+# define __itt_thread_set_name __itt_thread_set_nameW
# define __itt_thread_set_name_ptr __itt_thread_set_nameW_ptr
#else /* UNICODE */
-# define __itt_thread_set_name __itt_thread_set_nameA
+# define __itt_thread_set_name __itt_thread_set_nameA
# define __itt_thread_set_name_ptr __itt_thread_set_nameA_ptr
#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_thread_set_name(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, thread_set_nameA, (const char *name), (name))
+ITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name), (name))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, thread_set_name, (const char *name), (name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thread_set_nameA ITTNOTIFY_VOID(thread_set_nameA)
+#define __itt_thread_set_nameA_ptr ITTNOTIFY_NAME(thread_set_nameA)
+#define __itt_thread_set_nameW ITTNOTIFY_VOID(thread_set_nameW)
+#define __itt_thread_set_nameW_ptr ITTNOTIFY_NAME(thread_set_nameW)
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @brief Sets thread name using char or Unicode string
- * @param[in] name - name of thread
- */
-void ITTAPI_CALL __itt_thread_set_name(const __itt_char* name);
+#define __itt_thread_set_name ITTNOTIFY_VOID(thread_set_name)
+#define __itt_thread_set_name_ptr ITTNOTIFY_NAME(thread_set_name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thread_set_nameA(name)
+#define __itt_thread_set_nameA_ptr 0
+#define __itt_thread_set_nameW(name)
+#define __itt_thread_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thread_set_name(name)
+#define __itt_thread_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thread_set_nameA_ptr 0
+#define __itt_thread_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thread_set_name_ptr 0
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-/** @brief Mark current thread as ignored from this point on, for the duration of its existence. */
-void ITTAPI_CALL __itt_thread_ignore(void);
-/** @brief Is called when sync object is destroyed (needed to track lifetime of objects) */
-void ITTAPI_CALL __itt_sync_destroy(void *addr);
-/** @brief Enter spin loop on user-defined sync object */
-void ITTAPI_CALL __itt_sync_prepare(void* addr);
-/** @brief Quit spin loop without acquiring spin object */
-void ITTAPI_CALL __itt_sync_cancel(void *addr);
-/** @brief Successful spin loop completion (sync object acquired) */
-void ITTAPI_CALL __itt_sync_acquired(void *addr);
-/** @brief Start sync object releasing code. Is called before the lock release call. */
-void ITTAPI_CALL __itt_sync_releasing(void* addr);
-/** @brief Sync object released. Is called after the release call */
-void ITTAPI_CALL __itt_sync_released(void* addr);
-
-/** @brief Fast synchronization which does no require spinning.
-
- * - This special function is to be used by TBB and OpenMP libraries only when they know
- * there is no spin but they need to suppress TC warnings about shared variable modifications.
- * - It only has corresponding pointers in static library and does not have corresponding function
- * in dynamic library.
- * @see void ITTAPI_CALL __itt_sync_prepare(void* addr);
-*/
-void ITTAPI_CALL __itt_fsync_prepare(void* addr);
-/** @brief Fast synchronization which does no require spinning.
-
- * - This special function is to be used by TBB and OpenMP libraries only when they know
- * there is no spin but they need to suppress TC warnings about shared variable modifications.
- * - It only has corresponding pointers in static library and does not have corresponding function
- * in dynamic library.
- * @see void ITTAPI_CALL __itt_sync_cancel(void *addr);
-*/
-void ITTAPI_CALL __itt_fsync_cancel(void *addr);
-/** @brief Fast synchronization which does no require spinning.
-
- * - This special function is to be used by TBB and OpenMP libraries only when they know
- * there is no spin but they need to suppress TC warnings about shared variable modifications.
- * - It only has corresponding pointers in static library and does not have corresponding function
- * in dynamic library.
- * @see void ITTAPI_CALL __itt_sync_acquired(void *addr);
-*/
-void ITTAPI_CALL __itt_fsync_acquired(void *addr);
-/** @brief Fast synchronization which does no require spinning.
-
- * - This special function is to be used by TBB and OpenMP libraries only when they know
- * there is no spin but they need to suppress TC warnings about shared variable modifications.
- * - It only has corresponding pointers in static library and does not have corresponding function
- * in dynamic library.
- * @see void ITTAPI_CALL __itt_sync_releasing(void* addr);
-*/
-void ITTAPI_CALL __itt_fsync_releasing(void* addr);
-/** @brief Fast synchronization which does no require spinning.
-
- * - This special function is to be used by TBB and OpenMP libraries only when they know
- * there is no spin but they need to suppress TC warnings about shared variable modifications.
- * - It only has corresponding pointers in static library and does not have corresponding function
- * in dynamic library.
- * @see void ITTAPI_CALL __itt_sync_released(void* addr);
-*/
-void ITTAPI_CALL __itt_fsync_released(void* addr);
+/**
+ * @brief Mark current thread as ignored from this point on, for the duration of its existence.
+ */
+void ITTAPI __itt_thread_ignore(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, thread_ignore, (void), ())
+#define __itt_thread_ignore ITTNOTIFY_VOID(thread_ignore)
+#define __itt_thread_ignore_ptr ITTNOTIFY_NAME(thread_ignore)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_thread_ignore()
+#define __itt_thread_ignore_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_thread_ignore_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} threads group */
-/** @hideinitializer
+/**
+ * @defgroup sync Synchronization
+ * @ingroup public
+ * Synchronization group
+ * @{
+ */
+/**
+ * @hideinitializer
* @brief possible value of attribute argument for sync object type
*/
#define __itt_attr_barrier 1
-/** @hideinitializer
+
+/**
+ * @hideinitializer
* @brief possible value of attribute argument for sync object type
*/
#define __itt_attr_mutex 2
+/**
+ * @brief Register the creation of a sync object using char or Unicode string
+ * @param[in] addr - pointer to the sync object. You should use a real pointer to your object
+ * to make sure that the values don't clash with other object addresses
+ * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will
+ * be assumed to be of generic "User Synchronization" type
+ * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned
+ * to the object -- you can use the __itt_sync_rename call later to assign
+ * the name
+ * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the
+ * exact semantics of how prepare/acquired/releasing calls work.
+ */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-void ITTAPI_CALL __itt_sync_set_nameA(void *addr, const char *objtype, const char *objname, int attribute);
-void ITTAPI_CALL __itt_sync_set_nameW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);
+void ITTAPI __itt_sync_createA(void *addr, const char *objtype, const char *objname, int attribute);
+void ITTAPI __itt_sync_createW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);
#ifdef UNICODE
-# define __itt_sync_set_name __itt_sync_set_nameW
-# define __itt_sync_set_name_ptr __itt_sync_set_nameW_ptr
+# define __itt_sync_create __itt_sync_createW
+# define __itt_sync_create_ptr __itt_sync_createW_ptr
#else /* UNICODE */
-# define __itt_sync_set_name __itt_sync_set_nameA
-# define __itt_sync_set_name_ptr __itt_sync_set_nameA_ptr
+# define __itt_sync_create __itt_sync_createA
+# define __itt_sync_create_ptr __itt_sync_createA_ptr
#endif /* UNICODE */
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @deprecated Legacy API
- * @brief Assign a name to a sync object using char or Unicode string
- * @param[in] addr - pointer to the sync object. You should use a real pointer to your object
- * to make sure that the values don't clash with other object addresses
- * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will
- * be assumed to be of generic "User Synchronization" type
- * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned
- * to the object -- you can use the __itt_sync_rename call later to assign
- * the name
- * @param[in] attribute - one of [ #__itt_attr_barrier , #__itt_attr_mutex] values which defines the
- * exact semantics of how prepare/acquired/releasing calls work.
- */
-void ITTAPI_CALL __itt_sync_set_name(void *addr, const __itt_char* objtype, const __itt_char* objname, int attribute);
+void ITTAPI __itt_sync_create (void *addr, const char *objtype, const char *objname, int attribute);
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-void ITTAPI_CALL __itt_sync_createA(void *addr, const char *objtype, const char *objname, int attribute);
-void ITTAPI_CALL __itt_sync_createW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);
-#ifdef UNICODE
-#define __itt_sync_create __itt_sync_createW
-# define __itt_sync_create_ptr __itt_sync_createW_ptr
-#else /* UNICODE */
-#define __itt_sync_create __itt_sync_createA
-# define __itt_sync_create_ptr __itt_sync_createA_ptr
-#endif /* UNICODE */
+ITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute))
+ITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (addr, objtype, objname, attribute))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_create, (void *addr, const char* objtype, const char* objname, int attribute), (addr, objtype, objname, attribute))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_createA ITTNOTIFY_VOID(sync_createA)
+#define __itt_sync_createA_ptr ITTNOTIFY_NAME(sync_createA)
+#define __itt_sync_createW ITTNOTIFY_VOID(sync_createW)
+#define __itt_sync_createW_ptr ITTNOTIFY_NAME(sync_createW)
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @brief Register the creation of a sync object using char or Unicode string
- * @param[in] addr - pointer to the sync object. You should use a real pointer to your object
- * to make sure that the values don't clash with other object addresses
- * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will
- * be assumed to be of generic "User Synchronization" type
- * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned
- * to the object -- you can use the __itt_sync_rename call later to assign
- * the name
- * @param[in] attribute - one of [ #__itt_attr_barrier, #__itt_attr_mutex] values which defines the
- * exact semantics of how prepare/acquired/releasing calls work.
-**/
-void ITTAPI_CALL __itt_sync_create(void *addr, const __itt_char* objtype, const __itt_char* objname, int attribute);
+#define __itt_sync_create ITTNOTIFY_VOID(sync_create)
+#define __itt_sync_create_ptr ITTNOTIFY_NAME(sync_create)
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @brief Assign a name to a sync object using char or Unicode string.
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_createA(addr, objtype, objname, attribute)
+#define __itt_sync_createA_ptr 0
+#define __itt_sync_createW(addr, objtype, objname, attribute)
+#define __itt_sync_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_create(addr, objtype, objname, attribute)
+#define __itt_sync_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_createA_ptr 0
+#define __itt_sync_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
- * Sometimes you cannot assign the name to a sync object in the __itt_sync_set_name call because it
+/**
+ * @brief Assign a name to a sync object using char or Unicode string.
+ *
+ * Sometimes you cannot assign the name to a sync object in the __itt_sync_set_name() call because it
* is not yet known there. In this case you should use the rename call which allows to assign the
* name after the creation has been registered. The renaming can be done multiple times. All waits
* after a new name has been assigned will be attributed to the sync object with this name.
- * @param[in] addr - pointer to the sync object
+ * @param[in] addr - pointer to the sync object
* @param[in] name - null-terminated object name string
-**/
+ */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-void ITTAPI_CALL __itt_sync_renameA(void *addr, const char *name);
-void ITTAPI_CALL __itt_sync_renameW(void *addr, const wchar_t *name);
+void ITTAPI __itt_sync_renameA(void *addr, const char *name);
+void ITTAPI __itt_sync_renameW(void *addr, const wchar_t *name);
#ifdef UNICODE
-#define __itt_sync_rename __itt_sync_renameW
+# define __itt_sync_rename __itt_sync_renameW
# define __itt_sync_rename_ptr __itt_sync_renameW_ptr
#else /* UNICODE */
-#define __itt_sync_rename __itt_sync_renameA
+# define __itt_sync_rename __itt_sync_renameA
# define __itt_sync_rename_ptr __itt_sync_renameA_ptr
#endif /* UNICODE */
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-void ITTAPI_CALL __itt_sync_rename(void *addr, const __itt_char* name);
+void ITTAPI __itt_sync_rename(void *addr, const char *name);
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @cond exclude_from_documentaion */
-int __itt_jit_notify_event(__itt_jit_jvm_event event_type, void* event_data);
-unsigned int __itt_jit_get_new_method_id(void);
-const char* ITTAPI_CALL __itt_api_version(void);
-__itt_error_notification_t* __itt_set_error_handler(__itt_error_notification_t*);
-
-#if ITT_OS == ITT_OS_WIN
-#define LIBITTNOTIFY_CC __cdecl
-#define LIBITTNOTIFY_EXPORT __declspec(dllexport)
-#define LIBITTNOTIFY_IMPORT __declspec(dllimport)
-#elif ITT_OS == ITT_OS_MAC || ITT_OS == ITT_OS_LINUX
-#define LIBITTNOTIFY_CC /* nothing */
-#define LIBITTNOTIFY_EXPORT /* nothing */
-#define LIBITTNOTIFY_IMPORT /* nothing */
-#else /* ITT_OS == ITT_OS_WIN */
-#error "Unsupported OS"
-#endif /* ITT_OS == ITT_OS_WIN */
-
-#define LIBITTNOTIFY_API
-/** @endcond */
-
-/** @deprecated Legacy API
- * @brief Hand instrumentation of user synchronization
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_notify_sync_prepare(void *p);
-/** @deprecated Legacy API
- * @brief Hand instrumentation of user synchronization
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_notify_sync_cancel(void *p);
-/** @deprecated Legacy API
- * @brief Hand instrumentation of user synchronization
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_notify_sync_acquired(void *p);
-/** @deprecated Legacy API
- * @brief Hand instrumentation of user synchronization
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_notify_sync_releasing(void *p);
-/** @deprecated Legacy API
- * @brief itt_notify_cpath_target is handled by Thread Profiler only.
- * Inform Thread Profiler that the current thread has recahed a critical path target.
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_notify_cpath_target(void);
-
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-LIBITTNOTIFY_API int LIBITTNOTIFY_CC __itt_thr_name_setA( char *name, int namelen );
-LIBITTNOTIFY_API int LIBITTNOTIFY_CC __itt_thr_name_setW( wchar_t *name, int namelen );
-# ifdef UNICODE
-# define __itt_thr_name_set __itt_thr_name_setW
-# define __itt_thr_name_set_ptr __itt_thr_name_setW_ptr
-# else
-# define __itt_thr_name_set __itt_thr_name_setA
-# define __itt_thr_name_set_ptr __itt_thr_name_setA_ptr
-# endif /* UNICODE */
+ITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char *name), (addr, name))
+ITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name), (addr, name))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_rename, (void *addr, const char *name), (addr, name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_renameA ITTNOTIFY_VOID(sync_renameA)
+#define __itt_sync_renameA_ptr ITTNOTIFY_NAME(sync_renameA)
+#define __itt_sync_renameW ITTNOTIFY_VOID(sync_renameW)
+#define __itt_sync_renameW_ptr ITTNOTIFY_NAME(sync_renameW)
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @deprecated Legacy API
- * @brief Set name to be associated with thread in analysis GUI.
- * Return __itt_err upon failure (name or namelen being null,name and namelen mismatched)
- */
-LIBITTNOTIFY_API int LIBITTNOTIFY_CC __itt_thr_name_set( __itt_char *name, int namelen );
+#define __itt_sync_rename ITTNOTIFY_VOID(sync_rename)
+#define __itt_sync_rename_ptr ITTNOTIFY_NAME(sync_rename)
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-/** @brief Mark current thread as ignored from this point on, for the duration of its existence. */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_thr_ignore(void);
-
-/* User event notification */
+#else /* INTEL_NO_ITTNOTIFY_API */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-/** @deprecated Legacy API
- * @brief User event notification.
- * Event create APIs return non-zero event identifier upon success and __itt_err otherwise
- * (name or namelen being null/name and namelen not matching, user event feature not enabled)
- */
-LIBITTNOTIFY_API __itt_event LIBITTNOTIFY_CC __itt_event_createA( char *name, int namelen );
-LIBITTNOTIFY_API __itt_event LIBITTNOTIFY_CC __itt_event_createW( wchar_t *name, int namelen );
-# ifdef UNICODE
-# define __itt_event_create __itt_event_createW
-# define __itt_event_create_ptr __itt_event_createW_ptr
-# else
-# define __itt_event_create __itt_event_createA
-# define __itt_event_create_ptr __itt_event_createA_ptr
-# endif /* UNICODE */
+#define __itt_sync_renameA(addr, name)
+#define __itt_sync_renameA_ptr 0
+#define __itt_sync_renameW(addr, name)
+#define __itt_sync_renameW_ptr 0
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-/** @deprecated Legacy API
- * @brief User event notification.
- * Event create APIs return non-zero event identifier upon success and __itt_err otherwise
- * (name or namelen being null/name and namelen not matching, user event feature not enabled)
- */
-LIBITTNOTIFY_API __itt_event LIBITTNOTIFY_CC __itt_event_create( __itt_char *name, int namelen );
+#define __itt_sync_rename(addr, name)
+#define __itt_sync_rename_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_renameA_ptr 0
+#define __itt_sync_renameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_rename_ptr 0
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-/** @deprecated Legacy API
- * @brief Record an event occurance.
- * These APIs return __itt_err upon failure (invalid event id/user event feature not enabled)
- */
-LIBITTNOTIFY_API int LIBITTNOTIFY_CC __itt_event_start( __itt_event event );
-/** @deprecated Legacy API
- * @brief Record an event occurance. event_end is optional if events do not have durations.
- * These APIs return __itt_err upon failure (invalid event id/user event feature not enabled)
+/**
+ * @brief Is called when sync object is destroyed (needed to track lifetime of objects)
*/
-LIBITTNOTIFY_API int LIBITTNOTIFY_CC __itt_event_end( __itt_event event ); /** optional */
+void ITTAPI __itt_sync_destroy(void *addr);
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_destroy, (void *addr), (addr))
+#define __itt_sync_destroy ITTNOTIFY_VOID(sync_destroy)
+#define __itt_sync_destroy_ptr ITTNOTIFY_NAME(sync_destroy)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_destroy(addr)
+#define __itt_sync_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-/** @deprecated Legacy API
- * @brief managing thread and object states
- */
-LIBITTNOTIFY_API __itt_state_t LIBITTNOTIFY_CC __itt_state_get(void);
-/** @deprecated Legacy API
- * @brief managing thread and object states
+/*****************************************************************//**
+ * @name group of functions is used for performance measurement tools
+ *********************************************************************/
+/** @{ */
+/**
+ * @brief Enter spin loop on user-defined sync object
*/
-LIBITTNOTIFY_API __itt_state_t LIBITTNOTIFY_CC __itt_state_set( __itt_state_t );
+void ITTAPI __itt_sync_prepare(void* addr);
-/** @deprecated Legacy API
- * @brief managing thread and object modes
- */
-LIBITTNOTIFY_API __itt_thr_state_t LIBITTNOTIFY_CC __itt_thr_mode_set( __itt_thr_prop_t, __itt_thr_state_t );
-/** @deprecated Legacy API
- * @brief managing thread and object modes
- */
-LIBITTNOTIFY_API __itt_obj_state_t LIBITTNOTIFY_CC __itt_obj_mode_set( __itt_obj_prop_t, __itt_obj_state_t );
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_prepare, (void *addr), (addr))
+#define __itt_sync_prepare ITTNOTIFY_VOID(sync_prepare)
+#define __itt_sync_prepare_ptr ITTNOTIFY_NAME(sync_prepare)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_prepare(addr)
+#define __itt_sync_prepare_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_prepare_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-/** @deprecated Non-supported Legacy API
- * @brief Inform the tool of memory accesses on reading
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_memory_read( void *address, size_t size );
-/** @deprecated Non-supported Legacy API
- * @brief Inform the tool of memory accesses on writing
+/**
+ * @brief Quit spin loop without acquiring spin object
*/
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_memory_write( void *address, size_t size );
-/** @deprecated Non-supported Legacy API
- * @brief Inform the tool of memory accesses on updating
- */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_memory_update( void *address, size_t size );
+void ITTAPI __itt_sync_cancel(void *addr);
/** @cond exclude_from_documentation */
-/* The following 3 are currently for INTERNAL use only */
-/** @internal */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_test_delay( int );
-/** @internal */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_test_seq_init( void *, int );
-/** @internal */
-LIBITTNOTIFY_API void LIBITTNOTIFY_CC __itt_test_seq_wait( void *, int );
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr), (addr))
+#define __itt_sync_cancel ITTNOTIFY_VOID(sync_cancel)
+#define __itt_sync_cancel_ptr ITTNOTIFY_NAME(sync_cancel)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_cancel(addr)
+#define __itt_sync_cancel_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_cancel_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
+/**
+ * @brief Successful spin loop completion (sync object acquired)
+ */
+void ITTAPI __itt_sync_acquired(void *addr);
-/* *********************************************************************************
- *********************************************************************************
- ********************************************************************************* */
/** @cond exclude_from_documentation */
-#define ITT_JOIN_AUX(p,n) p##n
-#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n)
-
-#ifndef INTEL_ITTNOTIFY_PREFIX
-#define INTEL_ITTNOTIFY_PREFIX __itt_
-#endif /* INTEL_ITTNOTIFY_PREFIX */
-#ifndef INTEL_ITTNOTIFY_POSTFIX
-# define INTEL_ITTNOTIFY_POSTFIX _ptr_
-#endif /* INTEL_ITTNOTIFY_POSTFIX */
-
-#ifndef _ITTNOTIFY_H_MACRO_BODY_
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr), (addr))
+#define __itt_sync_acquired ITTNOTIFY_VOID(sync_acquired)
+#define __itt_sync_acquired_ptr ITTNOTIFY_NAME(sync_acquired)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_acquired(addr)
+#define __itt_sync_acquired_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_acquired_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define ____ITTNOTIFY_NAME_(p,n) p##n
-#define ___ITTNOTIFY_NAME_(p,n) ____ITTNOTIFY_NAME_(p,n)
-#define __ITTNOTIFY_NAME_(n) ___ITTNOTIFY_NAME_(INTEL_ITTNOTIFY_PREFIX,n)
-#define _ITTNOTIFY_NAME_(n) __ITTNOTIFY_NAME_(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))
+/**
+ * @brief Start sync object releasing code. Is called before the lock release call.
+ */
+void ITTAPI __itt_sync_releasing(void* addr);
-#ifdef ITT_STUBV
-#undef ITT_STUBV
-#endif
-#define ITT_STUBV(type,name,args,params) \
- typedef type (ITTAPI_CALL* ITT_JOIN(_ITTNOTIFY_NAME_(name),_t)) args; \
- extern ITT_JOIN(_ITTNOTIFY_NAME_(name),_t) _ITTNOTIFY_NAME_(name);
-#undef ITT_STUB
-#define ITT_STUB ITT_STUBV
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_releasing, (void *addr), (addr))
+#define __itt_sync_releasing ITTNOTIFY_VOID(sync_releasing)
+#define __itt_sync_releasing_ptr ITTNOTIFY_NAME(sync_releasing)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_releasing(addr)
+#define __itt_sync_releasing_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_releasing_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} */
+
+/**************************************************************//**
+ * @name group of functions is used for correctness checking tools
+ ******************************************************************/
+/** @{ */
+/**
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ * there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ * in dynamic library.
+ * @see void __itt_sync_prepare(void* addr);
+ */
+void ITTAPI __itt_fsync_prepare(void* addr);
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_prepare, (void *addr), (addr))
+#define __itt_fsync_prepare ITTNOTIFY_VOID(fsync_prepare)
+#define __itt_fsync_prepare_ptr ITTNOTIFY_NAME(fsync_prepare)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_prepare(addr)
+#define __itt_fsync_prepare_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_prepare_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_error_handler ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, error_handler)
-void __itt_error_handler(__itt_jit_jvm_event event_type, void* event_data);
+/**
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ * there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ * in dynamic library.
+ * @see void __itt_sync_cancel(void *addr);
+ */
+void ITTAPI __itt_fsync_cancel(void *addr);
-extern const __itt_state_t _ITTNOTIFY_NAME_(state_err);
-extern const __itt_event _ITTNOTIFY_NAME_(event_err);
-extern const int _ITTNOTIFY_NAME_(err);
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr), (addr))
+#define __itt_fsync_cancel ITTNOTIFY_VOID(fsync_cancel)
+#define __itt_fsync_cancel_ptr ITTNOTIFY_NAME(fsync_cancel)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_cancel(addr)
+#define __itt_fsync_cancel_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_cancel_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_state_err _ITTNOTIFY_NAME_(state_err)
-#define __itt_event_err _ITTNOTIFY_NAME_(event_err)
-#define __itt_err _ITTNOTIFY_NAME_(err)
+/**
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ * there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ * in dynamic library.
+ * @see void __itt_sync_acquired(void *addr);
+ */
+void ITTAPI __itt_fsync_acquired(void *addr);
-ITT_STUBV(void, pause,(void),())
-ITT_STUBV(void, resume,(void),())
-
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-
-ITT_STUB(__itt_mark_type, mark_createA,(const char *name),(name))
-
-ITT_STUB(__itt_mark_type, mark_createW,(const wchar_t *name),(name))
-
-ITT_STUB(int, markA,(__itt_mark_type mt, const char *parameter),(mt,parameter))
-
-ITT_STUB(int, markW,(__itt_mark_type mt, const wchar_t *parameter),(mt,parameter))
-
-ITT_STUB(int, mark_globalA,(__itt_mark_type mt, const char *parameter),(mt,parameter))
-
-ITT_STUB(int, mark_globalW,(__itt_mark_type mt, const wchar_t *parameter),(mt,parameter))
-
-ITT_STUBV(void, thread_set_nameA,( const char *name),(name))
-
-ITT_STUBV(void, thread_set_nameW,( const wchar_t *name),(name))
-
-ITT_STUBV(void, sync_createA,(void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute))
-
-ITT_STUBV(void, sync_createW,(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (addr, objtype, objname, attribute))
-
-ITT_STUBV(void, sync_renameA, (void *addr, const char *name), (addr, name))
-
-ITT_STUBV(void, sync_renameW, (void *addr, const wchar_t *name), (addr, name))
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-ITT_STUB(__itt_mark_type, mark_create,(const char *name),(name))
-
-ITT_STUB(int, mark,(__itt_mark_type mt, const char *parameter),(mt,parameter))
-
-ITT_STUB(int, mark_global,(__itt_mark_type mt, const char *parameter),(mt,parameter))
-
-ITT_STUBV(void, sync_set_name,(void *addr, const char *objtype, const char *objname, int attribute),(addr,objtype,objname,attribute))
-
-ITT_STUBV(void, thread_set_name,( const char *name),(name))
-
-ITT_STUBV(void, sync_create,(void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr), (addr))
+#define __itt_fsync_acquired ITTNOTIFY_VOID(fsync_acquired)
+#define __itt_fsync_acquired_ptr ITTNOTIFY_NAME(fsync_acquired)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_acquired(addr)
+#define __itt_fsync_acquired_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_acquired_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, sync_rename, (void *addr, const char *name), (addr, name))
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/**
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ * there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ * in dynamic library.
+ * @see void __itt_sync_releasing(void* addr);
+ */
+void ITTAPI __itt_fsync_releasing(void* addr);
-ITT_STUB(int, mark_off,(__itt_mark_type mt),(mt))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_releasing, (void *addr), (addr))
+#define __itt_fsync_releasing ITTNOTIFY_VOID(fsync_releasing)
+#define __itt_fsync_releasing_ptr ITTNOTIFY_NAME(fsync_releasing)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_releasing(addr)
+#define __itt_fsync_releasing_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_releasing_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} */
+/** @} sync group */
+
+/**
+ * @defgroup model Modeling by Advisor
+ * @ingroup public
+ * This is the subset of itt used for modeling by Advisor.
+ * This API is called ONLY using annotate.h, by "Annotation" macros
+ * the user places in their sources during the parallelism modeling steps.
+ *
+ * The requirements, constraints, design and implementation
+ * for this interface are covered in:
+ * Shared%20Documents/Design%20Documents/AdvisorAnnotations.doc
+ *
+ * site_begin/end and task_begin/end take the address of handle variables,
+ * which are writeable by the API. Handles must be 0 initialized prior
+ * to the first call to begin, or may cause a run-time failure.
+ * The handles are initialized in a multi-thread safe way by the API if
+ * the handle is 0. The commonly expected idiom is one static handle to
+ * identify a site or task. If a site or task of the same name has already
+ * been started during this collection, the same handle MAY be returned,
+ * but is not required to be - it is unspecified if data merging is done
+ * based on name. These routines also take an instance variable. Like
+ * the lexical instance, these must be 0 initialized. Unlike the lexical
+ * instance, this is used to track a single dynamic instance.
+ *
+ * API used by the Intel Parallel Advisor to describe potential concurrency
+ * and related activities. User-added source annotations expand to calls
+ * to these procedures to enable modeling of a hypothetical concurrent
+ * execution serially.
+ * @{
+ */
+typedef void* __itt_model_site; /*!< @brief handle for lexical site */
+typedef void* __itt_model_site_instance; /*!< @brief handle for dynamic instance */
+typedef void* __itt_model_task; /*!< @brief handle for lexical site */
+typedef void* __itt_model_task_instance; /*!< @brief handle for dynamic instance */
+
+/**
+ * @enum __itt_model_disable
+ * @brief Enumerator for the disable methods
+ */
+typedef enum {
+ __itt_model_disable_observation,
+ __itt_model_disable_collection
+} __itt_model_disable;
+
+/**
+ * @brief ANNOTATE_SITE_BEGIN/ANNOTATE_SITE_END support.
+ *
+ * site_begin/end model a potential concurrency site.
+ * site instances may be recursively nested with themselves.
+ * site_end exits the most recently started but unended site for the current
+ * thread. The handle passed to end may be used to validate structure.
+ * Instances of a site encountered on different threads concurrently
+ * are considered completely distinct. If the site name for two different
+ * lexical sites match, it is unspecified whether they are treated as the
+ * same or different for data presentation.
+ */
+void ITTAPI __itt_model_site_begin(__itt_model_site *site, __itt_model_site_instance *instance, const char *name);
+void ITTAPI __itt_model_site_end (__itt_model_site *site, __itt_model_site_instance *instance);
-ITT_STUB(int, mark_global_off,(__itt_mark_type mt),(mt))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_site_begin, (__itt_model_site *site, __itt_model_site_instance *instance, const char *name), (site, instance, name))
+ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_site_instance *instance), (site, instance))
+#define __itt_model_site_begin ITTNOTIFY_VOID(model_site_begin)
+#define __itt_model_site_begin_ptr ITTNOTIFY_NAME(model_site_begin)
+#define __itt_model_site_end ITTNOTIFY_VOID(model_site_end)
+#define __itt_model_site_end_ptr ITTNOTIFY_NAME(model_site_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_site_begin(site, instance, name)
+#define __itt_model_site_begin_ptr 0
+#define __itt_model_site_end(site, instance)
+#define __itt_model_site_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_site_begin_ptr 0
+#define __itt_model_site_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, thread_ignore,(void),())
+/**
+ * @brief ANNOTATE_TASK_BEGIN/ANNOTATE_TASK_END support
+ *
+ * task_begin/end model a potential task, which is contained within the most
+ * closely enclosing dynamic site. task_end exits the most recently started
+ * but unended task. The handle passed to end may be used to validate
+ * structure. It is unspecified if bad dynamic nesting is detected. If it
+ * is, it should be encoded in the resulting data collection. The collector
+ * should not fail due to construct nesting issues, nor attempt to directly
+ * indicate the problem.
+ */
+void ITTAPI __itt_model_task_begin(__itt_model_task *task, __itt_model_task_instance *instance, const char *name);
+void ITTAPI __itt_model_task_end (__itt_model_task *task, __itt_model_task_instance *instance);
-ITT_STUBV(void, sync_prepare,(void* addr),(addr))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_task_begin, (__itt_model_task *task, __itt_model_task_instance *instance, const char *name), (task, instance, name))
+ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_task_instance *instance), (task, instance))
+#define __itt_model_task_begin ITTNOTIFY_VOID(model_task_begin)
+#define __itt_model_task_begin_ptr ITTNOTIFY_NAME(model_task_begin)
+#define __itt_model_task_end ITTNOTIFY_VOID(model_task_end)
+#define __itt_model_task_end_ptr ITTNOTIFY_NAME(model_task_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_task_begin(task, instance, name)
+#define __itt_model_task_begin_ptr 0
+#define __itt_model_task_end(task, instance)
+#define __itt_model_task_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_task_begin_ptr 0
+#define __itt_model_task_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, sync_cancel,(void *addr),(addr))
+/**
+ * @brief ANNOTATE_LOCK_ACQUIRE/ANNOTATE_LOCK_RELEASE support
+ *
+ * lock_acquire/release model a potential lock for both lockset and
+ * performance modeling. Each unique address is modeled as a separate
+ * lock, with invalid addresses being valid lock IDs. Specifically:
+ * no storage is accessed by the API at the specified address - it is only
+ * used for lock identification. Lock acquires may be self-nested and are
+ * unlocked by a corresponding number of releases.
+ * (These closely correspond to __itt_sync_acquired/__itt_sync_releasing,
+ * but may not have identical semantics.)
+ */
+void ITTAPI __itt_model_lock_acquire(void *lock);
+void ITTAPI __itt_model_lock_release(void *lock);
-ITT_STUBV(void, sync_acquired,(void *addr),(addr))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock), (lock))
+ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock), (lock))
+#define __itt_model_lock_acquire ITTNOTIFY_VOID(model_lock_acquire)
+#define __itt_model_lock_acquire_ptr ITTNOTIFY_NAME(model_lock_acquire)
+#define __itt_model_lock_release ITTNOTIFY_VOID(model_lock_release)
+#define __itt_model_lock_release_ptr ITTNOTIFY_NAME(model_lock_release)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_lock_acquire(lock)
+#define __itt_model_lock_acquire_ptr 0
+#define __itt_model_lock_release(lock)
+#define __itt_model_lock_release_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_lock_acquire_ptr 0
+#define __itt_model_lock_release_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, sync_releasing,(void* addr),(addr))
+/**
+ * @brief ANNOTATE_RECORD_ALLOCATION/ANNOTATE_RECORD_DEALLOCATION support
+ *
+ * record_allocation/deallocation describe user-defined memory allocator
+ * behavior, which may be required for correctness modeling to understand
+ * when storage is not expected to be actually reused across threads.
+ */
+void ITTAPI __itt_model_record_allocation (void *addr, size_t size);
+void ITTAPI __itt_model_record_deallocation(void *addr);
-ITT_STUBV(void, sync_released,(void* addr),(addr))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_record_allocation, (void *addr, size_t size), (addr, size))
+ITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr), (addr))
+#define __itt_model_record_allocation ITTNOTIFY_VOID(model_record_allocation)
+#define __itt_model_record_allocation_ptr ITTNOTIFY_NAME(model_record_allocation)
+#define __itt_model_record_deallocation ITTNOTIFY_VOID(model_record_deallocation)
+#define __itt_model_record_deallocation_ptr ITTNOTIFY_NAME(model_record_deallocation)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_record_allocation(addr, size)
+#define __itt_model_record_allocation_ptr 0
+#define __itt_model_record_deallocation(addr)
+#define __itt_model_record_deallocation_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_record_allocation_ptr 0
+#define __itt_model_record_deallocation_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, fsync_prepare,(void* addr),(addr))
+/**
+ * @brief ANNOTATE_INDUCTION_USES support
+ *
+ * Note particular storage is inductive through the end of the current site
+ */
+void ITTAPI __itt_model_induction_uses(void* addr, size_t size);
-ITT_STUBV(void, fsync_cancel,(void *addr),(addr))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_induction_uses, (void *addr, size_t size), (addr, size))
+#define __itt_model_induction_uses ITTNOTIFY_VOID(model_induction_uses)
+#define __itt_model_induction_uses_ptr ITTNOTIFY_NAME(model_induction_uses)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_induction_uses(addr, size)
+#define __itt_model_induction_uses_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_induction_uses_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, fsync_acquired,(void *addr),(addr))
+/**
+ * @brief ANNOTATE_REDUCTION_USES support
+ *
+ * Note particular storage is used for reduction through the end
+ * of the current site
+ */
+void ITTAPI __itt_model_reduction_uses(void* addr, size_t size);
-ITT_STUBV(void, fsync_releasing,(void* addr),(addr))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_reduction_uses, (void *addr, size_t size), (addr, size))
+#define __itt_model_reduction_uses ITTNOTIFY_VOID(model_reduction_uses)
+#define __itt_model_reduction_uses_ptr ITTNOTIFY_NAME(model_reduction_uses)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_reduction_uses(addr, size)
+#define __itt_model_reduction_uses_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_reduction_uses_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, fsync_released,(void* addr),(addr))
+/**
+ * @brief ANNOTATE_OBSERVE_USES support
+ *
+ * Have correctness modeling record observations about uses of storage
+ * through the end of the current site
+ */
+void ITTAPI __itt_model_observe_uses(void* addr, size_t size);
-ITT_STUBV(void, sync_destroy,(void *addr), (addr))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_observe_uses, (void *addr, size_t size), (addr, size))
+#define __itt_model_observe_uses ITTNOTIFY_VOID(model_observe_uses)
+#define __itt_model_observe_uses_ptr ITTNOTIFY_NAME(model_observe_uses)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_observe_uses(addr, size)
+#define __itt_model_observe_uses_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_observe_uses_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, notify_sync_prepare,(void *p),(p))
+/**
+ * @brief ANNOTATE_CLEAR_USES support
+ *
+ * Clear the special handling of a piece of storage related to induction,
+ * reduction or observe_uses
+ */
+void ITTAPI __itt_model_clear_uses(void* addr);
-ITT_STUBV(void, notify_sync_cancel,(void *p),(p))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_clear_uses, (void *addr), (addr))
+#define __itt_model_clear_uses ITTNOTIFY_VOID(model_clear_uses)
+#define __itt_model_clear_uses_ptr ITTNOTIFY_NAME(model_clear_uses)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_clear_uses(addr)
+#define __itt_model_clear_uses_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_clear_uses_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-ITT_STUBV(void, notify_sync_acquired,(void *p),(p))
+/**
+ * @brief ANNOTATE_DISABLE_*_PUSH/ANNOTATE_DISABLE_*_POP support
+ *
+ * disable_push/disable_pop push and pop disabling based on a parameter.
+ * Disabling observations stops processing of memory references during
+ * correctness modeling, and all annotations that occur in the disabled
+ * region. This allows description of code that is expected to be handled
+ * specially during conversion to parallelism or that is not recognized
+ * by tools (e.g. some kinds of synchronization operations.)
+ * This mechanism causes all annotations in the disabled region, other
+ * than disable_push and disable_pop, to be ignored. (For example, this
+ * might validly be used to disable an entire parallel site and the contained
+ * tasks and locking in it for data collection purposes.)
+ * The disable for collection is a more expensive operation, but reduces
+ * collector overhead significantly. This applies to BOTH correctness data
+ * collection and performance data collection. For example, a site
+ * containing a task might only enable data collection for the first 10
+ * iterations. Both performance and correctness data should reflect this,
+ * and the program should run as close to full speed as possible when
+ * collection is disabled.
+ */
+void ITTAPI __itt_model_disable_push(__itt_model_disable x);
+void ITTAPI __itt_model_disable_pop(void);
-ITT_STUBV(void, notify_sync_releasing,(void *p),(p))
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (x))
+ITT_STUBV(ITTAPI, void, model_disable_pop, (void), ())
+#define __itt_model_disable_push ITTNOTIFY_VOID(model_disable_push)
+#define __itt_model_disable_push_ptr ITTNOTIFY_NAME(model_disable_push)
+#define __itt_model_disable_pop ITTNOTIFY_VOID(model_disable_pop)
+#define __itt_model_disable_pop_ptr ITTNOTIFY_NAME(model_disable_pop)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_disable_push(x)
+#define __itt_model_disable_push_ptr 0
+#define __itt_model_disable_pop()
+#define __itt_model_disable_pop_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_model_disable_push_ptr 0
+#define __itt_model_disable_pop_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} model group */
-ITT_STUBV(void, notify_cpath_target,(),())
+/**
+ * @defgroup frames Frames
+ * @ingroup public
+ * Frames group
+ * @{
+ */
+/**
+ * @brief opaque structure for frame identification
+ */
+typedef struct __itt_frame_t *__itt_frame;
+/**
+ * @brief Create a global frame with given domain
+ */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-ITT_STUBV(void, sync_set_nameA,(void *addr, const char *objtype, const char *objname, int attribute),(addr,objtype,objname,attribute))
-
-ITT_STUBV(void, sync_set_nameW,(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute),(addr,objtype,objname,attribute))
-
-ITT_STUB (int, thr_name_setA,( char *name, int namelen ),(name,namelen))
-
-ITT_STUB (int, thr_name_setW,( wchar_t *name, int namelen ),(name,namelen))
-
-ITT_STUB (__itt_event, event_createA,( char *name, int namelen ),(name,namelen))
-
-ITT_STUB (__itt_event, event_createW,( wchar_t *name, int namelen ),(name,namelen))
+__itt_frame ITTAPI __itt_frame_createA(const char *domain);
+__itt_frame ITTAPI __itt_frame_createW(const wchar_t *domain);
+#ifdef UNICODE
+# define __itt_frame_create __itt_frame_createW
+# define __itt_frame_create_ptr __itt_frame_createW_ptr
+#else /* UNICODE */
+# define __itt_frame_create __itt_frame_createA
+# define __itt_frame_create_ptr __itt_frame_createA_ptr
+#endif /* UNICODE */
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-ITT_STUB (int, thr_name_set,( char *name, int namelen ),(name,namelen))
-
-ITT_STUB (__itt_event, event_create,( char *name, int namelen ),(name,namelen))
+__itt_frame ITTAPI __itt_frame_create(const char *domain);
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-ITT_STUBV(void, thr_ignore,(void),())
-
-ITT_STUB (int, event_start,( __itt_event event ),(event))
-
-ITT_STUB (int, event_end,( __itt_event event ),(event))
-
-ITT_STUB (__itt_state_t, state_get, (), ())
-ITT_STUB (__itt_state_t, state_set,( __itt_state_t state), (state))
-ITT_STUB (__itt_obj_state_t, obj_mode_set, ( __itt_obj_prop_t prop, __itt_obj_state_t state), (prop, state))
-ITT_STUB (__itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t prop, __itt_thr_state_t state), (prop, state))
-
-ITT_STUB(const char*, api_version,(void),())
-
-ITT_STUB(int, jit_notify_event, (__itt_jit_jvm_event event_type, void* event_data), (event_type, event_data))
-ITT_STUB(unsigned int, jit_get_new_method_id, (void), ())
-
-ITT_STUBV(void, memory_read,( void *address, size_t size ), (address, size))
-ITT_STUBV(void, memory_write,( void *address, size_t size ), (address, size))
-ITT_STUBV(void, memory_update,( void *address, size_t size ), (address, size))
-
-ITT_STUBV(void, test_delay, (int p1), (p1))
-ITT_STUBV(void, test_seq_init, ( void* p1, int p2), (p1, p2))
-ITT_STUBV(void, test_seq_wait, ( void* p1, int p2), (p1, p2))
-#ifdef __cplusplus
-} /* extern "C" */
-#endif /* __cplusplus */
-
-
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
#ifndef INTEL_NO_ITTNOTIFY_API
-
-#define __ITTNOTIFY_VOID_CALL__(n) (!_ITTNOTIFY_NAME_(n)) ? (void)0 : _ITTNOTIFY_NAME_(n)
-#define __ITTNOTIFY_DATA_CALL__(n) (!_ITTNOTIFY_NAME_(n)) ? 0 : _ITTNOTIFY_NAME_(n)
-
-#define __itt_pause __ITTNOTIFY_VOID_CALL__(pause)
-#define __itt_pause_ptr _ITTNOTIFY_NAME_(pause)
-
-#define __itt_resume __ITTNOTIFY_VOID_CALL__(resume)
-#define __itt_resume_ptr _ITTNOTIFY_NAME_(resume)
-
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-
-#define __itt_mark_createA __ITTNOTIFY_DATA_CALL__(mark_createA)
-#define __itt_mark_createA_ptr _ITTNOTIFY_NAME_(mark_createA)
-
-#define __itt_mark_createW __ITTNOTIFY_DATA_CALL__(mark_createW)
-#define __itt_mark_createW_ptr _ITTNOTIFY_NAME_(mark_createW)
-
-#define __itt_markA __ITTNOTIFY_DATA_CALL__(markA)
-#define __itt_markA_ptr _ITTNOTIFY_NAME_(markA)
-
-#define __itt_markW __ITTNOTIFY_DATA_CALL__(markW)
-#define __itt_markW_ptr _ITTNOTIFY_NAME_(markW)
-
-#define __itt_mark_globalA __ITTNOTIFY_DATA_CALL__(mark_globalA)
-#define __itt_mark_globalA_ptr _ITTNOTIFY_NAME_(mark_globalA)
-
-#define __itt_mark_globalW __ITTNOTIFY_DATA_CALL__(mark_globalW)
-#define __itt_mark_globalW_ptr _ITTNOTIFY_NAME_(mark_globalW)
-
-#define __itt_thread_set_nameA __ITTNOTIFY_VOID_CALL__(thread_set_nameA)
-#define __itt_thread_set_nameA_ptr _ITTNOTIFY_NAME_(thread_set_nameA)
-
-#define __itt_thread_set_nameW __ITTNOTIFY_VOID_CALL__(thread_set_nameW)
-#define __itt_thread_set_nameW_ptr _ITTNOTIFY_NAME_(thread_set_nameW)
-
-#define __itt_sync_createA __ITTNOTIFY_VOID_CALL__(sync_createA)
-#define __itt_sync_createA_ptr _ITTNOTIFY_NAME_(sync_createA)
-
-#define __itt_sync_createW __ITTNOTIFY_VOID_CALL__(sync_createW)
-#define __itt_sync_createW_ptr _ITTNOTIFY_NAME_(sync_createW)
-
-#define __itt_sync_renameA __ITTNOTIFY_VOID_CALL__(sync_renameA)
-#define __itt_sync_renameA_ptr _ITTNOTIFY_NAME_(sync_renameA)
-
-#define __itt_sync_renameW __ITTNOTIFY_VOID_CALL__(sync_renameW)
-#define __itt_sync_renameW_ptr _ITTNOTIFY_NAME_(sync_renameW)
+ITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char *domain), (domain))
+ITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain), (domain))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_frame, frame_create, (const char *domain), (domain))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_frame_createA ITTNOTIFY_DATA(frame_createA)
+#define __itt_frame_createA_ptr ITTNOTIFY_NAME(frame_createA)
+#define __itt_frame_createW ITTNOTIFY_DATA(frame_createW)
+#define __itt_frame_createW_ptr ITTNOTIFY_NAME(frame_createW)
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-#define __itt_mark_create __ITTNOTIFY_DATA_CALL__(mark_create)
-#define __itt_mark_create_ptr _ITTNOTIFY_NAME_(mark_create)
-
-#define __itt_mark __ITTNOTIFY_DATA_CALL__(mark)
-#define __itt_mark_ptr _ITTNOTIFY_NAME_(mark)
-
-#define __itt_mark_global __ITTNOTIFY_DATA_CALL__(mark_global)
-#define __itt_mark_global_ptr _ITTNOTIFY_NAME_(mark_global)
-
-#define __itt_sync_set_name __ITTNOTIFY_VOID_CALL__(sync_set_name)
-#define __itt_sync_set_name_ptr _ITTNOTIFY_NAME_(sync_set_name)
-
-#define __itt_thread_set_name __ITTNOTIFY_VOID_CALL__(thread_set_name)
-#define __itt_thread_set_name_ptr _ITTNOTIFY_NAME_(thread_set_name)
-
-#define __itt_sync_create __ITTNOTIFY_VOID_CALL__(sync_create)
-#define __itt_sync_create_ptr _ITTNOTIFY_NAME_(sync_create)
-
-#define __itt_sync_rename __ITTNOTIFY_VOID_CALL__(sync_rename)
-#define __itt_sync_rename_ptr _ITTNOTIFY_NAME_(sync_rename)
+#define __itt_frame_create ITTNOTIFY_DATA(frame_create)
+#define __itt_frame_create_ptr ITTNOTIFY_NAME(frame_create)
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-#define __itt_mark_off __ITTNOTIFY_DATA_CALL__(mark_off)
-#define __itt_mark_off_ptr _ITTNOTIFY_NAME_(mark_off)
-
-#define __itt_thread_ignore __ITTNOTIFY_VOID_CALL__(thread_ignore)
-#define __itt_thread_ignore_ptr _ITTNOTIFY_NAME_(thread_ignore)
-
-#define __itt_sync_prepare __ITTNOTIFY_VOID_CALL__(sync_prepare)
-#define __itt_sync_prepare_ptr _ITTNOTIFY_NAME_(sync_prepare)
-
-#define __itt_sync_cancel __ITTNOTIFY_VOID_CALL__(sync_cancel)
-#define __itt_sync_cancel_ptr _ITTNOTIFY_NAME_(sync_cancel)
-
-#define __itt_sync_acquired __ITTNOTIFY_VOID_CALL__(sync_acquired)
-#define __itt_sync_acquired_ptr _ITTNOTIFY_NAME_(sync_acquired)
-
-#define __itt_sync_releasing __ITTNOTIFY_VOID_CALL__(sync_releasing)
-#define __itt_sync_releasing_ptr _ITTNOTIFY_NAME_(sync_releasing)
-
-#define __itt_sync_released __ITTNOTIFY_VOID_CALL__(sync_released)
-#define __itt_sync_released_ptr _ITTNOTIFY_NAME_(sync_released)
-
-#define __itt_fsync_prepare __ITTNOTIFY_VOID_CALL__(fsync_prepare)
-#define __itt_fsync_prepare_ptr _ITTNOTIFY_NAME_(fsync_prepare)
-
-#define __itt_fsync_cancel __ITTNOTIFY_VOID_CALL__(fsync_cancel)
-#define __itt_fsync_cancel_ptr _ITTNOTIFY_NAME_(fsync_cancel)
-
-#define __itt_fsync_acquired __ITTNOTIFY_VOID_CALL__(fsync_acquired)
-#define __itt_fsync_acquired_ptr _ITTNOTIFY_NAME_(fsync_acquired)
-
-#define __itt_fsync_releasing __ITTNOTIFY_VOID_CALL__(fsync_releasing)
-#define __itt_fsync_releasing_ptr _ITTNOTIFY_NAME_(fsync_releasing)
-
-#define __itt_fsync_released __ITTNOTIFY_VOID_CALL__(fsync_released)
-#define __itt_fsync_released_ptr _ITTNOTIFY_NAME_(fsync_released)
-
-#define __itt_sync_destroy __ITTNOTIFY_VOID_CALL__(sync_destroy)
-#define __itt_sync_destroy_ptr _ITTNOTIFY_NAME_(sync_destroy)
-
-#define __itt_notify_sync_prepare __ITTNOTIFY_VOID_CALL__(notify_sync_prepare)
-#define __itt_notify_sync_prepare_ptr _ITTNOTIFY_NAME_(notify_sync_prepare)
-
-#define __itt_notify_sync_cancel __ITTNOTIFY_VOID_CALL__(notify_sync_cancel)
-#define __itt_notify_sync_cancel_ptr _ITTNOTIFY_NAME_(notify_sync_cancel)
-
-#define __itt_notify_sync_acquired __ITTNOTIFY_VOID_CALL__(notify_sync_acquired)
-#define __itt_notify_sync_acquired_ptr _ITTNOTIFY_NAME_(notify_sync_acquired)
-
-#define __itt_notify_sync_releasing __ITTNOTIFY_VOID_CALL__(notify_sync_releasing)
-#define __itt_notify_sync_releasing_ptr _ITTNOTIFY_NAME_(notify_sync_releasing)
-
-#define __itt_notify_cpath_target __ITTNOTIFY_VOID_CALL__(notify_cpath_target)
-#define __itt_notify_cpath_target_ptr _ITTNOTIFY_NAME_(notify_cpath_target)
-
+#else /* INTEL_NO_ITTNOTIFY_API */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-#define __itt_sync_set_nameA __ITTNOTIFY_VOID_CALL__(sync_set_nameA)
-#define __itt_sync_set_nameA_ptr _ITTNOTIFY_NAME_(sync_set_nameA)
-
-#define __itt_sync_set_nameW __ITTNOTIFY_VOID_CALL__(sync_set_nameW)
-#define __itt_sync_set_nameW_ptr _ITTNOTIFY_NAME_(sync_set_nameW)
-
-#define __itt_thr_name_setA __ITTNOTIFY_DATA_CALL__(thr_name_setA)
-#define __itt_thr_name_setA_ptr _ITTNOTIFY_NAME_(thr_name_setA)
-
-#define __itt_thr_name_setW __ITTNOTIFY_DATA_CALL__(thr_name_setW)
-#define __itt_thr_name_setW_ptr _ITTNOTIFY_NAME_(thr_name_setW)
-
-#define __itt_event_createA __ITTNOTIFY_DATA_CALL__(event_createA)
-#define __itt_event_createA_ptr _ITTNOTIFY_NAME_(event_createA)
-
-#define __itt_event_createW __ITTNOTIFY_DATA_CALL__(event_createW)
-#define __itt_event_createW_ptr _ITTNOTIFY_NAME_(event_createW)
+#define __itt_frame_createA(domain)
+#define __itt_frame_createA_ptr 0
+#define __itt_frame_createW(domain)
+#define __itt_frame_createW_ptr 0
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-#define __itt_thr_name_set __ITTNOTIFY_DATA_CALL__(thr_name_set)
-#define __itt_thr_name_set_ptr _ITTNOTIFY_NAME_(thr_name_set)
-
-#define __itt_event_create __ITTNOTIFY_DATA_CALL__(event_create)
-#define __itt_event_create_ptr _ITTNOTIFY_NAME_(event_create)
+#define __itt_frame_create(domain)
+#define __itt_frame_create_ptr 0
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-#define __itt_thr_ignore __ITTNOTIFY_VOID_CALL__(thr_ignore)
-#define __itt_thr_ignore_ptr _ITTNOTIFY_NAME_(thr_ignore)
-
-#define __itt_event_start __ITTNOTIFY_DATA_CALL__(event_start)
-#define __itt_event_start_ptr _ITTNOTIFY_NAME_(event_start)
-
-#define __itt_event_end __ITTNOTIFY_DATA_CALL__(event_end)
-#define __itt_event_end_ptr _ITTNOTIFY_NAME_(event_end)
-
-#define __itt_state_get __ITTNOTIFY_DATA_CALL__(state_get)
-#define __itt_state_get_ptr _ITTNOTIFY_NAME_(state_get)
-
-#define __itt_state_set __ITTNOTIFY_DATA_CALL__(state_set)
-#define __itt_state_set_ptr _ITTNOTIFY_NAME_(state_set)
-
-#define __itt_obj_mode_set __ITTNOTIFY_DATA_CALL__(obj_mode_set)
-#define __itt_obj_mode_set_ptr _ITTNOTIFY_NAME_(obj_mode_set)
-
-#define __itt_thr_mode_set __ITTNOTIFY_DATA_CALL__(thr_mode_set)
-#define __itt_thr_mode_set_ptr _ITTNOTIFY_NAME_(thr_mode_set)
-
-#define __itt_api_version __ITTNOTIFY_DATA_CALL__(api_version)
-#define __itt_api_version_ptr _ITTNOTIFY_NAME_(api_version)
-
-#define __itt_jit_notify_event __ITTNOTIFY_DATA_CALL__(jit_notify_event)
-#define __itt_jit_notify_event_ptr _ITTNOTIFY_NAME_(jit_notify_event)
-
-#define __itt_jit_get_new_method_id __ITTNOTIFY_DATA_CALL__(jit_get_new_method_id)
-#define __itt_jit_get_new_method_id_ptr _ITTNOTIFY_NAME_(jit_get_new_method_id)
-
-#define __itt_memory_read __ITTNOTIFY_VOID_CALL__(memory_read)
-#define __itt_memory_read_ptr _ITTNOTIFY_NAME_(memory_read)
-
-#define __itt_memory_write __ITTNOTIFY_VOID_CALL__(memory_write)
-#define __itt_memory_write_ptr _ITTNOTIFY_NAME_(memory_write)
-
-#define __itt_memory_update __ITTNOTIFY_VOID_CALL__(memory_update)
-#define __itt_memory_update_ptr _ITTNOTIFY_NAME_(memory_update)
-
-
-#define __itt_test_delay __ITTNOTIFY_VOID_CALL__(test_delay)
-#define __itt_test_delay_ptr _ITTNOTIFY_NAME_(test_delay)
-
-#define __itt_test_seq_init __ITTNOTIFY_VOID_CALL__(test_seq_init)
-#define __itt_test_seq_init_ptr _ITTNOTIFY_NAME_(test_seq_init)
-
-#define __itt_test_seq_wait __ITTNOTIFY_VOID_CALL__(test_seq_wait)
-#define __itt_test_seq_wait_ptr _ITTNOTIFY_NAME_(test_seq_wait)
-
-#define __itt_set_error_handler ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, set_error_handler)
-
-#else /* INTEL_NO_ITTNOTIFY_API */
-
-#define __itt_pause()
-#define __itt_pause_ptr 0
-
-#define __itt_resume()
-#define __itt_resume_ptr 0
-
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-
-#define __itt_mark_createA(name) (__itt_mark_type)0
-#define __itt_mark_createA_ptr 0
-
-#define __itt_mark_createW(name) (__itt_mark_type)0
-#define __itt_mark_createW_ptr 0
-
-#define __itt_markA(mt,parameter) (int)0
-#define __itt_markA_ptr 0
-
-#define __itt_markW(mt,parameter) (int)0
-#define __itt_markW_ptr 0
-
-#define __itt_mark_globalA(mt,parameter) (int)0
-#define __itt_mark_globalA_ptr 0
-
-#define __itt_mark_globalW(mt,parameter) (int)0
-#define __itt_mark_globalW_ptr 0
-
-#define __itt_thread_set_nameA(name)
-#define __itt_thread_set_nameA_ptr 0
-
-#define __itt_thread_set_nameW(name)
-#define __itt_thread_set_nameW_ptr 0
-
-#define __itt_sync_createA(addr, objtype, objname, attribute)
-#define __itt_sync_createA_ptr 0
-
-#define __itt_sync_createW(addr, objtype, objname, attribute)
-#define __itt_sync_createW_ptr 0
-
-#define __itt_sync_renameA(addr, name)
-#define __itt_sync_renameA_ptr 0
-
-#define __itt_sync_renameW(addr, name)
-#define __itt_sync_renameW_ptr 0
+#define __itt_frame_createA_ptr 0
+#define __itt_frame_createW_ptr 0
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-#define __itt_mark_create(name) (__itt_mark_type)0
-#define __itt_mark_create_ptr 0
-
-#define __itt_mark(mt,parameter) (int)0
-#define __itt_mark_ptr 0
-
-#define __itt_mark_global(mt,parameter) (int)0
-#define __itt_mark_global_ptr 0
-
-#define __itt_sync_set_name(addr,objtype,objname,attribute)
-#define __itt_sync_set_name_ptr 0
-
-#define __itt_thread_set_name(name)
-#define __itt_thread_set_name_ptr 0
-
-#define __itt_sync_create(addr, objtype, objname, attribute)
-#define __itt_sync_create_ptr 0
-
-#define __itt_sync_rename(addr, name)
-#define __itt_sync_rename_ptr 0
+#define __itt_frame_create_ptr 0
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_mark_off(mt) (int)0
-#define __itt_mark_off_ptr 0
-
-#define __itt_thread_ignore()
-#define __itt_thread_ignore_ptr 0
-
-#define __itt_sync_prepare(addr)
-#define __itt_sync_prepare_ptr 0
-
-#define __itt_sync_cancel(addr)
-#define __itt_sync_cancel_ptr 0
-
-#define __itt_sync_acquired(addr)
-#define __itt_sync_acquired_ptr 0
-
-#define __itt_sync_releasing(addr)
-#define __itt_sync_releasing_ptr 0
-
-#define __itt_sync_released(addr)
-#define __itt_sync_released_ptr 0
-
-#define __itt_fsync_prepare(addr)
-#define __itt_fsync_prepare_ptr 0
-
-#define __itt_fsync_cancel(addr)
-#define __itt_fsync_cancel_ptr 0
-
-#define __itt_fsync_acquired(addr)
-#define __itt_fsync_acquired_ptr 0
-
-#define __itt_fsync_releasing(addr)
-#define __itt_fsync_releasing_ptr 0
-
-#define __itt_fsync_released(addr)
-#define __itt_fsync_released_ptr 0
-
-#define __itt_sync_destroy(addr)
-#define __itt_sync_destroy_ptr 0
-
-#define __itt_notify_sync_prepare(p)
-#define __itt_notify_sync_prepare_ptr 0
-
-#define __itt_notify_sync_cancel(p)
-#define __itt_notify_sync_cancel_ptr 0
-
-#define __itt_notify_sync_acquired(p)
-#define __itt_notify_sync_acquired_ptr 0
+/** @brief Record an frame begin occurrence. */
+void ITTAPI __itt_frame_begin(__itt_frame frame);
+/** @brief Record an frame end occurrence. */
+void ITTAPI __itt_frame_end (__itt_frame frame);
-#define __itt_notify_sync_releasing(p)
-#define __itt_notify_sync_releasing_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, frame_begin, (__itt_frame frame), (frame))
+ITT_STUBV(ITTAPI, void, frame_end, (__itt_frame frame), (frame))
+#define __itt_frame_begin ITTNOTIFY_VOID(frame_begin)
+#define __itt_frame_begin_ptr ITTNOTIFY_NAME(frame_begin)
+#define __itt_frame_end ITTNOTIFY_VOID(frame_end)
+#define __itt_frame_end_ptr ITTNOTIFY_NAME(frame_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_frame_begin(frame)
+#define __itt_frame_begin_ptr 0
+#define __itt_frame_end(frame)
+#define __itt_frame_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_frame_begin_ptr 0
+#define __itt_frame_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} frames group */
-#define __itt_notify_cpath_target()
-#define __itt_notify_cpath_target_ptr 0
+/**
+ * @defgroup events Events
+ * @ingroup public
+ * Events group
+ * @{
+ */
+/** @brief user event type */
+typedef int __itt_event;
+/**
+ * @brief Create an event notification
+ * @note name or namelen being null/name and namelen not matching, user event feature not enabled
+ * @return non-zero event identifier upon success and __itt_err otherwise
+ */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-#define __itt_sync_set_nameA(addr,objtype,objname,attribute)
-#define __itt_sync_set_nameA_ptr 0
-
-#define __itt_sync_set_nameW(addr,objtype,objname,attribute)
-#define __itt_sync_set_nameW_ptr 0
-
-#define __itt_thr_name_setA(name,namelen) (int)0
-#define __itt_thr_name_setA_ptr 0
-
-#define __itt_thr_name_setW(name,namelen) (int)0
-#define __itt_thr_name_setW_ptr 0
+__itt_event LIBITTAPI __itt_event_createA(const char *name, int namelen);
+__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen);
+#ifdef UNICODE
+# define __itt_event_create __itt_event_createW
+# define __itt_event_create_ptr __itt_event_createW_ptr
+#else
+# define __itt_event_create __itt_event_createA
+# define __itt_event_create_ptr __itt_event_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-#define __itt_event_createA(name,namelen) (__itt_event)0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char *name, int namelen), (name, namelen))
+ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen), (name, namelen))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, __itt_event, event_create, (const char *name, int namelen), (name, namelen))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA ITTNOTIFY_DATA(event_createA)
+#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA)
+#define __itt_event_createW ITTNOTIFY_DATA(event_createW)
+#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create ITTNOTIFY_DATA(event_create)
+#define __itt_event_create_ptr ITTNOTIFY_NAME(event_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA(name, namelen) (__itt_event)0
#define __itt_event_createA_ptr 0
-
-#define __itt_event_createW(name,namelen) (__itt_event)0
+#define __itt_event_createW(name, namelen) (__itt_event)0
#define __itt_event_createW_ptr 0
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-#define __itt_thr_name_set(name,namelen) (int)0
-#define __itt_thr_name_set_ptr 0
-
-#define __itt_event_create(name,namelen) (__itt_event)0
-#define __itt_event_create_ptr 0
+#define __itt_event_create(name, namelen) (__itt_event)0
+#define __itt_event_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create_ptr 0
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_thr_ignore()
-#define __itt_thr_ignore_ptr 0
+/**
+ * @brief Record an event occurrence.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_start(__itt_event event);
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event), (event))
+#define __itt_event_start ITTNOTIFY_DATA(event_start)
+#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start)
+#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_event_start(event) (int)0
#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/**
+ * @brief Record an event end occurrence.
+ * @note It is optional if events do not have durations.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_end(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event), (event))
+#define __itt_event_end ITTNOTIFY_DATA(event_end)
+#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
#define __itt_event_end(event) (int)0
#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} events group */
+
+/**
+ * @defgroup heap Heap
+ * @ingroup public
+ * Heap group
+ * @{
+ */
+
+typedef void* __itt_heap_function;
+
+/**
+ * @brief Create an identification for heap function
+ * @return non-zero identifier or NULL
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_heap_function ITTAPI __itt_heap_function_createA(const char* name, const char* domain);
+__itt_heap_function ITTAPI __itt_heap_function_createW(const wchar_t* name, const wchar_t* domain);
+#ifdef UNICODE
+# define __itt_heap_function_create __itt_heap_function_createW
+# define __itt_heap_function_create_ptr __itt_heap_function_createW_ptr
+#else
+# define __itt_heap_function_create __itt_heap_function_createA
+# define __itt_heap_function_create_ptr __itt_heap_function_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_heap_function ITTAPI __itt_heap_function_create(const char* name, const char* domain);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-#define __itt_state_get() (__itt_state_t)0
-#define __itt_state_get_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char* name, const char* domain), (name, domain))
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t* name, const wchar_t* domain), (name, domain))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_create, (const char* name, const char* domain), (name, domain))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_heap_function_createA ITTNOTIFY_DATA(heap_function_createA)
+#define __itt_heap_function_createA_ptr ITTNOTIFY_NAME(heap_function_createA)
+#define __itt_heap_function_createW ITTNOTIFY_DATA(heap_function_createW)
+#define __itt_heap_function_createW_ptr ITTNOTIFY_NAME(heap_function_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_heap_function_create ITTNOTIFY_DATA(heap_function_create)
+#define __itt_heap_function_create_ptr ITTNOTIFY_NAME(heap_function_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_heap_function_createA(name, domain) (__itt_heap_function)0
+#define __itt_heap_function_createA_ptr 0
+#define __itt_heap_function_createW(name, domain) (__itt_heap_function)0
+#define __itt_heap_function_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_heap_function_create(name, domain) (__itt_heap_function)0
+#define __itt_heap_function_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_heap_function_createA_ptr 0
+#define __itt_heap_function_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_heap_function_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_state_set(state) (__itt_state_t)0
-#define __itt_state_set_ptr 0
+/**
+ * @brief Record an allocation begin occurrence.
+ */
+void ITTAPI __itt_heap_allocate_begin(__itt_heap_function h, size_t size, int initialized);
-#define __itt_obj_mode_set(prop, state) (__itt_obj_state_t)0
-#define __itt_obj_mode_set_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_allocate_begin, (__itt_heap_function h, size_t size, int initialized), (h, size, initialized))
+#define __itt_heap_allocate_begin ITTNOTIFY_VOID(heap_allocate_begin)
+#define __itt_heap_allocate_begin_ptr ITTNOTIFY_NAME(heap_allocate_begin)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_allocate_begin(h, size, initialized)
+#define __itt_heap_allocate_begin_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_allocate_begin_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_thr_mode_set(prop, state) (__itt_thr_state_t)0
-#define __itt_thr_mode_set_ptr 0
+/**
+ * @brief Record an allocation end occurrence.
+ */
+void ITTAPI __itt_heap_allocate_end(__itt_heap_function h, void* addr, size_t size, int initialized);
-#define __itt_api_version() (const char*)0
-#define __itt_api_version_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_allocate_end, (__itt_heap_function h, void* addr, size_t size, int initialized), (h, addr, size, initialized))
+#define __itt_heap_allocate_end ITTNOTIFY_VOID(heap_allocate_end)
+#define __itt_heap_allocate_end_ptr ITTNOTIFY_NAME(heap_allocate_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_allocate_end(h, addr, size, initialized)
+#define __itt_heap_allocate_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_allocate_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_jit_notify_event(event_type,event_data) (int)0
-#define __itt_jit_notify_event_ptr 0
+/**
+ * @brief Record an free begin occurrence.
+ */
+void ITTAPI __itt_heap_free_begin(__itt_heap_function h, void* addr);
-#define __itt_jit_get_new_method_id() (unsigned int)0
-#define __itt_jit_get_new_method_id_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_free_begin, (__itt_heap_function h, void* addr), (h, addr))
+#define __itt_heap_free_begin ITTNOTIFY_VOID(heap_free_begin)
+#define __itt_heap_free_begin_ptr ITTNOTIFY_NAME(heap_free_begin)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_free_begin(h, addr)
+#define __itt_heap_free_begin_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_free_begin_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_memory_read(address, size)
-#define __itt_memory_read_ptr 0
+/**
+ * @brief Record an free end occurrence.
+ */
+void ITTAPI __itt_heap_free_end(__itt_heap_function h, void* addr);
-#define __itt_memory_write(address, size)
-#define __itt_memory_write_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_free_end, (__itt_heap_function h, void* addr), (h, addr))
+#define __itt_heap_free_end ITTNOTIFY_VOID(heap_free_end)
+#define __itt_heap_free_end_ptr ITTNOTIFY_NAME(heap_free_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_free_end(h, addr)
+#define __itt_heap_free_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_free_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_memory_update(address, size)
-#define __itt_memory_update_ptr 0
+/**
+ * @brief Record an reallocation begin occurrence.
+ */
+void ITTAPI __itt_heap_reallocate_begin(__itt_heap_function h, void* addr, size_t new_size, int initialized);
-#define __itt_test_delay(p1)
-#define __itt_test_delay_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* addr, size_t new_size, int initialized), (h, addr, new_size, initialized))
+#define __itt_heap_reallocate_begin ITTNOTIFY_VOID(heap_reallocate_begin)
+#define __itt_heap_reallocate_begin_ptr ITTNOTIFY_NAME(heap_reallocate_begin)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_reallocate_begin(h, addr, new_size, initialized)
+#define __itt_heap_reallocate_begin_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_reallocate_begin_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_test_seq_init(p1,p2)
-#define __itt_test_seq_init_ptr 0
+/**
+ * @brief Record an reallocation end occurrence.
+ */
+void ITTAPI __itt_heap_reallocate_end(__itt_heap_function h, void* addr, void* new_addr, size_t new_size, int initialized);
-#define __itt_test_seq_wait(p1,p2)
-#define __itt_test_seq_wait_ptr 0
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void* new_addr, size_t new_size, int initialized), (h, addr, new_addr, new_size, initialized))
+#define __itt_heap_reallocate_end ITTNOTIFY_VOID(heap_reallocate_end)
+#define __itt_heap_reallocate_end_ptr ITTNOTIFY_NAME(heap_reallocate_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_reallocate_end(h, addr, new_addr, new_size, initialized)
+#define __itt_heap_reallocate_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_reallocate_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#define __itt_set_error_handler(x)
+/** @brief internal access begin */
+void ITTAPI __itt_heap_internal_access_begin(void);
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), ())
+#define __itt_heap_internal_access_begin ITTNOTIFY_VOID(heap_internal_access_begin)
+#define __itt_heap_internal_access_begin_ptr ITTNOTIFY_NAME(heap_internal_access_begin)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_internal_access_begin()
+#define __itt_heap_internal_access_begin_ptr 0
#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_internal_access_begin_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
-#endif /* _ITTNOTIFY_H_MACRO_BODY_ */
+/** @brief internal access end */
+void ITTAPI __itt_heap_internal_access_end(void);
-#endif /* _ITTNOTIFY_H_ */
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void), ())
+#define __itt_heap_internal_access_end ITTNOTIFY_VOID(heap_internal_access_end)
+#define __itt_heap_internal_access_end_ptr ITTNOTIFY_NAME(heap_internal_access_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_internal_access_end()
+#define __itt_heap_internal_access_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_internal_access_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
/** @endcond */
+/** @} heap group */
+/** @cond exclude_from_documentation */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/** @endcond */
+
+#endif /* _ITTNOTIFY_H_ */
diff --git a/src/tbb/tools_api/_config.h b/src/tbb/tools_api/ittnotify_config.h
similarity index 82%
rename from src/tbb/tools_api/_config.h
rename to src/tbb/tools_api/ittnotify_config.h
index 1876c3c..f02cc47 100644
--- a/src/tbb/tools_api/_config.h
+++ b/src/tbb/tools_api/ittnotify_config.h
@@ -26,8 +26,8 @@
the GNU General Public License.
*/
-#ifndef __CONFIG_H_
-#define __CONFIG_H_
+#ifndef _ITTNOTIFY_CONFIG_H_
+#define _ITTNOTIFY_CONFIG_H_
#ifndef ITT_OS_WIN
# define ITT_OS_WIN 1
@@ -63,7 +63,6 @@
# define ITT_ARCH_IA64 3
#endif /* ITT_ARCH_IA64 */
-
#ifndef ITT_ARCH
# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
# define ITT_ARCH ITT_ARCH_IA32E
@@ -90,5 +89,17 @@
# endif /* _WIN32 */
#endif /* ITT_PLATFORM */
-#endif /* __CONFIG_H_ */
+#ifdef __cplusplus
+# define ITT_EXTERN_C extern "C"
+#else
+# define ITT_EXTERN_C /* nothing */
+#endif /* __cplusplus */
+
+#define ITT_TO_STR_AUX(x) #x
+#define ITT_TO_STR(x) ITT_TO_STR_AUX(x)
+
+#define __ITT_BUILD_ASSERT(expr, suffix) do { static char __itt_build_check_##suffix[(expr) ? 1 : -1]; __itt_build_check_##suffix[0] = 0; } while(0)
+#define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix)
+#define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__)
+#endif /* _ITTNOTIFY_CONFIG_H_ */
diff --git a/src/tbb/tools_api/ittnotify_static.c b/src/tbb/tools_api/ittnotify_static.c
index ed48d21..85a0a6e 100644
--- a/src/tbb/tools_api/ittnotify_static.c
+++ b/src/tbb/tools_api/ittnotify_static.c
@@ -26,132 +26,74 @@
the GNU General Public License.
*/
-#include "_config.h"
+#include "ittnotify_config.h"
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#include <windows.h>
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
#include <pthread.h>
#include <dlfcn.h>
+#include <errno.h>
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#define __ITT_INTERNAL_INCLUDE
-
-#define _ITTNOTIFY_H_MACRO_BODY_
-
-#include "_disable_warnings.h"
+#include "disable_warnings.h"
+#define INTEL_NO_MACRO_BODY
#include "ittnotify.h"
+#include "legacy/ittnotify.h"
+#include "internal/ittnotify.h"
+#include "prototype/ittnotify.h"
-#ifdef __cplusplus
-# define ITT_EXTERN_C extern "C"
-#else
-# define ITT_EXTERN_C /* nothing */
-#endif /* __cplusplus */
-
-#ifndef __itt_init_lib_name
-# define __itt_init_lib_name __itt_init_lib
-#endif /* __itt_init_lib_name */
-
-static int __itt_init_lib(void);
+#include "ittnotify_types.h"
#ifndef INTEL_ITTNOTIFY_PREFIX
#define INTEL_ITTNOTIFY_PREFIX __itt_
#endif /* INTEL_ITTNOTIFY_PREFIX */
#ifndef INTEL_ITTNOTIFY_POSTFIX
-# define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#define INTEL_ITTNOTIFY_POSTFIX _ptr_
#endif /* INTEL_ITTNOTIFY_POSTFIX */
-#define ___N_(p,n) p##n
-#define __N_(p,n) ___N_(p,n)
-#define _N_(n) __N_(INTEL_ITTNOTIFY_PREFIX,n)
-
-/* building pointers to imported funcs */
-#undef ITT_STUBV
-#undef ITT_STUB
-#define ITT_STUB(type,name,args,params,ptr,group) \
- static type ITTAPI_CALL ITT_JOIN(_N_(name),_init) args; \
- typedef type ITTAPI_CALL name##_t args; \
- ITT_EXTERN_C name##_t* ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX) = ITT_JOIN(_N_(name),_init); \
- static type ITTAPI_CALL ITT_JOIN(_N_(name),_init) args \
- { \
- __itt_init_lib_name(); \
- if(ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX)) \
- return ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX) params; \
- else \
- return (type)0; \
- }
-
-#define ITT_STUBV(type,name,args,params,ptr,group) \
- static type ITTAPI_CALL ITT_JOIN(_N_(name),_init) args; \
- typedef type ITTAPI_CALL name##_t args; \
- ITT_EXTERN_C name##_t* ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX) = ITT_JOIN(_N_(name),_init); \
- static type ITTAPI_CALL ITT_JOIN(_N_(name),_init) args \
- { \
- __itt_init_lib_name(); \
- if(ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX)) \
- ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX) params; \
- else \
- return; \
- }
-
-const __itt_state_t _N_(state_err) = 0;
-const __itt_event _N_(event_err) = 0;
-const int _N_(err) = 0;
-
-#include "_ittnotify_static.h"
-
-typedef enum ___itt_group_id
-{
- __itt_none_group = 0,
- __itt_control_group = 1,
- __itt_thread_group = 2,
- __itt_mark_group = 4,
- __itt_sync_group = 8,
- __itt_fsync_group = 16,
- __itt_jit_group = 32,
- __itt_all_group = -1
-} __itt_group_id;
-
+#define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
#ifndef CDECL
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-# define CDECL __cdecl
+#define CDECL __cdecl
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# define CDECL
+#define CDECL
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* CDECL */
#ifndef STDCALL
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-# define STDCALL __stdcall
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# define STDCALL
+#define STDCALL __stdcall
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+#define STDCALL
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#endif /* STDCALL */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
- typedef FARPROC FPTR;
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
- typedef void* FPTR;
+typedef FARPROC FPTR;
+typedef DWORD TIDT;
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+typedef void* FPTR;
+typedef pthread_t TIDT;
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
/* OS communication functions */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
typedef HMODULE lib_t;
typedef CRITICAL_SECTION mutex_t;
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
typedef void* lib_t;
typedef pthread_mutex_t mutex_t;
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-static lib_t ittnotify_lib;
-
-static __itt_error_notification_t* error_handler = 0;
+static volatile long ittnotify_init = 0;
+static lib_t ittnotify_lib = NULL;
+static __itt_error_notification_t* error_handler = NULL;
#if ITT_OS==ITT_OS_WIN
static const char* ittnotify_lib_name = "libittnotify.dll";
@@ -171,401 +113,522 @@ static const char* ittnotify_lib_name = "libittnotify.dylib";
#endif
#endif /* LIB_VAR_NAME */
-#define __TO_STR(x) #x
-#define _TO_STR(x) __TO_STR(x)
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_get_proc(lib, name) GetProcAddress(lib, name)
+#define __itt_mutex_init(mutex) InitializeCriticalSection(mutex)
+#define __itt_mutex_lock(mutex) EnterCriticalSection(mutex)
+#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
+#define __itt_load_lib(name) LoadLibraryA(name)
+#define __itt_unload_lib(handle) FreeLibrary(handle)
+#define __itt_system_error() (int)GetLastError()
+#define __itt_fstrcmp(s1, s2) lstrcmpA(s1, s2)
+#define __itt_fstrlen(s) lstrlenA(s)
+#define __itt_fstrcpyn(s1, s2, l) lstrcpynA(s1, s2, l)
+#define __itt_thread_id() GetCurrentThreadId()
+#define __itt_thread_yield() SwitchToThread()
+#ifndef ITT_SIMPLE_INIT
+static int __itt_interlocked_increment(volatile int* ptr)
+{
+ ITT_BUILD_ASSERT(sizeof(int) == sizeof(long));
+ return InterlockedIncrement((volatile long *)ptr);
+}
+#endif /* ITT_SIMPLE_INIT */
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+#define __itt_get_proc(lib, name) dlsym(lib, name)
+#define __itt_mutex_init(mutex) \
+ { \
+ pthread_mutexattr_t mutex_attr; \
+ int error_code = pthread_mutexattr_init(&mutex_attr); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutexattr_init", error_code); \
+ error_code = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", error_code); \
+ error_code = pthread_mutex_init(mutex, &mutex_attr); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutex_init", error_code); \
+ error_code = pthread_mutexattr_destroy(&mutex_attr); \
+ if (error_code) \
+ __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", error_code); \
+ }
+#define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex)
+#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
+#define __itt_load_lib(name) dlopen(name, RTLD_LAZY)
+#define __itt_unload_lib(handle) dlclose(handle)
+#define __itt_system_error() errno
+#define __itt_fstrcmp(s1, s2) strcmp(s1, s2)
+#define __itt_fstrlen(s) strlen(s)
+#define __itt_fstrcpyn(s1, s2, l) strncpy(s1, s2, l)
+#define __itt_thread_id() pthread_self()
+#define __itt_thread_yield() sched_yield()
+#if ITT_ARCH==ITT_ARCH_IA64
+#ifdef __INTEL_COMPILER
+#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
+#else /* __INTEL_COMPILER */
+// TODO: Add Support for not Intel compilers for IA64
+#endif /* __INTEL_COMPILER */
+#else /* ITT_ARCH!=ITT_ARCH_IA64 */
+#ifndef ITT_SIMPLE_INIT
+static int __TBB_machine_fetchadd4(volatile void* ptr, int addend)
+{
+ int result;
+ __asm__ __volatile__("lock\nxaddl %0,%1"
+ : "=r"(result),"=m"(*(int *)ptr)
+ : "0"(addend), "m"(*(int *)ptr)
+ : "memory");
+ return result;
+}
+#endif // ITT_SIMPLE_INIT
+#endif /* ITT_ARCH==ITT_ARCH_IA64 */
+#ifndef ITT_SIMPLE_INIT
+static int __itt_interlocked_increment(volatile int* ptr)
+{
+ return __TBB_machine_fetchadd4(ptr, 1) + 1;
+}
+#endif /* ITT_SIMPLE_INIT */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+const int _N_(err) = 0;
-static int __itt_fstrcmp(const char* s1, const char* s2)
+typedef int (__itt_init_ittlib_t)(const char*, __itt_group_id);
+
+/* this define used to control initialization function name. */
+#ifndef __itt_init_ittlib_name
+static int _N_(init_ittlib)(const char*, __itt_group_id);
+static __itt_init_ittlib_t* __itt_init_ittlib_ptr = _N_(init_ittlib);
+#define __itt_init_ittlib_name __itt_init_ittlib_ptr
+#endif /* __itt_init_ittlib_name */
+
+/* building pointers to imported funcs */
+#undef ITT_STUBV
+#undef ITT_STUB
+#define ITT_STUB(api,type,name,args,params,ptr,group,format) \
+ static type api ITT_JOIN(_N_(name),_init) args; \
+ typedef type api name##_t args; \
+ extern "C" name##_t* ITTNOTIFY_NAME(name); \
+ name##_t* ITTNOTIFY_NAME(name) = ITT_JOIN(_N_(name),_init); \
+ static type api ITT_JOIN(_N_(name),_init) args \
+ { \
+ if (__itt_init_ittlib_name(NULL, __itt_group_none) \
+ && ITTNOTIFY_NAME(name) \
+ && ITTNOTIFY_NAME(name) != ITT_JOIN(_N_(name),_init)) \
+ return ITTNOTIFY_NAME(name) params; \
+ else \
+ return (type)0; \
+ }
+
+#define ITT_STUBV(api,type,name,args,params,ptr,group,format) \
+ static type api ITT_JOIN(_N_(name),_init) args; \
+ typedef type api name##_t args; \
+ extern "C" name##_t* ITTNOTIFY_NAME(name); \
+ name##_t* ITTNOTIFY_NAME(name) = ITT_JOIN(_N_(name),_init); \
+ static type api ITT_JOIN(_N_(name),_init) args \
+ { \
+ if (__itt_init_ittlib_name(NULL, __itt_group_none) \
+ && ITTNOTIFY_NAME(name) \
+ && ITTNOTIFY_NAME(name) != ITT_JOIN(_N_(name),_init)) \
+ ITTNOTIFY_NAME(name) params; \
+ else \
+ return; \
+ }
+
+/* Define types and *_init functions. */
+#include "ittnotify_static.h"
+
+ITT_GROUP_LIST(group_list);
+
+typedef struct __itt_group_alias_
{
- int i;
+ const char* env_var;
+ __itt_group_id groups;
+} __itt_group_alias;
- if(!s1 && !s2)
- return 0;
- else if(!s1 && s2)
- return -1;
- else if(s1 && !s2)
- return 1;
-
- for(i = 0; s1[i] || s2[i]; i++)
- if(s1[i] > s2[i])
- return 1;
- else if(s1[i] < s2[i])
- return -1;
- return 0;
+static __itt_group_alias group_alias[] = {
+ { "KMP_FOR_TPROFILE", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_mark) },
+ { "KMP_FOR_TCHECK", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_fsync | __itt_group_mark) },
+ { NULL, (__itt_group_none) }
+};
+
+typedef struct __itt_func_map_
+{
+ const char* name;
+ void** func_ptr;
+ __itt_group_id group;
+} __itt_func_map;
+
+#define __ptr_(pname,name,group) {ITT_TO_STR(ITT_JOIN(__itt_,pname)), (void**)(void*)&ITTNOTIFY_NAME(name), (__itt_group_id)(group)},
+#undef ITT_STUB
+#undef ITT_STUBV
+#define ITT_STUB(api,type,name,args,params,nameindll,group,format) __ptr_(nameindll,name,group)
+#define ITT_STUBV ITT_STUB
+
+static __itt_func_map func_map[] = {
+#include "ittnotify_static.h"
+ {NULL, NULL, __itt_group_none}
+};
+
+#ifndef ITT_SIMPLE_INIT
+
+#undef ITT_STUBV
+#undef ITT_STUB
+#define ITT_STUBV(api,type,name,args,params,ptr,group,format) \
+ITT_EXTERN_C type api _N_(name) args \
+{ \
+ if (ITTNOTIFY_NAME(name)) \
+ ITTNOTIFY_NAME(name) params; \
+ else \
+ return; \
+}
+
+#define ITT_STUB(api,type,name,args,params,ptr,group,format) \
+ITT_EXTERN_C type api _N_(name) args \
+{ \
+ if (ITTNOTIFY_NAME(name)) \
+ return ITTNOTIFY_NAME(name) params; \
+ else \
+ return (type)0; \
}
+/* Define ITT functions. */
+#include "ittnotify_static.h"
+
+#endif /* ITT_SIMPLE_INIT */
+
static const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len)
{
int i;
int j;
- if(!s || !sep || !out || !len)
+ if (!s || !sep || !out || !len)
return 0;
- for(i = 0; s[i]; i++)
+ for (i = 0; s[i]; i++)
{
int b = 0;
- for(j = 0; sep[j]; j++)
- if(s[i] == sep[j])
+ for (j = 0; sep[j]; j++)
+ if (s[i] == sep[j])
{
b = 1;
break;
}
- if(!b)
+ if (!b)
break;
}
- if(!s[i])
+ if (!s[i])
return 0;
*len = 0;
*out = s + i;
- for(; s[i]; i++, (*len)++)
+ for (; s[i]; i++, (*len)++)
{
int b = 0;
- for(j = 0; sep[j]; j++)
- if(s[i] == sep[j])
+ for (j = 0; sep[j]; j++)
+ if (s[i] == sep[j])
{
b = 1;
break;
}
- if(b)
+ if (b)
break;
}
- for(; s[i]; i++)
+ for (; s[i]; i++)
{
int b = 0;
- for(j = 0; sep[j]; j++)
- if(s[i] == sep[j])
+ for (j = 0; sep[j]; j++)
+ if (s[i] == sep[j])
{
b = 1;
break;
}
- if(!b)
+ if (!b)
break;
}
return s + i;
}
-static char* __itt_fstrcpyn(char* dst, const char* src, int len)
-{
- int i;
-
- if(!src || !dst)
- return 0;
-
- for(i = 0; i < len; i++)
- dst[i] = src[i];
- dst[len] = 0;
- return dst;
-}
-
#ifdef ITT_NOTIFY_EXT_REPORT
-# define ERROR_HANDLER ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, error_handler)
-ITT_EXTERN_C void ERROR_HANDLER(__itt_error_code, const char* msg);
+ITT_EXTERN_C void _N_(error_handler)(__itt_error_code, va_list args);
#endif /* ITT_NOTIFY_EXT_REPORT */
-static void __itt_report_error(__itt_error_code code, const char* msg)
+static void __itt_report_error(__itt_error_code code, ...)
{
- if(error_handler)
- error_handler(code, msg);
+ va_list args;
+ va_start( args, code );
+ if (error_handler != NULL)
+ error_handler(code, args);
#ifdef ITT_NOTIFY_EXT_REPORT
- ERROR_HANDLER(code, msg);
+ _N_(error_handler)(code, args);
#endif /* ITT_NOTIFY_EXT_REPORT */
+ va_end(args);
}
static const char* __itt_get_env_var(const char* name)
{
- static char env_value[4096];
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
- int i;
- DWORD rc;
- for(i = 0; i < sizeof(env_value); i++)
- env_value[i] = 0;
- rc = GetEnvironmentVariableA(name, env_value, sizeof(env_value) - 1);
- if(rc >= sizeof(env_value))
- __itt_report_error(__itt_error_cant_read_env, name);
- else if(!rc)
- return 0;
- else
- return env_value;
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
- char* env = getenv(name);
- int i;
- for(i = 0; i < sizeof(env_value); i++)
- env_value[i] = 0;
- if(env)
+#define MAX_ENV_VALUE_SIZE 4086
+ static char env_buff[MAX_ENV_VALUE_SIZE];
+ static char* env_value = (char*)&env_buff;
+
+ if (name != NULL)
{
- if(strlen(env) >= sizeof(env_value))
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ size_t max_len = MAX_ENV_VALUE_SIZE - ((size_t)env_value - (size_t)&env_buff);
+ DWORD rc = GetEnvironmentVariableA(name, env_value, (DWORD)max_len);
+ if (rc >= max_len)
{
- __itt_report_error(__itt_error_cant_read_env, name);
- return 0;
+ __itt_report_error(__itt_error_env_too_long, name, (size_t)rc - 1, (size_t)(max_len - 1));
+ }
+ else if (rc > 0)
+ {
+ char* ret = env_value;
+ env_value += rc + 1;
+ return ret;
+ }
+ else
+ {
+ /* If environment variable is empty, GetEnvirornmentVariables() returns zero (number of */
+ /* characters (not including terminating null), and GetLastError() returns ERROR_SUCCESS. */
+ DWORD err = GetLastError();
+ if (err == ERROR_SUCCESS)
+ return env_value;
+
+ if (err != ERROR_ENVVAR_NOT_FOUND)
+ __itt_report_error(__itt_error_cant_read_env, name, (int)err);
+ }
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ char* env = getenv(name);
+ if (env != NULL)
+ {
+ size_t len = strlen(env);
+ size_t max_len = MAX_ENV_VALUE_SIZE - ((size_t)env_value - (size_t)&env_buff);
+ if (len < max_len)
+ {
+ char* ret = env_value;
+ strncpy(env_value, env, len + 1);
+ env_value += len + 1;
+ return ret;
+ } else
+ __itt_report_error(__itt_error_env_too_long, name, (size_t)len, (size_t)(max_len - 1));
}
- strncpy(env_value, env, sizeof(env_value) - 1);
- return env_value;
- }
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
- return 0;
+ }
+ return NULL;
}
static const char* __itt_get_lib_name()
{
- const char* lib_name = __itt_get_env_var(_TO_STR(LIB_VAR_NAME));
- if(!lib_name)
- lib_name = ittnotify_lib_name;
-
- return lib_name;
+ const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
+ return (lib_name == NULL) ? ittnotify_lib_name : lib_name;
}
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
-# define __itt_get_proc(lib, name) GetProcAddress(lib, name)
-# define __itt_init_mutex(mutex) InitializeCriticalSection(mutex)
-# define __itt_mutex_lock(mutex) EnterCriticalSection(mutex)
-# define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
-# define __itt_load_lib(name) LoadLibraryA(name)
-#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# define __itt_get_proc(lib, name) dlsym(lib, name)
-# define __itt_init_mutex(mutex) pthread_mutex_init(mutex, 0)
-# define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex)
-# define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
-# define __itt_load_lib(name) dlopen(name, RTLD_LAZY)
-#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-
-#ifndef ITT_SIMPLE_INIT
-/* function stubs */
-
-#undef ITT_STUBV
-#undef ITT_STUB
-
-#define ITT_STUBV(type,name,args,params,ptr,group) \
-ITT_EXTERN_C type ITTAPI_CALL _N_(name) args \
-{ \
- __itt_init_lib_name(); \
- if(ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX)) \
- ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX) params; \
- else \
- return; \
-}
-
-#define ITT_STUB(type,name,args,params,ptr,group) \
-ITT_EXTERN_C type ITTAPI_CALL _N_(name) args \
-{ \
- __itt_init_lib_name(); \
- if(ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX)) \
- return ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX) params; \
- else \
- return (type)0; \
-}
-
-#include "_ittnotify_static.h"
-
-#endif /* ITT_SIMPLE_INIT */
-
-typedef struct ___itt_group_list
-{
- __itt_group_id id;
- const char* name;
-} __itt_group_list;
-
-static __itt_group_list group_list[] = {
- {__itt_control_group, "control"},
- {__itt_thread_group, "thread"},
- {__itt_mark_group, "mark"},
- {__itt_sync_group, "sync"},
- {__itt_fsync_group, "fsync"},
- {__itt_jit_group, "jit"},
- {__itt_all_group, "all"},
- {__itt_none_group, 0}
-};
-
-typedef struct ___itt_group_alias
-{
- const char* env_var;
- __itt_group_id groups;
-} __itt_group_alias;
-
-static __itt_group_alias group_alias[] = {
- {"KMP_FOR_TPROFILE", (__itt_group_id)(__itt_control_group | __itt_thread_group | __itt_sync_group | __itt_mark_group)},
- {"KMP_FOR_TCHECK", (__itt_group_id)(__itt_control_group | __itt_thread_group | __itt_fsync_group | __itt_mark_group)},
- {0, __itt_none_group}
-};
-
-typedef struct ___itt_func_map
-{
- const char* name;
- void** func_ptr;
- __itt_group_id group;
-} __itt_func_map;
-
-
-#define _P_(name) ITT_JOIN(_N_(name),INTEL_ITTNOTIFY_POSTFIX)
-
-#define ITT_STRINGIZE_AUX(p) #p
-#define ITT_STRINGIZE(p) ITT_STRINGIZE_AUX(p)
-
-#define __ptr_(pname,name,group) {ITT_STRINGIZE(ITT_JOIN(__itt_,pname)), (void**)(void*)&_P_(name), (__itt_group_id)(group)},
-
-#undef ITT_STUB
-#undef ITT_STUBV
-
-#define ITT_STUB(type,name,args,params,ptr,group) __ptr_(ptr,name,group)
-#define ITT_STUBV ITT_STUB
-
-static __itt_func_map func_map[] = {
-#include "_ittnotify_static.h"
- {0, 0, __itt_none_group}
-};
+#ifndef min
+#define min(a,b) (a) < (b) ? (a) : (b)
+#endif /* min */
static __itt_group_id __itt_get_groups()
{
- __itt_group_id res = __itt_none_group;
+ int i;
+ __itt_group_id res = __itt_group_none;
- const char* group_str = __itt_get_env_var("INTEL_ITTNOTIFY_GROUPS");
- if(group_str)
+ const char* var_name = "INTEL_ITTNOTIFY_GROUPS";
+ const char* group_str = __itt_get_env_var(var_name);
+ if (group_str != NULL)
{
+ int len;
char gr[255];
const char* chunk;
- int len;
- while((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != 0)
+ while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL)
{
- int j;
- int group_detected = 0;
- __itt_fstrcpyn(gr, chunk, len);
- for(j = 0; group_list[j].name; j++)
+ __itt_fstrcpyn(gr, chunk, sizeof(gr));
+
+ gr[min((size_t)len, sizeof(gr) - 1)] = 0;
+
+ for (i = 0; group_list[i].name != NULL; i++)
{
- if(!__itt_fstrcmp(gr, group_list[j].name))
+ if (!__itt_fstrcmp(gr, group_list[i].name))
{
- res = (__itt_group_id)(res | group_list[j].id);
- group_detected = 1;
+ res = (__itt_group_id)(res | group_list[i].id);
break;
}
}
-
- if(!group_detected)
- __itt_report_error(__itt_error_unknown_group, gr);
}
+ /* TODO: !!! Workaround for bug with warning for unknown group !!!
+ * Should be fixed in new initialization scheme.
+ * Now the following groups should be set always.
+ */
+ for (i = 0; group_list[i].id != __itt_group_none; i++)
+ if (group_list[i].id != __itt_group_all && group_list[i].id > __itt_group_splitter)
+ res = (__itt_group_id)(res | group_list[i].id);
return res;
}
else
{
- int i;
- for(i = 0; group_alias[i].env_var; i++)
- if(__itt_get_env_var(group_alias[i].env_var))
+ for (i = 0; group_alias[i].env_var != NULL; i++)
+ if (__itt_get_env_var(group_alias[i].env_var) != NULL)
return group_alias[i].groups;
}
return res;
}
+static int __itt_is_legacy_lib(lib_t lib)
+{
+ if (lib == NULL)
+ return 0; // if unknown assume NO
+
+ if (__itt_get_proc(lib, "__itt_api_version"))
+ return 0; // New interface - NO
+ return 1; // It's legacy otherwise
+}
+
#if ITT_PLATFORM==ITT_PLATFORM_WIN
#pragma warning(push)
#pragma warning(disable: 4054)
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-static int __itt_init_lib()
+/* ITT_EXTERN_C - should be exported after agreament
+static void _N_(fini_ittlib)(void)
{
- static volatile int init = 0;
- static int result = 0;
+ int i;
-#ifndef ITT_SIMPLE_INIT
+ if (ittnotify_init)
+ {
+ // Clear all pointers
+ for (i = 0; func_map[i].name != NULL; i++)
+ *func_map[i].func_ptr = NULL;
-#if ITT_PLATFORM==ITT_PLATFORM_POSIX
- static mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-#else
- static volatile int mutex_initialized = 0;
- static mutex_t mutex;
- static LONG inter_counter = 0;
-#endif
+ if (ittnotify_lib != NULL)
+ __itt_unload_lib(ittnotify_lib);
+
+ ittnotify_lib = NULL;
+ ittnotify_init = 0;
+ }
+}
+*/
+
+static int _N_(init_ittlib)(const char* lib_name, __itt_group_id groups)
+{
+ int i, ret = 0;
+ static volatile TIDT current_thread = 0;
- if(!init)
+ if (!ittnotify_init)
{
-#if ITT_PLATFORM==ITT_PLATFORM_WIN
- if(!mutex_initialized)
+#ifndef ITT_SIMPLE_INIT
+ static mutex_t mutex;
+ static volatile int inter_counter = 0;
+ static volatile int mutex_initialized = 0;
+
+ if (!mutex_initialized)
{
- if(InterlockedIncrement(&inter_counter) == 1)
+ if (__itt_interlocked_increment(&inter_counter) == 1)
{
- __itt_init_mutex(&mutex);
+ __itt_mutex_init(&mutex);
mutex_initialized = 1;
}
else
- while(!mutex_initialized)
- SwitchToThread();
+ while (!mutex_initialized)
+ __itt_thread_yield();
}
-#endif
__itt_mutex_lock(&mutex);
#endif /* ITT_SIMPLE_INIT */
- if(!init)
- {
- int i;
-
- __itt_group_id groups = __itt_get_groups();
-
- for(i = 0; func_map[i].name; i++)
- *func_map[i].func_ptr = 0;
- if(groups != __itt_none_group)
+ if (!ittnotify_init)
+ {
+ if (current_thread == 0)
{
-#ifdef ITT_COMPLETE_GROUP
- __itt_group_id zero_group = __itt_none_group;
-#endif /* ITT_COMPLETE_GROUP */
-
- ittnotify_lib = __itt_load_lib(__itt_get_lib_name());
- if(ittnotify_lib)
+ current_thread = __itt_thread_id();
+ if (groups == __itt_group_none)
+ groups = __itt_get_groups();
+ if (groups == __itt_group_none)
+ {
+ // Clear all pointers
+ for (i = 0; func_map[i].name != NULL; i++ )
+ *func_map[i].func_ptr = NULL;
+ }
+ else
{
- for(i = 0; func_map[i].name; i++)
+ __itt_group_id zero_group = __itt_group_none;
+ if (lib_name == NULL)
+ lib_name = __itt_get_lib_name();
+ ittnotify_lib = __itt_load_lib(lib_name);
+ if (ittnotify_lib != NULL)
{
- if(func_map[i].name && func_map[i].func_ptr && (func_map[i].group & groups))
+ if (__itt_is_legacy_lib(ittnotify_lib))
+ groups = __itt_group_legacy;
+
+ for (i = 0; func_map[i].name != NULL; i++)
{
- *func_map[i].func_ptr = (void*)__itt_get_proc(ittnotify_lib, func_map[i].name);
- if(!(*func_map[i].func_ptr) && func_map[i].name)
+ if (func_map[i].group & groups)
{
- __itt_report_error(__itt_error_no_symbol, func_map[i].name);
-#ifdef ITT_COMPLETE_GROUP
- zero_group = (__itt_group_id)(zero_group | func_map[i].group);
-#endif /* ITT_COMPLETE_GROUP */
+ *func_map[i].func_ptr = (void*)__itt_get_proc(ittnotify_lib, func_map[i].name);
+ if (*func_map[i].func_ptr == NULL)
+ {
+ __itt_report_error(__itt_error_no_symbol, lib_name, func_map[i].name );
+ zero_group = (__itt_group_id)(zero_group | func_map[i].group);
+ }
}
else
- result = 1;
+ *func_map[i].func_ptr = NULL;
+ }
+
+ if (groups == __itt_group_legacy)
+ {
+ // Compatibility with legacy tools
+ ITTNOTIFY_NAME(sync_prepare) = ITTNOTIFY_NAME(notify_sync_prepare);
+ ITTNOTIFY_NAME(sync_cancel) = ITTNOTIFY_NAME(notify_sync_cancel);
+ ITTNOTIFY_NAME(sync_acquired) = ITTNOTIFY_NAME(notify_sync_acquired);
+ ITTNOTIFY_NAME(sync_releasing) = ITTNOTIFY_NAME(notify_sync_releasing);
}
}
- }
- else
- {
- __itt_report_error(__itt_error_no_module, __itt_get_lib_name());
- }
+ else
+ {
+ // Clear all pointers
+ for (i = 0; func_map[i].name != NULL; i++)
+ *func_map[i].func_ptr = NULL;
+ __itt_report_error(__itt_error_no_module, lib_name,
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ __itt_system_error()
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ dlerror()
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ );
+ }
#ifdef ITT_COMPLETE_GROUP
- for(i = 0; func_map[i].name; i++)
- if(func_map[i].group & zero_group)
- *func_map[i].func_ptr = 0;
-
- result = 0;
+ for (i = 0; func_map[i].name != NULL; i++)
+ if (func_map[i].group & zero_group)
+ *func_map[i].func_ptr = NULL;
+#endif /* ITT_COMPLETE_GROUP */
- for(i = 0; func_map[i].name; i++) /* evaluating if any function ptr is non empty */
- if(*func_map[i].func_ptr)
+ /* evaluating if any function ptr is non empty */
+ for (i = 0; func_map[i].name != NULL; i++)
{
- result = 1;
- break;
+ if (*func_map[i].func_ptr != NULL)
+ {
+ ret = 1;
+ break;
+ }
}
-#endif /* ITT_COMPLETE_GROUP */
- }
+ }
- init = 1; /* first checking of 'init' flag happened out of mutex, that is why setting flag to 1 */
- /* must be after call table is filled (to avoid condition races) */
+ ittnotify_init = 1;
+ current_thread = 0;
+ }
}
+
#ifndef ITT_SIMPLE_INIT
__itt_mutex_unlock(&mutex);
- }
#endif /* ITT_SIMPLE_INIT */
- return result;
-}
+ }
-#define SET_ERROR_HANDLER ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, set_error_handler)
+ return ret;
+}
-ITT_EXTERN_C __itt_error_notification_t* SET_ERROR_HANDLER(__itt_error_notification_t* handler)
+ITT_EXTERN_C __itt_error_notification_t* _N_(set_error_handler)(__itt_error_notification_t* handler)
{
__itt_error_notification_t* prev = error_handler;
error_handler = handler;
diff --git a/src/tbb/tools_api/ittnotify_static.h b/src/tbb/tools_api/ittnotify_static.h
new file mode 100644
index 0000000..109674f
--- /dev/null
+++ b/src/tbb/tools_api/ittnotify_static.h
@@ -0,0 +1,231 @@
+/*
+ Copyright 2005-2010 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 "ittnotify_config.h"
+
+#ifndef ITT_STUB
+# define ITT_STUB ITT_STUBV
+#endif /* ITT_STUB */
+
+#ifndef ITTAPI
+# define ITTAPI CDECL
+#endif /* ITTAPI */
+
+#ifndef LIBITTAPI
+# define LIBITTAPI /* nothing */
+#endif /* LIBITTAPI */
+
+#ifndef ITT_FORMAT_DEFINED
+# ifndef ITT_FORMAT
+# define ITT_FORMAT
+# endif /* ITT_FORMAT */
+# ifndef ITT_NO_PARAMS
+# define ITT_NO_PARAMS
+# endif /* ITT_NO_PARAMS */
+#endif /* ITT_FORMAT_DEFINED */
+
+/*
+ * parameters for macro expected:
+ * ITT_STUB(api, type, func_name, arguments, params, func_name_in_dll, group, printf_fmt)
+ */
+/* public */
+ITT_STUBV(ITTAPI, void, pause, (void), (ITT_NO_PARAMS), pause, __itt_group_control | __itt_group_legacy, "no args")
+ITT_STUBV(ITTAPI, void, resume, (void), (ITT_NO_PARAMS), resume, __itt_group_control | __itt_group_legacy, "no args")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, thread_set_nameA, (const char *name), (ITT_FORMAT name), thread_set_nameA, __itt_group_thread, "\"%s\"")
+ITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name), (ITT_FORMAT name), thread_set_nameW, __itt_group_thread, "\"%S\"")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, thread_set_name, (const char *name), (ITT_FORMAT name), thread_set_name, __itt_group_thread, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, thread_ignore, (void), (ITT_NO_PARAMS), thread_ignore, __itt_group_thread, "no args")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createA, __itt_group_sync | __itt_group_fsync, "%p, \"%s\", \"%s\", %x")
+ITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createW, __itt_group_sync | __itt_group_fsync, "%p, \"%S\", \"%S\", %x")
+ITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char *name), (ITT_FORMAT addr, name), sync_renameA, __itt_group_sync | __itt_group_fsync, "%p, \"%s\"")
+ITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name), (ITT_FORMAT addr, name), sync_renameW, __itt_group_sync | __itt_group_fsync, "%p, \"%S\"")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_create, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_create, __itt_group_sync | __itt_group_fsync, "%p, \"%s\", \"%s\", %x")
+ITT_STUBV(ITTAPI, void, sync_rename, (void *addr, const char *name), (ITT_FORMAT addr, name), sync_rename, __itt_group_sync | __itt_group_fsync, "%p, \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_destroy, (void *addr), (ITT_FORMAT addr), sync_destroy, __itt_group_sync | __itt_group_fsync, "%p")
+
+ITT_STUBV(ITTAPI, void, sync_prepare, (void* addr), (ITT_FORMAT addr), sync_prepare, __itt_group_sync, "%p")
+ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr), (ITT_FORMAT addr), sync_cancel, __itt_group_sync, "%p")
+ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_sync, "%p")
+ITT_STUBV(ITTAPI, void, sync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_sync, "%p")
+
+ITT_STUBV(ITTAPI, void, fsync_prepare, (void* addr), (ITT_FORMAT addr), sync_prepare, __itt_group_fsync, "%p")
+ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr), (ITT_FORMAT addr), sync_cancel, __itt_group_fsync, "%p")
+ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_fsync, "%p")
+ITT_STUBV(ITTAPI, void, fsync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_fsync, "%p")
+
+ITT_STUBV(ITTAPI, void, model_site_begin, (__itt_model_site *site, __itt_model_site_instance *instance, const char *name), (ITT_FORMAT site, instance, name), model_site_begin, __itt_group_model, "%p, %p, \"%s\"")
+ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_site_instance *instance), (ITT_FORMAT site, instance), model_site_end, __itt_group_model, "%p, %p")
+ITT_STUBV(ITTAPI, void, model_task_begin, (__itt_model_task *task, __itt_model_task_instance *instance, const char *name), (ITT_FORMAT task, instance, name), model_task_begin, __itt_group_model, "%p, %p, \"%s\"")
+ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_task_instance *instance), (ITT_FORMAT task, instance), model_task_end, __itt_group_model, "%p, %p")
+ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock), (ITT_FORMAT lock), model_lock_acquire, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock), (ITT_FORMAT lock), model_lock_release, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_record_allocation, (void *addr, size_t size), (ITT_FORMAT addr, size), model_record_allocation, __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr), (ITT_FORMAT addr), model_record_deallocation, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_induction_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_induction_uses, __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_reduction_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_reduction_uses, __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_observe_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_observe_uses, __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_clear_uses, (void* addr), (ITT_FORMAT addr), model_clear_uses, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (ITT_FORMAT x), model_disable_push, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_disable_pop, (void), (ITT_NO_PARAMS), model_disable_pop, __itt_group_model, "no args")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char *name, const char *domain), (ITT_FORMAT name, domain), counter_createA, __itt_group_counter, "\"%s\", \"%s\"")
+ITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), counter_createW, __itt_group_counter, "\"%s\", \"%s\"")
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_counter, counter_create, (const char *name, const char *domain), (ITT_FORMAT name, domain), counter_create, __itt_group_counter, "\"%s\", \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, counter_destroy, (__itt_counter id), (ITT_FORMAT id), counter_destroy, __itt_group_counter, "%p")
+ITT_STUBV(ITTAPI, void, counter_inc, (__itt_counter id), (ITT_FORMAT id), counter_inc, __itt_group_counter, "%p")
+ITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value), (ITT_FORMAT id, value), counter_inc_delta, __itt_group_counter, "%p, %lu")
+
+#ifndef __ITT_INTERNAL_BODY
+ITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void), (ITT_NO_PARAMS), stack_caller_create, __itt_group_stitch, "no args")
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id), (ITT_FORMAT id), stack_caller_destroy, __itt_group_stitch, "%p")
+ITT_STUBV(ITTAPI, void, stack_callee_enter, (__itt_caller id), (ITT_FORMAT id), stack_callee_enter, __itt_group_stitch, "%p")
+ITT_STUBV(ITTAPI, void, stack_callee_leave, (__itt_caller id), (ITT_FORMAT id), stack_callee_leave, __itt_group_stitch, "%p")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char *domain), (ITT_FORMAT domain), frame_createA, __itt_group_frame, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain), (ITT_FORMAT domain), frame_createW, __itt_group_frame, "\"%s\"")
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_frame, frame_create, (const char *domain), (ITT_FORMAT domain), frame_create, __itt_group_frame, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, frame_begin, (__itt_frame frame), (ITT_FORMAT frame), frame_begin, __itt_group_frame, "%p")
+ITT_STUBV(ITTAPI, void, frame_end, (__itt_frame frame), (ITT_FORMAT frame), frame_end, __itt_group_frame, "%p")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char *name, int namelen), (ITT_FORMAT name, namelen), event_createA, __itt_group_mark | __itt_group_legacy, "\"%s\", %d")
+ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), event_createW, __itt_group_mark | __itt_group_legacy, "\"%S\", %d")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, __itt_event, event_create, (const char *name, int namelen), (ITT_FORMAT name, namelen), event_create, __itt_group_mark | __itt_group_legacy, "\"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event), (ITT_FORMAT event), event_start, __itt_group_mark | __itt_group_legacy, "%d")
+ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event), (ITT_FORMAT event), event_end, __itt_group_mark | __itt_group_legacy, "%d")
+#endif /* __ITT_INTERNAL_BODY */
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char *name, const char *domain), (ITT_FORMAT name, domain), heap_function_createA, __itt_group_heap, "\"%s\", \"%s\"")
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), heap_function_createW, __itt_group_heap, "\"%s\", \"%s\"")
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_create, (const char *name, const char *domain), (ITT_FORMAT name, domain), heap_function_create, __itt_group_heap, "\"%s\", \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, heap_allocate_begin, (__itt_heap_function h, size_t size, int initialized), (ITT_FORMAT h, size, initialized), heap_allocate_begin, __itt_group_heap, "%p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_allocate_end, (__itt_heap_function h, void* addr, size_t size, int initialized), (ITT_FORMAT h, addr, size, initialized), heap_allocate_end, __itt_group_heap, "%p, %p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_free_begin, (__itt_heap_function h, void* addr), (ITT_FORMAT h, addr), heap_free_begin, __itt_group_heap, "%p, %p")
+ITT_STUBV(ITTAPI, void, heap_free_end, (__itt_heap_function h, void* addr), (ITT_FORMAT h, addr), heap_free_end, __itt_group_heap, "%p, %p")
+ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_size, initialized), heap_reallocate_begin, __itt_group_heap, "%p, %p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void* new_addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_addr, new_size, initialized), heap_reallocate_end, __itt_group_heap, "%p, %p, %p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), (ITT_NO_PARAMS), heap_internal_access_begin, __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void), (ITT_NO_PARAMS), heap_internal_access_end, __itt_group_heap, "no args")
+
+/* legacy */
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, thr_name_setA, (const char *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setA, __itt_group_thread | __itt_group_legacy, "\"%s\", %d")
+ITT_STUB(LIBITTAPI, int, thr_name_setW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setW, __itt_group_thread | __itt_group_legacy, "\"%S\", %d")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, thr_name_set, (const char *name, int namelen), (ITT_FORMAT name, namelen), thr_name_set, __itt_group_thread | __itt_group_legacy, "\"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(LIBITTAPI, void, thr_ignore, (void), (ITT_NO_PARAMS), thr_ignore, __itt_group_thread | __itt_group_legacy, "no args")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", \"%s\", %x")
+ITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%S\", \"%S\", %x")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_set_name, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_name, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "p, \"%s\", \"%s\", %x")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *p, const char *objtype, int typelen, const char *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", %d, \"%s\", %d, %x")
+ITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *p, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%S\", %d, \"%S\", %d, %x")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, notify_sync_name, (void *p, const char *objtype, int typelen, const char *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_name, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", %d, \"%s\", %d, %x")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+ITT_STUBV(LIBITTAPI, void, notify_sync_prepare, (void *p), (ITT_FORMAT p), notify_sync_prepare, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+ITT_STUBV(LIBITTAPI, void, notify_sync_cancel, (void *p), (ITT_FORMAT p), notify_sync_cancel, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+ITT_STUBV(LIBITTAPI, void, notify_sync_acquired, (void *p), (ITT_FORMAT p), notify_sync_acquired, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+ITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *p), (ITT_FORMAT p), notify_sync_releasing, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+#endif /* __ITT_INTERNAL_BODY */
+
+ITT_STUBV(LIBITTAPI, void, memory_read, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_read, __itt_group_legacy, "%p, %lu")
+ITT_STUBV(LIBITTAPI, void, memory_write, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_write, __itt_group_legacy, "%p, %lu")
+ITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_update, __itt_group_legacy, "%p, %lu")
+
+ITT_STUB(LIBITTAPI, __itt_state_t, state_get, (void), (ITT_NO_PARAMS), state_get, __itt_group_legacy, "no args")
+ITT_STUB(LIBITTAPI, __itt_state_t, state_set, (__itt_state_t s), (ITT_FORMAT s), state_set, __itt_group_legacy, "%d")
+ITT_STUB(LIBITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s), (ITT_FORMAT p, s), obj_mode_set, __itt_group_legacy, "%d, %d")
+ITT_STUB(LIBITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s), (ITT_FORMAT p, s), thr_mode_set, __itt_group_legacy, "%d, %d")
+
+/* internal */
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char *name), (ITT_FORMAT name), mark_createA, __itt_group_mark, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name), (ITT_FORMAT name), mark_createW, __itt_group_mark, "\"%S\"")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_mark_type, mark_create, (const char *name), (ITT_FORMAT name), mark_create, __itt_group_mark, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, markA, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), markA, __itt_group_mark, "%d, \"%s\"")
+ITT_STUB(ITTAPI, int, markW, (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), markW, __itt_group_mark, "%d, \"%S\"")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), mark, __itt_group_mark, "%d, \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark_off, (__itt_mark_type mt), (ITT_FORMAT mt), mark_off, __itt_group_mark, "%d")
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, mark_globalA, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), mark_globalA, __itt_group_mark, "%d, \"%s\"")
+ITT_STUB(ITTAPI, int, mark_globalW, (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), mark_globalW, __itt_group_mark, "%d, \"%S\"")
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark_global, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), mark_global, __itt_group_mark, "%d, \"%S\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark_global_off, (__itt_mark_type mt), (ITT_FORMAT mt), mark_global_off, __itt_group_mark, "%d")
+
+/* prototype */
+/* empty so far */
+
+/* hidden */
+#ifndef __ITT_INTERNAL_BODY
+ITT_STUB(ITTAPI, const char*, api_version, (void), (ITT_NO_PARAMS), api_version, __itt_group_all & ~__itt_group_legacy, "no args")
+#endif /* __ITT_INTERNAL_BODY */
diff --git a/include/tbb/task_scheduler_observer.h b/src/tbb/tools_api/ittnotify_types.h
similarity index 50%
copy from include/tbb/task_scheduler_observer.h
copy to src/tbb/tools_api/ittnotify_types.h
index 9df4d73..ec0d696 100644
--- a/include/tbb/task_scheduler_observer.h
+++ b/src/tbb/tools_api/ittnotify_types.h
@@ -26,49 +26,50 @@
the GNU General Public License.
*/
-#ifndef __TBB_task_scheduler_observer_H
-#define __TBB_task_scheduler_observer_H
-
-#include "atomic.h"
-
-#if __TBB_SCHEDULER_OBSERVER
-
-namespace tbb {
-
-namespace internal {
-
-class observer_proxy;
-
-class task_scheduler_observer_v3 {
- friend class observer_proxy;
- observer_proxy* my_proxy;
- atomic<intptr> my_busy_count;
-public:
- //! Enable or disable observation
- void __TBB_EXPORTED_METHOD observe( bool state=true );
-
- //! True if observation is enables; false otherwise.
- bool is_observing() const {return my_proxy!=NULL;}
-
- //! Construct observer with observation disabled.
- task_scheduler_observer_v3() : my_proxy(NULL) {my_busy_count=0;}
-
- //! Called by thread before first steal since observation became enabled
- virtual void on_scheduler_entry( bool /*is_worker*/ ) {}
-
- //! Called by thread when it no longer takes part in task stealing.
- virtual void on_scheduler_exit( bool /*is_worker*/ ) {}
-
- //! Destructor
- virtual ~task_scheduler_observer_v3() {observe(false);}
-};
-
-} // namespace internal
-
-typedef internal::task_scheduler_observer_v3 task_scheduler_observer;
-
-} // namespace tbb
-
-#endif /* __TBB_SCHEDULER_OBSERVER */
-
-#endif /* __TBB_task_scheduler_observer_H */
+#ifndef _ITTNOTIFY_TYPES_H_
+#define _ITTNOTIFY_TYPES_H_
+
+typedef enum __itt_group_id_
+{
+ __itt_group_none = 0,
+ __itt_group_legacy = 1<<0,
+ __itt_group_control = 1<<1,
+ __itt_group_thread = 1<<2,
+ __itt_group_mark = 1<<3,
+ __itt_group_sync = 1<<4,
+ __itt_group_fsync = 1<<5,
+ __itt_group_jit = 1<<6,
+ __itt_group_model = 1<<7,
+ __itt_group_splitter= 1<<7,
+//-----------------------------
+ __itt_group_counter = 1<<8,
+ __itt_group_frame = 1<<9,
+ __itt_group_stitch = 1<<10,
+ __itt_group_heap = 1<<11,
+ __itt_group_all = -1
+} __itt_group_id;
+
+typedef struct __itt_group_list_
+{
+ __itt_group_id id;
+ const char* name;
+} __itt_group_list;
+
+#define ITT_GROUP_LIST(varname) \
+ static __itt_group_list varname[] = { \
+ { __itt_group_all, "all" }, \
+ { __itt_group_control, "control" }, \
+ { __itt_group_thread, "thread" }, \
+ { __itt_group_mark, "mark" }, \
+ { __itt_group_sync, "sync" }, \
+ { __itt_group_fsync, "fsync" }, \
+ { __itt_group_jit, "jit" }, \
+ { __itt_group_model, "model" }, \
+ { __itt_group_counter, "counter" }, \
+ { __itt_group_frame, "frame" }, \
+ { __itt_group_stitch, "stitch" }, \
+ { __itt_group_heap, "heap" }, \
+ { __itt_group_none, NULL } \
+ }
+
+#endif /* _ITTNOTIFY_TYPES_H_ */
diff --git a/src/tbb/tools_api/legacy/ittnotify.h b/src/tbb/tools_api/legacy/ittnotify.h
new file mode 100644
index 0000000..dff5bbc
--- /dev/null
+++ b/src/tbb/tools_api/legacy/ittnotify.h
@@ -0,0 +1,817 @@
+/*
+ Copyright 2005-2010 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 _LEGACY_ITTNOTIFY_H_
+#define _LEGACY_ITTNOTIFY_H_
+/**
+ * @file
+ * @brief Legacy User API functions and types
+ */
+
+/** @cond exclude_from_documentation */
+#ifndef ITT_OS_WIN
+# define ITT_OS_WIN 1
+#endif /* ITT_OS_WIN */
+
+#ifndef ITT_OS_LINUX
+# define ITT_OS_LINUX 2
+#endif /* ITT_OS_LINUX */
+
+#ifndef ITT_OS_MAC
+# define ITT_OS_MAC 3
+#endif /* ITT_OS_MAC */
+
+#ifndef ITT_OS
+# if defined WIN32 || defined _WIN32
+# define ITT_OS ITT_OS_WIN
+# elif defined( __APPLE__ ) && defined( __MACH__ )
+# define ITT_OS ITT_OS_MAC
+# else
+# define ITT_OS ITT_OS_LINUX
+# endif
+#endif /* ITT_OS */
+
+#ifndef ITT_PLATFORM_WIN
+# define ITT_PLATFORM_WIN 1
+#endif /* ITT_PLATFORM_WIN */
+
+#ifndef ITT_PLATFORM_POSIX
+# define ITT_PLATFORM_POSIX 2
+#endif /* ITT_PLATFORM_POSIX */
+
+#ifndef ITT_PLATFORM
+# if ITT_OS==ITT_OS_WIN
+# define ITT_PLATFORM ITT_PLATFORM_WIN
+# else
+# define ITT_PLATFORM ITT_PLATFORM_POSIX
+# endif /* _WIN32 */
+#endif /* ITT_PLATFORM */
+
+#include <stddef.h>
+#include <stdarg.h>
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <tchar.h>
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef CDECL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define CDECL __cdecl
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define CDECL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* CDECL */
+
+#ifndef STDCALL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define STDCALL __stdcall
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define STDCALL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI CDECL
+#define LIBITTAPI /* nothing */
+
+#define ITT_JOIN_AUX(p,n) p##n
+#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n)
+
+#ifndef INTEL_ITTNOTIFY_PREFIX
+# define INTEL_ITTNOTIFY_PREFIX __itt_
+#endif /* INTEL_ITTNOTIFY_PREFIX */
+#ifndef INTEL_ITTNOTIFY_POSTFIX
+# define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#endif /* INTEL_ITTNOTIFY_POSTFIX */
+
+#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+#define ITTNOTIFY_NAME(n) ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))
+
+#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)
+#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)
+
+#ifdef ITT_STUB
+#undef ITT_STUB
+#endif
+#ifdef ITT_STUBV
+#undef ITT_STUBV
+#endif
+#define ITT_STUBV(api,type,name,args,params) \
+ typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args; \
+ extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);
+#define ITT_STUB ITT_STUBV
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+/** @endcond */
+
+/**
+ * @defgroup legacy Legacy API
+ * @{
+ * @}
+ */
+
+/**
+ * @defgroup legacy_control Collection Control
+ * @ingroup legacy
+ * General behavior: application continues to run, but no profiling information is being collected
+ *
+ * Pausing occurs not only for the current thread but for all process as well as spawned processes
+ * - Intel(R) Parallel Inspector:
+ * - Does not analyze or report errors that involve memory access.
+ * - Other errors are reported as usual. Pausing data collection in
+ * Intel(R) Parallel Inspector only pauses tracing and analyzing
+ * memory access. It does not pause tracing or analyzing threading APIs.
+ * .
+ * - Intel(R) Parallel Amplifier:
+ * - Does continue to record when new threads are started.
+ * .
+ * - Other effects:
+ * - Possible reduction of runtime overhead.
+ * .
+ * @{
+ */
+#ifndef _ITTNOTIFY_H_
+/** @brief Pause collection */
+void ITTAPI __itt_pause(void);
+/** @brief Resume collection */
+void ITTAPI __itt_resume(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, pause, (void), ())
+ITT_STUBV(ITTAPI, void, resume, (void), ())
+#define __itt_pause ITTNOTIFY_VOID(pause)
+#define __itt_pause_ptr ITTNOTIFY_NAME(pause)
+#define __itt_resume ITTNOTIFY_VOID(resume)
+#define __itt_resume_ptr ITTNOTIFY_NAME(resume)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_pause()
+#define __itt_pause_ptr 0
+#define __itt_resume()
+#define __itt_resume_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_pause_ptr 0
+#define __itt_resume_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+#endif /* _ITTNOTIFY_H_ */
+/** @} legacy_control group */
+
+/**
+ * @defgroup legacy_threads Threads
+ * @ingroup legacy
+ * Threads group
+ * @warning Legacy API
+ * @{
+ */
+/**
+ * @deprecated Legacy API
+ * @brief Set name to be associated with thread in analysis GUI.
+ * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched)
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int LIBITTAPI __itt_thr_name_setA(const char *name, int namelen);
+int LIBITTAPI __itt_thr_name_setW(const wchar_t *name, int namelen);
+#ifdef UNICODE
+# define __itt_thr_name_set __itt_thr_name_setW
+# define __itt_thr_name_set_ptr __itt_thr_name_setW_ptr
+#else
+# define __itt_thr_name_set __itt_thr_name_setA
+# define __itt_thr_name_set_ptr __itt_thr_name_setA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int LIBITTAPI __itt_thr_name_set(const char *name, int namelen);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, thr_name_setA, (const char *name, int namelen), (name, namelen))
+ITT_STUB(LIBITTAPI, int, thr_name_setW, (const wchar_t *name, int namelen), (name, namelen))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, thr_name_set, (const char *name, int namelen), (name, namelen))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thr_name_setA ITTNOTIFY_DATA(thr_name_setA)
+#define __itt_thr_name_setA_ptr ITTNOTIFY_NAME(thr_name_setA)
+#define __itt_thr_name_setW ITTNOTIFY_DATA(thr_name_setW)
+#define __itt_thr_name_setW_ptr ITTNOTIFY_NAME(thr_name_setW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thr_name_set ITTNOTIFY_DATA(thr_name_set)
+#define __itt_thr_name_set_ptr ITTNOTIFY_NAME(thr_name_set)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thr_name_setA(name, namelen)
+#define __itt_thr_name_setA_ptr 0
+#define __itt_thr_name_setW(name, namelen)
+#define __itt_thr_name_setW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thr_name_set(name, namelen)
+#define __itt_thr_name_set_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thr_name_setA_ptr 0
+#define __itt_thr_name_setW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thr_name_set_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Mark current thread as ignored from this point on, for the duration of its existence.
+ */
+void LIBITTAPI __itt_thr_ignore(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, thr_ignore, (void), ())
+#define __itt_thr_ignore ITTNOTIFY_VOID(thr_ignore)
+#define __itt_thr_ignore_ptr ITTNOTIFY_NAME(thr_ignore)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_thr_ignore()
+#define __itt_thr_ignore_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_thr_ignore_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_threads group */
+
+/**
+ * @defgroup legacy_sync Synchronization
+ * @ingroup legacy
+ * Synchronization group
+ * @warning Legacy API
+ * @{
+ */
+/**
+ * @hideinitializer
+ * @brief possible value of attribute argument for sync object type
+ */
+#define __itt_attr_barrier 1
+
+/**
+ * @hideinitializer
+ * @brief possible value of attribute argument for sync object type
+ */
+#define __itt_attr_mutex 2
+
+/**
+ * @deprecated Legacy API
+ * @brief Assign a name to a sync object using char or Unicode string
+ * @param[in] addr - pointer to the sync object. You should use a real pointer to your object
+ * to make sure that the values don't clash with other object addresses
+ * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will
+ * be assumed to be of generic "User Synchronization" type
+ * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned
+ * to the object -- you can use the __itt_sync_rename call later to assign
+ * the name
+ * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the
+ * exact semantics of how prepare/acquired/releasing calls work.
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_sync_set_nameA(void *addr, const char *objtype, const char *objname, int attribute);
+void ITTAPI __itt_sync_set_nameW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);
+#ifdef UNICODE
+# define __itt_sync_set_name __itt_sync_set_nameW
+# define __itt_sync_set_name_ptr __itt_sync_set_nameW_ptr
+#else /* UNICODE */
+# define __itt_sync_set_name __itt_sync_set_nameA
+# define __itt_sync_set_name_ptr __itt_sync_set_nameA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_sync_set_name(void *addr, const char* objtype, const char* objname, int attribute);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute))
+ITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (addr, objtype, objname, attribute))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_set_name, (void *addr, const char *objtype, const char *objname, int attribute), (addr, objtype, objname, attribute))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_set_nameA ITTNOTIFY_VOID(sync_set_nameA)
+#define __itt_sync_set_nameA_ptr ITTNOTIFY_NAME(sync_set_nameA)
+#define __itt_sync_set_nameW ITTNOTIFY_VOID(sync_set_nameW)
+#define __itt_sync_set_nameW_ptr ITTNOTIFY_NAME(sync_set_nameW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_set_name ITTNOTIFY_VOID(sync_set_name)
+#define __itt_sync_set_name_ptr ITTNOTIFY_NAME(sync_set_name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_set_nameA(addr, objtype, objname, attribute)
+#define __itt_sync_set_nameA_ptr 0
+#define __itt_sync_set_nameW(addr, objtype, objname, attribute)
+#define __itt_sync_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_set_name(addr, objtype, objname, attribute)
+#define __itt_sync_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_set_nameA_ptr 0
+#define __itt_sync_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Assign a name and type to a sync object using char or Unicode string
+ * @param[in] addr - pointer to the sync object. You should use a real pointer to your object
+ * to make sure that the values don't clash with other object addresses
+ * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will
+ * be assumed to be of generic "User Synchronization" type
+ * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned
+ * to the object -- you can use the __itt_sync_rename call later to assign
+ * the name
+ * @param[in] typelen, namelen - a lenght of string for appropriate objtype and objname parameter
+ * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the
+ * exact semantics of how prepare/acquired/releasing calls work.
+ * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched)
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int LIBITTAPI __itt_notify_sync_nameA(void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute);
+int LIBITTAPI __itt_notify_sync_nameW(void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute);
+#ifdef UNICODE
+# define __itt_notify_sync_name __itt_notify_sync_nameW
+#else
+# define __itt_notify_sync_name __itt_notify_sync_nameA
+#endif
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int LIBITTAPI __itt_notify_sync_name(void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute), (addr, objtype, typelen, objname, namelen, attribute))
+ITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute), (addr, objtype, typelen, objname, namelen, attribute))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, notify_sync_name, (void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute), (addr, objtype, typelen, objname, namelen, attribute))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_notify_sync_nameA ITTNOTIFY_DATA(notify_sync_nameA)
+#define __itt_notify_sync_nameA_ptr ITTNOTIFY_NAME(notify_sync_nameA)
+#define __itt_notify_sync_nameW ITTNOTIFY_DATA(notify_sync_nameW)
+#define __itt_notify_sync_nameW_ptr ITTNOTIFY_NAME(notify_sync_nameW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_notify_sync_name ITTNOTIFY_DATA(notify_sync_name)
+#define __itt_notify_sync_name_ptr ITTNOTIFY_NAME(notify_sync_name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_notify_sync_nameA(addr, objtype, typelen, objname, namelen, attribute)
+#define __itt_notify_sync_nameA_ptr 0
+#define __itt_notify_sync_nameW(addr, objtype, typelen, objname, namelen, attribute)
+#define __itt_notify_sync_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_notify_sync_name(addr, objtype, typelen, objname, namelen, attribute)
+#define __itt_notify_sync_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_notify_sync_nameA_ptr 0
+#define __itt_notify_sync_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_notify_sync_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Enter spin loop on user-defined sync object
+ */
+void LIBITTAPI __itt_notify_sync_prepare(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_prepare, (void *addr), (addr))
+#define __itt_notify_sync_prepare ITTNOTIFY_VOID(notify_sync_prepare)
+#define __itt_notify_sync_prepare_ptr ITTNOTIFY_NAME(notify_sync_prepare)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_prepare(addr)
+#define __itt_notify_sync_prepare_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_prepare_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Quit spin loop without acquiring spin object
+ */
+void LIBITTAPI __itt_notify_sync_cancel(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_cancel, (void *addr), (addr))
+#define __itt_notify_sync_cancel ITTNOTIFY_VOID(notify_sync_cancel)
+#define __itt_notify_sync_cancel_ptr ITTNOTIFY_NAME(notify_sync_cancel)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_cancel(addr)
+#define __itt_notify_sync_cancel_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_cancel_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Successful spin loop completion (sync object acquired)
+ */
+void LIBITTAPI __itt_notify_sync_acquired(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_acquired, (void *addr), (addr))
+#define __itt_notify_sync_acquired ITTNOTIFY_VOID(notify_sync_acquired)
+#define __itt_notify_sync_acquired_ptr ITTNOTIFY_NAME(notify_sync_acquired)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_acquired(addr)
+#define __itt_notify_sync_acquired_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_acquired_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Start sync object releasing code. Is called before the lock release call.
+ */
+void LIBITTAPI __itt_notify_sync_releasing(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *addr), (addr))
+#define __itt_notify_sync_releasing ITTNOTIFY_VOID(notify_sync_releasing)
+#define __itt_notify_sync_releasing_ptr ITTNOTIFY_NAME(notify_sync_releasing)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_releasing(addr)
+#define __itt_notify_sync_releasing_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_releasing_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_sync group */
+
+#ifndef _ITTNOTIFY_H_
+/**
+ * @defgroup legacy_events Events
+ * @ingroup legacy
+ * Events group
+ * @{
+ */
+
+/** @brief user event type */
+typedef int __itt_event;
+
+/**
+ * @brief Create an event notification
+ * @note name or namelen being null/name and namelen not matching, user event feature not enabled
+ * @return non-zero event identifier upon success and __itt_err otherwise
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_event LIBITTAPI __itt_event_createA(const char *name, int namelen);
+__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen);
+#ifdef UNICODE
+# define __itt_event_create __itt_event_createW
+# define __itt_event_create_ptr __itt_event_createW_ptr
+#else
+# define __itt_event_create __itt_event_createA
+# define __itt_event_create_ptr __itt_event_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char *name, int namelen), (name, namelen))
+ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen), (name, namelen))
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, __itt_event, event_create, (const char *name, int namelen), (name, namelen))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA ITTNOTIFY_DATA(event_createA)
+#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA)
+#define __itt_event_createW ITTNOTIFY_DATA(event_createW)
+#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create ITTNOTIFY_DATA(event_create)
+#define __itt_event_create_ptr ITTNOTIFY_NAME(event_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA(name, namelen) (__itt_event)0
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW(name, namelen) (__itt_event)0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create(name, namelen) (__itt_event)0
+#define __itt_event_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an event occurrence.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_start(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event), (event))
+#define __itt_event_start ITTNOTIFY_DATA(event_start)
+#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_event_start(event) (int)0
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an event end occurrence.
+ * @note It is optional if events do not have durations.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_end(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event), (event))
+#define __itt_event_end ITTNOTIFY_DATA(event_end)
+#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_event_end(event) (int)0
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_events group */
+#endif /* _ITTNOTIFY_H_ */
+
+/**
+ * @defgroup legacy_memory Memory Accesses
+ * @ingroup legacy
+ */
+
+/**
+ * @deprecated Legacy API
+ * @brief Inform the tool of memory accesses on reading
+ */
+void LIBITTAPI __itt_memory_read(void *addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, memory_read, (void *addr, size_t size), (addr, size))
+#define __itt_memory_read ITTNOTIFY_VOID(memory_read)
+#define __itt_memory_read_ptr ITTNOTIFY_NAME(memory_read)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_memory_read(addr, size)
+#define __itt_memory_read_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_memory_read_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Inform the tool of memory accesses on writing
+ */
+void LIBITTAPI __itt_memory_write(void *addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, memory_write, (void *addr, size_t size), (addr, size))
+#define __itt_memory_write ITTNOTIFY_VOID(memory_write)
+#define __itt_memory_write_ptr ITTNOTIFY_NAME(memory_write)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_memory_write(addr, size)
+#define __itt_memory_write_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_memory_write_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Inform the tool of memory accesses on updating
+ */
+void LIBITTAPI __itt_memory_update(void *address, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size), (addr, size))
+#define __itt_memory_update ITTNOTIFY_VOID(memory_update)
+#define __itt_memory_update_ptr ITTNOTIFY_NAME(memory_update)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_memory_update(addr, size)
+#define __itt_memory_update_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_memory_update_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_memory group */
+
+/**
+ * @defgroup legacy_state Thread and Object States
+ * @ingroup legacy
+ */
+
+/** @brief state type */
+typedef int __itt_state_t;
+
+/** @cond exclude_from_documentation */
+typedef enum __itt_obj_state {
+ __itt_obj_state_err = 0,
+ __itt_obj_state_clr = 1,
+ __itt_obj_state_set = 2,
+ __itt_obj_state_use = 3
+} __itt_obj_state_t;
+
+typedef enum __itt_thr_state {
+ __itt_thr_state_err = 0,
+ __itt_thr_state_clr = 1,
+ __itt_thr_state_set = 2
+} __itt_thr_state_t;
+
+typedef enum __itt_obj_prop {
+ __itt_obj_prop_watch = 1,
+ __itt_obj_prop_ignore = 2,
+ __itt_obj_prop_sharable = 3
+} __itt_obj_prop_t;
+
+typedef enum __itt_thr_prop {
+ __itt_thr_prop_quiet = 1
+} __itt_thr_prop_t;
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object states
+ */
+__itt_state_t LIBITTAPI __itt_state_get(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_state_t, state_get, (void), ())
+#define __itt_state_get ITTNOTIFY_DATA(state_get)
+#define __itt_state_get_ptr ITTNOTIFY_NAME(state_get)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_state_get(void) (__itt_state_t)0
+#define __itt_state_get_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_state_get_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object states
+ */
+__itt_state_t LIBITTAPI __itt_state_set(__itt_state_t s);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_state_t, state_set, (__itt_state_t s), (s))
+#define __itt_state_set ITTNOTIFY_DATA(state_set)
+#define __itt_state_set_ptr ITTNOTIFY_NAME(state_set)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_state_set(s) (__itt_state_t)0
+#define __itt_state_set_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_state_set_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object modes
+ */
+__itt_thr_state_t LIBITTAPI __itt_thr_mode_set(__itt_thr_prop_t p, __itt_thr_state_t s);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s), (p, s))
+#define __itt_thr_mode_set ITTNOTIFY_DATA(thr_mode_set)
+#define __itt_thr_mode_set_ptr ITTNOTIFY_NAME(thr_mode_set)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_thr_mode_set(p, s) (__itt_thr_state_t)0
+#define __itt_thr_mode_set_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_thr_mode_set_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object modes
+ */
+__itt_obj_state_t LIBITTAPI __itt_obj_mode_set(__itt_obj_prop_t p, __itt_obj_state_t s);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s), (p, s))
+#define __itt_obj_mode_set ITTNOTIFY_DATA(obj_mode_set)
+#define __itt_obj_mode_set_ptr ITTNOTIFY_NAME(obj_mode_set)
+#else /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_obj_mode_set(p, s) (__itt_obj_state_t)0
+#define __itt_obj_mode_set_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else /* INTEL_NO_MACRO_BODY */
+#define __itt_obj_mode_set_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_state group */
+
+/** @cond exclude_from_documentation */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/** @endcond */
+
+#endif /* _LEGACY_ITTNOTIFY_H_ */
diff --git a/src/tbb/tools_api/prototype/ittnotify.h b/src/tbb/tools_api/prototype/ittnotify.h
new file mode 100644
index 0000000..89fb5cf
--- /dev/null
+++ b/src/tbb/tools_api/prototype/ittnotify.h
@@ -0,0 +1,148 @@
+/*
+ Copyright 2005-2010 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 _PROTOTYPE_ITTNOTIFY_H_
+#define _PROTOTYPE_ITTNOTIFY_H_
+/**
+ * @file
+ * @brief Prototype User API functions and types
+ */
+
+/** @cond exclude_from_documentation */
+#ifndef ITT_OS_WIN
+# define ITT_OS_WIN 1
+#endif /* ITT_OS_WIN */
+
+#ifndef ITT_OS_LINUX
+# define ITT_OS_LINUX 2
+#endif /* ITT_OS_LINUX */
+
+#ifndef ITT_OS_MAC
+# define ITT_OS_MAC 3
+#endif /* ITT_OS_MAC */
+
+#ifndef ITT_OS
+# if defined WIN32 || defined _WIN32
+# define ITT_OS ITT_OS_WIN
+# elif defined( __APPLE__ ) && defined( __MACH__ )
+# define ITT_OS ITT_OS_MAC
+# else
+# define ITT_OS ITT_OS_LINUX
+# endif
+#endif /* ITT_OS */
+
+#ifndef ITT_PLATFORM_WIN
+# define ITT_PLATFORM_WIN 1
+#endif /* ITT_PLATFORM_WIN */
+
+#ifndef ITT_PLATFORM_POSIX
+# define ITT_PLATFORM_POSIX 2
+#endif /* ITT_PLATFORM_POSIX */
+
+#ifndef ITT_PLATFORM
+# if ITT_OS==ITT_OS_WIN
+# define ITT_PLATFORM ITT_PLATFORM_WIN
+# else
+# define ITT_PLATFORM ITT_PLATFORM_POSIX
+# endif /* _WIN32 */
+#endif /* ITT_PLATFORM */
+
+#include <stddef.h>
+#include <stdarg.h>
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <tchar.h>
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef CDECL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define CDECL __cdecl
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define CDECL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* CDECL */
+
+#ifndef STDCALL
+# if ITT_PLATFORM==ITT_PLATFORM_WIN
+# define STDCALL __stdcall
+# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+# define STDCALL /* nothing */
+# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI_CALL CDECL
+#define LIBITTAPI_CALL /* nothing */
+
+#define ITT_JOIN_AUX(p,n) p##n
+#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n)
+
+#ifndef INTEL_ITTNOTIFY_PREFIX
+# define INTEL_ITTNOTIFY_PREFIX __itt_
+#endif /* INTEL_ITTNOTIFY_PREFIX */
+#ifndef INTEL_ITTNOTIFY_POSTFIX
+# define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#endif /* INTEL_ITTNOTIFY_POSTFIX */
+
+#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+#define ITTNOTIFY_NAME(n) ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))
+
+#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)
+#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)
+
+#ifdef ITT_STUB
+#undef ITT_STUB
+#endif
+#ifdef ITT_STUBV
+#undef ITT_STUBV
+#endif
+#define ITT_STUBV(api,type,name,args,params) \
+ typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args; \
+ extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);
+#define ITT_STUB ITT_STUBV
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+/** @endcond */
+
+/**
+ * @defgroup prototype Prototype API
+ * @{
+ * @}
+ */
+
+/****************************************************************************
+ * ??? group
+ ****************************************************************************/
+
+/** @cond exclude_from_documentation */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/** @endcond */
+
+#endif /* _PROTOTYPE_ITTNOTIFY_H_ */
diff --git a/src/tbb/win32-tbb-export.def b/src/tbb/win32-tbb-export.def
index 3bf5fc2..8a8ead2 100644
--- a/src/tbb/win32-tbb-export.def
+++ b/src/tbb/win32-tbb-export.def
@@ -58,7 +58,7 @@ __TBB_machine_trylockbyte
?allocate at allocate_child_proxy@internal at tbb@@QBEAAVtask at 3@I at Z
?allocate at allocate_continuation_proxy@internal at tbb@@QBEAAVtask at 3@I at Z
?allocate at allocate_root_proxy@internal at tbb@@SAAAVtask at 3@I at Z
-?destroy at task@tbb@@QAEXAAV12@@Z
+?destroy at task_base@internal at interface5@tbb@@SAXAAVtask at 4@@Z
?free at allocate_additional_child_of_proxy@internal at tbb@@QBEXAAVtask at 3@@Z
?free at allocate_child_proxy@internal at tbb@@QBEXAAVtask at 3@@Z
?free at allocate_continuation_proxy@internal at tbb@@QBEXAAVtask at 3@@Z
@@ -76,8 +76,13 @@ __TBB_machine_trylockbyte
?terminate at task_scheduler_init@tbb@@QAEXXZ
?observe at task_scheduler_observer_v3@internal at tbb@@QAEX_N at Z
+#if !TBB_NO_LEGACY
+; task_v2.cpp
+?destroy at task@tbb@@QAEXAAV12@@Z
+#endif
+
; exception handling support
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
?allocate at allocate_root_with_context_proxy@internal at tbb@@QBEAAVtask at 3@I at Z
?free at allocate_root_with_context_proxy@internal at tbb@@QBEXAAVtask at 3@@Z
?is_group_execution_cancelled at task_group_context@tbb@@QBE_NXZ
@@ -93,7 +98,7 @@ __TBB_machine_trylockbyte
?destroy at captured_exception@tbb@@UAEXXZ
?set at captured_exception@tbb@@QAEXPBD0 at Z
?clear at captured_exception@tbb@@QAEXXZ
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
; Symbols for exceptions thrown from TBB
?throw_bad_last_alloc_exception_v4 at internal@tbb@@YAXXZ
@@ -126,7 +131,7 @@ TBB_runtime_interface_version
?clear at pipeline@tbb@@QAEXXZ
?inject_token at pipeline@tbb@@AAEXAAVtask at 2@@Z
?run at pipeline@tbb@@QAEXI at Z
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
?run at pipeline@tbb@@QAEXIAAVtask_group_context at 2@@Z
#endif
?process_item at thread_bound_filter@tbb@@QAE?AW4result_type at 12@XZ
@@ -140,6 +145,19 @@ TBB_runtime_interface_version
?upgrade_to_writer at scoped_lock@queuing_rw_mutex at tbb@@QAE_NXZ
?try_acquire at scoped_lock@queuing_rw_mutex at tbb@@QAE_NAAV23 at _N@Z
+; reader_writer_lock.cpp
+?try_lock_read at reader_writer_lock@interface5 at tbb@@QAE_NXZ
+?try_lock at reader_writer_lock@interface5 at tbb@@QAE_NXZ
+?unlock at reader_writer_lock@interface5 at tbb@@QAEXXZ
+?lock_read at reader_writer_lock@interface5 at tbb@@QAEXXZ
+?lock at reader_writer_lock@interface5 at tbb@@QAEXXZ
+?internal_construct at reader_writer_lock@interface5 at tbb@@AAEXXZ
+?internal_destroy at reader_writer_lock@interface5 at tbb@@AAEXXZ
+?internal_construct at scoped_lock@reader_writer_lock at interface5@tbb@@AAEXAAV234@@Z
+?internal_destroy at scoped_lock@reader_writer_lock at interface5@tbb@@AAEXXZ
+?internal_construct at scoped_lock_read@reader_writer_lock at interface5@tbb@@AAEXAAV234@@Z
+?internal_destroy at scoped_lock_read@reader_writer_lock at interface5@tbb@@AAEXXZ
+
#if !TBB_NO_LEGACY
; spin_rw_mutex.cpp v2
?internal_acquire_reader at spin_rw_mutex@tbb@@CAXPAV12@@Z
@@ -215,6 +233,7 @@ TBB_runtime_interface_version
; concurrent_queue v3
??1concurrent_queue_iterator_base_v3 at internal@tbb@@IAE at XZ
??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAE at ABVconcurrent_queue_base_v3@12@@Z
+??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAE at ABVconcurrent_queue_base_v3@12 at I@Z
?advance at concurrent_queue_iterator_base_v3@internal at tbb@@IAEXXZ
?assign at concurrent_queue_iterator_base_v3@internal at tbb@@IAEXABV123@@Z
??0concurrent_queue_base_v3 at internal@tbb@@IAE at I@Z
@@ -269,3 +288,10 @@ TBB_runtime_interface_version
?thread_sleep_v3 at internal@tbb@@YAXABVinterval_t at tick_count@2@@Z
?move_v3 at internal@tbb@@YAXAAVtbb_thread_v3 at 12@0 at Z
?thread_get_id_v3 at internal@tbb@@YA?AVid at tbb_thread_v3@12 at XZ
+
+; condition_variable
+?internal_initialize_condition_variable at internal@interface5 at tbb@@YAXAATcondvar_impl_t at 123@@Z
+?internal_condition_variable_wait at internal@interface5 at tbb@@YA_NAATcondvar_impl_t at 123@PAVmutex at 3@PBVinterval_t at tick_count@3@@Z
+?internal_condition_variable_notify_one at internal@interface5 at tbb@@YAXAATcondvar_impl_t at 123@@Z
+?internal_condition_variable_notify_all at internal@interface5 at tbb@@YAXAATcondvar_impl_t at 123@@Z
+?internal_destroy_condition_variable at internal@interface5 at tbb@@YAXAATcondvar_impl_t at 123@@Z
diff --git a/src/tbb/win64-tbb-export.def b/src/tbb/win64-tbb-export.def
index 9876901..1ca8ed7 100644
--- a/src/tbb/win64-tbb-export.def
+++ b/src/tbb/win64-tbb-export.def
@@ -55,7 +55,7 @@ __TBB_machine_pause
?allocate at allocate_child_proxy@internal at tbb@@QEBAAEAVtask at 3@_K at Z
?allocate at allocate_continuation_proxy@internal at tbb@@QEBAAEAVtask at 3@_K at Z
?allocate at allocate_root_proxy@internal at tbb@@SAAEAVtask at 3@_K at Z
-?destroy at task@tbb@@QEAAXAEAV12@@Z
+?destroy at task_base@internal at interface5@tbb@@SAXAEAVtask at 4@@Z
?free at allocate_additional_child_of_proxy@internal at tbb@@QEBAXAEAVtask at 3@@Z
?free at allocate_child_proxy@internal at tbb@@QEBAXAEAVtask at 3@@Z
?free at allocate_continuation_proxy@internal at tbb@@QEBAXAEAVtask at 3@@Z
@@ -72,8 +72,13 @@ __TBB_machine_pause
?terminate at task_scheduler_init@tbb@@QEAAXXZ
?observe at task_scheduler_observer_v3@internal at tbb@@QEAAX_N at Z
+#if !TBB_NO_LEGACY
+; task_v2.cpp
+?destroy at task@tbb@@QEAAXAEAV12@@Z
+#endif
+
; Exception handling in task scheduler
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
?allocate at allocate_root_with_context_proxy@internal at tbb@@QEBAAEAVtask at 3@_K at Z
?free at allocate_root_with_context_proxy@internal at tbb@@QEBAXAEAVtask at 3@@Z
?is_group_execution_cancelled at task_group_context@tbb@@QEBA_NXZ
@@ -89,7 +94,7 @@ __TBB_machine_pause
?destroy at captured_exception@tbb@@UEAAXXZ
?set at captured_exception@tbb@@QEAAXPEBD0 at Z
?clear at captured_exception@tbb@@QEAAXXZ
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
; Symbols for exceptions thrown from TBB
?throw_bad_last_alloc_exception_v4 at internal@tbb@@YAXXZ
@@ -122,7 +127,7 @@ TBB_runtime_interface_version
?clear at pipeline@tbb@@QEAAXXZ
?inject_token at pipeline@tbb@@AEAAXAEAVtask at 2@@Z
?run at pipeline@tbb@@QEAAX_K at Z
-#if __TBB_EXCEPTIONS
+#if __TBB_TASK_GROUP_CONTEXT
?run at pipeline@tbb@@QEAAX_KAEAVtask_group_context at 2@@Z
#endif
?process_item at thread_bound_filter@tbb@@QEAA?AW4result_type at 12@XZ
@@ -136,6 +141,19 @@ TBB_runtime_interface_version
?upgrade_to_writer at scoped_lock@queuing_rw_mutex at tbb@@QEAA_NXZ
?try_acquire at scoped_lock@queuing_rw_mutex at tbb@@QEAA_NAEAV23 at _N@Z
+; reader_writer_lock.cpp
+?try_lock_read at reader_writer_lock@interface5 at tbb@@QEAA_NXZ
+?try_lock at reader_writer_lock@interface5 at tbb@@QEAA_NXZ
+?unlock at reader_writer_lock@interface5 at tbb@@QEAAXXZ
+?lock_read at reader_writer_lock@interface5 at tbb@@QEAAXXZ
+?lock at reader_writer_lock@interface5 at tbb@@QEAAXXZ
+?internal_construct at reader_writer_lock@interface5 at tbb@@AEAAXXZ
+?internal_destroy at reader_writer_lock@interface5 at tbb@@AEAAXXZ
+?internal_construct at scoped_lock@reader_writer_lock at interface5@tbb@@AEAAXAEAV234@@Z
+?internal_destroy at scoped_lock@reader_writer_lock at interface5@tbb@@AEAAXXZ
+?internal_construct at scoped_lock_read@reader_writer_lock at interface5@tbb@@AEAAXAEAV234@@Z
+?internal_destroy at scoped_lock_read@reader_writer_lock at interface5@tbb@@AEAAXXZ
+
#if !TBB_NO_LEGACY
; spin_rw_mutex.cpp v2
?internal_itt_releasing at spin_rw_mutex@tbb@@CAXPEAV12@@Z
@@ -210,6 +228,7 @@ TBB_runtime_interface_version
; concurrent_queue v3
??0concurrent_queue_iterator_base_v3 at internal@tbb@@IEAA at AEBVconcurrent_queue_base_v3@12@@Z
+??0concurrent_queue_iterator_base_v3 at internal@tbb@@IEAA at AEBVconcurrent_queue_base_v3@12 at _K@Z
??1concurrent_queue_iterator_base_v3 at internal@tbb@@IEAA at XZ
?assign at concurrent_queue_iterator_base_v3@internal at tbb@@IEAAXAEBV123@@Z
?advance at concurrent_queue_iterator_base_v3@internal at tbb@@IEAAXXZ
@@ -265,3 +284,10 @@ TBB_runtime_interface_version
?thread_get_id_v3 at internal@tbb@@YA?AVid at tbb_thread_v3@12 at XZ
?thread_sleep_v3 at internal@tbb@@YAXAEBVinterval_t at tick_count@2@@Z
?thread_yield_v3 at internal@tbb@@YAXXZ
+
+; condition_variable
+?internal_initialize_condition_variable at internal@interface5 at tbb@@YAXAEATcondvar_impl_t at 123@@Z
+?internal_condition_variable_wait at internal@interface5 at tbb@@YA_NAEATcondvar_impl_t at 123@PEAVmutex at 3@PEBVinterval_t at tick_count@3@@Z
+?internal_condition_variable_notify_one at internal@interface5 at tbb@@YAXAEATcondvar_impl_t at 123@@Z
+?internal_condition_variable_notify_all at internal@interface5 at tbb@@YAXAEATcondvar_impl_t at 123@@Z
+?internal_destroy_condition_variable at internal@interface5 at tbb@@YAXAEATcondvar_impl_t at 123@@Z
diff --git a/src/tbb/xbox360-tbb-export.def b/src/tbb/xbox360-tbb-export.def
new file mode 100644
index 0000000..ac5f14e
--- /dev/null
+++ b/src/tbb/xbox360-tbb-export.def
@@ -0,0 +1,234 @@
+; Copyright 2005-2010 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.
+
+EXPORTS
+
+; Assembly-language support that is called directly by clients
+;__TBB_machine_cmpswp1
+;__TBB_machine_cmpswp2
+;__TBB_machine_cmpswp4
+;__TBB_machine_cmpswp8
+;__TBB_machine_fetchadd1
+;__TBB_machine_fetchadd2
+;__TBB_machine_fetchadd4
+;__TBB_machine_fetchadd8
+;__TBB_machine_fetchstore1
+;__TBB_machine_fetchstore2
+;__TBB_machine_fetchstore4
+;__TBB_machine_fetchstore8
+;__TBB_machine_store8
+;__TBB_machine_load8
+;__TBB_machine_trylockbyte
+
+; cache_aligned_allocator.cpp
+?NFS_Allocate at internal@tbb@@YAPAXIIPAX at Z @1
+?NFS_GetLineSize at internal@tbb@@YAIXZ @2
+?NFS_Free at internal@tbb@@YAXPAX at Z @3
+?allocate_via_handler_v3 at internal@tbb@@YAPAXI at Z @4
+?deallocate_via_handler_v3 at internal@tbb@@YAXPAX at Z @5
+?is_malloc_used_v3 at internal@tbb@@YA_NXZ @6
+
+; task.cpp v3
+?allocate at allocate_additional_child_of_proxy@internal at tbb@@QBAAAVtask at 3@I at Z @7
+?allocate at allocate_child_proxy@internal at tbb@@QBAAAVtask at 3@I at Z @8
+?allocate at allocate_continuation_proxy@internal at tbb@@QBAAAVtask at 3@I at Z @9
+?allocate at allocate_root_proxy@internal at tbb@@SAAAVtask at 3@I at Z @10
+?destroy at task@tbb@@QAAXAAV12@@Z @11
+?free at allocate_additional_child_of_proxy@internal at tbb@@QBAXAAVtask at 3@@Z @12
+?free at allocate_child_proxy@internal at tbb@@QBAXAAVtask at 3@@Z @13
+?free at allocate_continuation_proxy@internal at tbb@@QBAXAAVtask at 3@@Z @14
+?free at allocate_root_proxy@internal at tbb@@SAXAAVtask at 3@@Z @15
+?internal_set_ref_count at task@tbb@@AAAXH at Z @16
+?is_owned_by_current_thread at task@tbb@@QBA_NXZ @17
+?note_affinity at task@tbb@@UAAXG at Z @18
+?resize at affinity_partitioner_base_v3@internal at tbb@@AAAXI at Z @19
+?self at task@tbb@@SAAAV12 at XZ @20
+?spawn_and_wait_for_all at task@tbb@@QAAXAAVtask_list at 2@@Z @21
+?default_num_threads at task_scheduler_init@tbb@@SAHXZ @22
+?initialize at task_scheduler_init@tbb@@QAAXHI at Z @23
+?initialize at task_scheduler_init@tbb@@QAAXH at Z @24
+?terminate at task_scheduler_init@tbb@@QAAXXZ @25
+?observe at task_scheduler_observer_v3@internal at tbb@@QAAX_N at Z @26
+
+; exception handling support
+?allocate at allocate_root_with_context_proxy@internal at tbb@@QBAAAVtask at 3@I at Z @27
+?free at allocate_root_with_context_proxy@internal at tbb@@QBAXAAVtask at 3@@Z @28
+?is_group_execution_cancelled at task_group_context@tbb@@QBA_NXZ @29
+?cancel_group_execution at task_group_context@tbb@@QAA_NXZ @30
+?reset at task_group_context@tbb@@QAAXXZ @31
+?init at task_group_context@tbb@@IAAXXZ @32
+??1task_group_context at tbb@@QAA at XZ @33
+?name at captured_exception@tbb@@UBAPBDXZ @34
+?what at captured_exception@tbb@@UBAPBDXZ @35
+??1captured_exception at tbb@@UAA at XZ @36
+
+; tbb_misc.cpp
+?assertion_failure at tbb@@YAXPBDH00 at Z @37
+?get_initial_auto_partitioner_divisor at internal@tbb@@YAIXZ @38
+?handle_perror at internal@tbb@@YAXHPBD at Z @39
+?set_assertion_handler at tbb@@YAP6AXPBDH00 at ZP6AX0H00@Z at Z @40
+?runtime_warning at internal@tbb@@YAXPBDZZ @41
+
+; itt_notify.cpp
+?itt_load_pointer_with_acquire_v3 at internal@tbb@@YAPAXPBX at Z @42
+?itt_store_pointer_with_release_v3 at internal@tbb@@YAXPAX0 at Z @43
+
+; pipeline.cpp
+??0pipeline at tbb@@QAA at XZ @44
+??1filter at tbb@@UAA at XZ @45
+??1pipeline at tbb@@UAA at XZ @46
+??_7pipeline at tbb@@6B@ @47
+?add_filter at pipeline@tbb@@QAAXAAVfilter at 2@@Z @48
+?clear at pipeline@tbb@@QAAXXZ @49
+?inject_token at pipeline@tbb@@AAAXAAVtask at 2@@Z @50
+?run at pipeline@tbb@@QAAXI at Z @51
+
+; queuing_rw_mutex.cpp
+?acquire at scoped_lock@queuing_rw_mutex at tbb@@QAAXAAV23 at _N@Z @52
+?downgrade_to_reader at scoped_lock@queuing_rw_mutex at tbb@@QAA_NXZ @53
+?release at scoped_lock@queuing_rw_mutex at tbb@@QAAXXZ @54
+?upgrade_to_writer at scoped_lock@queuing_rw_mutex at tbb@@QAA_NXZ @55
+?try_acquire at scoped_lock@queuing_rw_mutex at tbb@@QAA_NAAV23 at _N@Z @56
+
+#if !TBB_NO_LEGACY
+; spin_rw_mutex.cpp v2
+?internal_acquire_reader at spin_rw_mutex@tbb@@CAXPAV12@@Z @57
+?internal_acquire_writer at spin_rw_mutex@tbb@@CA_NPAV12@@Z @58
+?internal_downgrade at spin_rw_mutex@tbb@@CAXPAV12@@Z @59
+?internal_itt_releasing at spin_rw_mutex@tbb@@CAXPAV12@@Z @60
+?internal_release_reader at spin_rw_mutex@tbb@@CAXPAV12@@Z @61
+?internal_release_writer at spin_rw_mutex@tbb@@CAXPAV12@@Z @62
+?internal_upgrade at spin_rw_mutex@tbb@@CA_NPAV12@@Z @63
+?internal_try_acquire_writer at spin_rw_mutex@tbb@@CA_NPAV12@@Z @64
+?internal_try_acquire_reader at spin_rw_mutex@tbb@@CA_NPAV12@@Z @65
+#endif
+
+; spin_rw_mutex v3
+?internal_upgrade at spin_rw_mutex_v3@tbb@@AAA_NXZ @66
+?internal_downgrade at spin_rw_mutex_v3@tbb@@AAAXXZ @67
+?internal_acquire_reader at spin_rw_mutex_v3@tbb@@AAAXXZ @68
+?internal_acquire_writer at spin_rw_mutex_v3@tbb@@AAA_NXZ @69
+?internal_release_reader at spin_rw_mutex_v3@tbb@@AAAXXZ @70
+?internal_release_writer at spin_rw_mutex_v3@tbb@@AAAXXZ @71
+?internal_try_acquire_reader at spin_rw_mutex_v3@tbb@@AAA_NXZ @72
+?internal_try_acquire_writer at spin_rw_mutex_v3@tbb@@AAA_NXZ @73
+
+; spin_mutex.cpp
+?internal_acquire at scoped_lock@spin_mutex at tbb@@AAAXAAV23@@Z @74
+?internal_release at scoped_lock@spin_mutex at tbb@@AAAXXZ @75
+?internal_try_acquire at scoped_lock@spin_mutex at tbb@@AAA_NAAV23@@Z @76
+
+; mutex.cpp
+?internal_acquire at scoped_lock@mutex at tbb@@AAAXAAV23@@Z @77
+?internal_release at scoped_lock@mutex at tbb@@AAAXXZ @78
+?internal_try_acquire at scoped_lock@mutex at tbb@@AAA_NAAV23@@Z @79
+?internal_construct at mutex@tbb@@AAAXXZ @80
+?internal_destroy at mutex@tbb@@AAAXXZ @81
+
+; recursive_mutex.cpp
+?internal_acquire at scoped_lock@recursive_mutex at tbb@@AAAXAAV23@@Z @82
+?internal_release at scoped_lock@recursive_mutex at tbb@@AAAXXZ @83
+?internal_try_acquire at scoped_lock@recursive_mutex at tbb@@AAA_NAAV23@@Z @84
+?internal_construct at recursive_mutex@tbb@@AAAXXZ @85
+?internal_destroy at recursive_mutex@tbb@@AAAXXZ @86
+
+; queuing_mutex.cpp
+?acquire at scoped_lock@queuing_mutex at tbb@@QAAXAAV23@@Z @87
+?release at scoped_lock@queuing_mutex at tbb@@QAAXXZ @88
+?try_acquire at scoped_lock@queuing_mutex at tbb@@QAA_NAAV23@@Z @89
+
+; concurrent_hash_map.cpp
+?internal_grow_predicate at hash_map_segment_base@internal at tbb@@QBA_NXZ @90
+
+#if !TBB_NO_LEGACY
+; concurrent_queue.cpp v2
+?advance at concurrent_queue_iterator_base@internal at tbb@@IAAXXZ @91
+?assign at concurrent_queue_iterator_base@internal at tbb@@IAAXABV123@@Z @92
+?internal_size at concurrent_queue_base@internal at tbb@@IBAHXZ @93
+??0concurrent_queue_base at internal@tbb@@IAA at I@Z @94
+??0concurrent_queue_iterator_base at internal@tbb@@IAA at ABVconcurrent_queue_base@12@@Z @95
+??1concurrent_queue_base at internal@tbb@@MAA at XZ @96
+??1concurrent_queue_iterator_base at internal@tbb@@IAA at XZ @97
+?internal_pop at concurrent_queue_base@internal at tbb@@IAAXPAX at Z @98
+?internal_pop_if_present at concurrent_queue_base@internal at tbb@@IAA_NPAX at Z @99
+?internal_push at concurrent_queue_base@internal at tbb@@IAAXPBX at Z @100
+?internal_push_if_not_full at concurrent_queue_base@internal at tbb@@IAA_NPBX at Z @101
+?internal_set_capacity at concurrent_queue_base@internal at tbb@@IAAXHI at Z @102
+#endif
+
+; concurrent_queue v3
+??1concurrent_queue_iterator_base_v3 at internal@tbb@@IAA at XZ @103
+??0concurrent_queue_iterator_base_v3 at internal@tbb@@IAA at ABVconcurrent_queue_base_v3@12@@Z @104
+?advance at concurrent_queue_iterator_base_v3@internal at tbb@@IAAXXZ @105
+?assign at concurrent_queue_iterator_base_v3@internal at tbb@@IAAXABV123@@Z @106
+??0concurrent_queue_base_v3 at internal@tbb@@IAA at I@Z @107
+??1concurrent_queue_base_v3 at internal@tbb@@MAA at XZ @108
+?internal_pop at concurrent_queue_base_v3@internal at tbb@@IAAXPAX at Z @109
+?internal_pop_if_present at concurrent_queue_base_v3@internal at tbb@@IAA_NPAX at Z @110
+?internal_push at concurrent_queue_base_v3@internal at tbb@@IAAXPBX at Z @111
+?internal_push_if_not_full at concurrent_queue_base_v3@internal at tbb@@IAA_NPBX at Z @112
+?internal_size at concurrent_queue_base_v3@internal at tbb@@IBAHXZ @113
+?internal_set_capacity at concurrent_queue_base_v3@internal at tbb@@IAAXHI at Z @114
+?internal_finish_clear at concurrent_queue_base_v3@internal at tbb@@IAAXXZ @115
+?internal_throw_exception at concurrent_queue_base_v3@internal at tbb@@IBAXXZ @116
+
+#if !TBB_NO_LEGACY
+; concurrent_vector.cpp v2
+?internal_assign at concurrent_vector_base@internal at tbb@@IAAXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z @117
+?internal_capacity at concurrent_vector_base@internal at tbb@@IBAIXZ @118
+?internal_clear at concurrent_vector_base@internal at tbb@@IAAXP6AXPAXI at Z_N@Z @119
+?internal_copy at concurrent_vector_base@internal at tbb@@IAAXABV123 at IP6AXPAXPBXI@Z at Z @120
+?internal_grow_by at concurrent_vector_base@internal at tbb@@IAAIIIP6AXPAXI at Z@Z @121
+?internal_grow_to_at_least at concurrent_vector_base@internal at tbb@@IAAXIIP6AXPAXI at Z@Z @122
+?internal_push_back at concurrent_vector_base@internal at tbb@@IAAPAXIAAI at Z @123
+?internal_reserve at concurrent_vector_base@internal at tbb@@IAAXIII at Z @124
+#endif
+
+; concurrent_vector v3
+??1concurrent_vector_base_v3 at internal@tbb@@IAA at XZ @125
+?internal_assign at concurrent_vector_base_v3@internal at tbb@@IAAXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z @126
+?internal_capacity at concurrent_vector_base_v3@internal at tbb@@IBAIXZ @127
+?internal_clear at concurrent_vector_base_v3@internal at tbb@@IAAIP6AXPAXI at Z@Z @128
+?internal_copy at concurrent_vector_base_v3@internal at tbb@@IAAXABV123 at IP6AXPAXPBXI@Z at Z @129
+?internal_grow_by at concurrent_vector_base_v3@internal at tbb@@IAAIIIP6AXPAXPBXI at Z1@Z @130
+?internal_grow_to_at_least at concurrent_vector_base_v3@internal at tbb@@IAAXIIP6AXPAXPBXI at Z1@Z @131
+?internal_push_back at concurrent_vector_base_v3@internal at tbb@@IAAPAXIAAI at Z @132
+?internal_reserve at concurrent_vector_base_v3@internal at tbb@@IAAXIII at Z @133
+?internal_compact at concurrent_vector_base_v3@internal at tbb@@IAAPAXIPAXP6AX0I at ZP6AX0PBXI@Z at Z @134
+?internal_swap at concurrent_vector_base_v3@internal at tbb@@IAAXAAV123@@Z @135
+?internal_throw_exception at concurrent_vector_base_v3@internal at tbb@@IBAXI at Z @136
+
+; tbb_thread
+?join at tbb_thread_v3@internal at tbb@@QAAXXZ @137
+?detach at tbb_thread_v3@internal at tbb@@QAAXXZ @138
+?internal_start at tbb_thread_v3@internal at tbb@@AAAXP6AIPAX at Z0@Z @139
+?allocate_closure_v3 at internal@tbb@@YAPAXI at Z @140
+?free_closure_v3 at internal@tbb@@YAXPAX at Z @141
+?hardware_concurrency at tbb_thread_v3@internal at tbb@@SAIXZ @142
+?thread_yield_v3 at internal@tbb@@YAXXZ @143
+?thread_sleep_v3 at internal@tbb@@YAXABVinterval_t at tick_count@2@@Z @144
+?move_v3 at internal@tbb@@YAXAAVtbb_thread_v3 at 12@0 at Z @145
+?thread_get_id_v3 at internal@tbb@@YA?AVid at tbb_thread_v3@12 at XZ @146
diff --git a/src/tbbmalloc/MemoryAllocator.cpp b/src/tbbmalloc/MemoryAllocator.cpp
index c048987..e11620d 100644
--- a/src/tbbmalloc/MemoryAllocator.cpp
+++ b/src/tbbmalloc/MemoryAllocator.cpp
@@ -51,11 +51,25 @@
#endif
+// 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 __sun || __SUNPRO_CC
+#define __asm__ asm
+#endif
+
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <new> /* for placement new */
+#if __TBB_HAS_INTRIN_H
+#include <intrin.h> /* for __cpuid */
+#endif
extern "C" {
void * scalable_malloc(size_t size);
@@ -214,7 +228,7 @@ const uint32_t numBlockBinLimit = 31;
/*
* The number of bins to cache large objects.
*/
-const uint32_t numLargeObjectBins = 1024; // for 1024 max cached size is near 8MB
+const uint32_t numLargeBlockBins = 1024; // for 1024 max cached size is near 8MB
/********* The data structures and global objects **************/
@@ -285,10 +299,16 @@ struct Bin {
MallocMutex mailLock;
};
+/*
+ * To decrease contention for free blocks, free blocks are split, and access
+ * to them is based on process number.
+ */
+const int numOfFreeBlockLists = 4;
+
/*
- * This is a LIFO linked list that one can init, push or pop from
+ * This is an array of LIFO linked lists that one can init, push or pop from
*/
-static LifoList freeBlockList;
+static LifoList freeBlockList[numOfFreeBlockLists];
/*
* When a block that is not completely free is returned for reuse by other threads
@@ -305,14 +325,14 @@ static LifoList* globalSizeBins = (LifoList*)globalBinSpace;
* threads memory that are likely in local cache(s) of our CPU.
*/
class FreeBlockPool {
- static const int POOL_HIGH_MARK = 32;
- static const int POOL_LOW_MARK = 8;
-
Block *head;
Block *tail;
int size;
void insertBlock(Block *block);
public:
+ static const int POOL_HIGH_MARK = 32;
+ static const int POOL_LOW_MARK = 8;
+
Block *getBlock();
void returnBlock(Block *block);
void releaseAllBlocks();
@@ -324,55 +344,56 @@ struct TLSData {
};
-struct LargeObjectHeader {
- void *unalignedResult; /* The address obtained from and returned to the OS */
- size_t unalignedSize; /* The size that was requested from getMemory */
- size_t objectSize; /* The size originally requested by a client */
- bool fromMapMemory; /* True if allocated with MapMemory usage enforced */
- BackRefIdx backRefIdx;
-};
-
-static struct LargeObjectCacheStat {
+static struct LargeBlockCacheStat {
uintptr_t age;
size_t cacheSize;
} loCacheStat;
-struct CachedObject {
- CachedObject *next,
- *prev;
- uintptr_t age;
- bool fromMapMemory;
- BackRefIdx backRefIdx;
+struct LargeMemoryBlock {
+ LargeMemoryBlock *next, // ptrs in list of cached blocks
+ *prev;
+ 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
};
-class CachedObjectsList {
- CachedObject *first,
- *last;
- /* age of an oldest object in the list; equal to last->age, if last defined,
+struct LargeObjectHdr {
+ LargeMemoryBlock *memoryBlock;
+ /* Backreference points to LargeObjectHdr.
+ Duplicated in LargeMemoryBlock to reuse in subsequent allocations. */
+ BackRefIdx backRefIdx;
+};
+
+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 objects of a particular size.
+ /* Current threshold value for the blocks of a particular size.
Set on cache miss. */
uintptr_t ageThreshold;
MallocMutex lock;
- /* CachedObjectsList should be placed in zero-initialized memory,
+ /* CachedBlocksList should be placed in zero-initialized memory,
ctor not needed. */
- CachedObjectsList();
+ CachedBlocksList();
public:
- inline void push(void *buf, bool fromMapMemory, BackRefIdx backRefIdx, uintptr_t currAge);
- inline CachedObject* pop(uintptr_t currAge);
+ inline void push(LargeMemoryBlock* ptr);
+ inline LargeMemoryBlock* pop();
void releaseLastIfOld(uintptr_t currAge, size_t size);
};
/*
- * Array of bins with lists of recently freed objects cached for re-use.
+ * Array of bins with lists of recently freed large objects cached for re-use.
*/
-static char globalCachedObjectBinsSpace[sizeof(CachedObjectsList)*numLargeObjectBins];
-static CachedObjectsList* globalCachedObjectBins = (CachedObjectsList*)globalCachedObjectBinsSpace;
+static char globalCachedBlockBinsSpace[sizeof(CachedBlocksList)*numLargeBlockBins];
+static CachedBlocksList* globalCachedBlockBins = (CachedBlocksList*)globalCachedBlockBinsSpace;
/********* End of the data structures **************/
@@ -433,12 +454,12 @@ const uint32_t minLargeObjectSize = fittingSize5 + 1;
const unsigned int startupAllocObjSizeMark = ~(unsigned int)0;
/*
- * Difference between object sizes in large object bins
+ * Difference between object sizes in large block bins
*/
-const uint32_t largeObjectCacheStep = 8*1024;
+const uint32_t largeBlockCacheStep = 8*1024;
/*
- * Object cache cleanup frequency.
+ * Large blocks cache cleanup frequency.
* It should be power of 2 for the fast checking.
*/
const unsigned cacheCleanupFreq = 256;
@@ -523,11 +544,11 @@ static inline void setThreadMallocTLS( TLSData * newvalue ) {
#if USE_MALLOC_FOR_LARGE_OBJECT
// (get|free)RawMemory only necessary for the USE_MALLOC_FOR_LARGE_OBJECT case
-static inline void* getRawMemory (size_t size, bool alwaysUseMap = false)
+static inline void* getRawMemory (size_t size, bool useMapMem = false)
{
void *object;
- if (alwaysUseMap)
+ if (useMapMem)
object = MapMemory(size);
else
#if MALLOC_CHECK_RECURSION
@@ -543,9 +564,9 @@ static inline void* getRawMemory (size_t size, bool alwaysUseMap = false)
return object;
}
-static inline void freeRawMemory (void *object, size_t size, bool alwaysUseMap)
+static inline void freeRawMemory (void *object, size_t size, bool useMapMem)
{
- if (alwaysUseMap)
+ if (useMapMem)
UnmapMemory(object, size);
else
#if MALLOC_CHECK_RECURSION
@@ -612,6 +633,51 @@ static inline unsigned int highestBitPos(unsigned int n)
return pos;
}
+unsigned int getCPUid()
+{
+ unsigned int id;
+
+#if (__ARCH_x86_32||__ARCH_x86_64) && (__linux__||__APPLE__||__FreeBSD__||__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
+ }
+ id = (res >> 24) & 0xff;
+ #endif
+# else
+ id = getThreadId();
+#endif
+ return id;
+}
+
/*
* Depending on indexRequest, for a given size return either the index into the bin
* for objects of this size, or the actual size of objects in this bin.
@@ -689,7 +755,7 @@ static inline void *alignBigBlock(void *unalignedBigBlock)
* 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;
+const unsigned int blocksPerBigBlock = 16/numOfFreeBlockLists;
/* Returns 0 if unsuccessful, otherwise 1. */
static int mallocBigBlock()
@@ -701,7 +767,7 @@ static int mallocBigBlock()
void *splitEdge;
size_t bigBlockSplitSize;
- unalignedBigBlock = getRawMemory(mmapRequestSize, /*alwaysUseMap=*/true);
+ unalignedBigBlock = getRawMemory(mmapRequestSize, /*useMapMem=*/true);
if (!unalignedBigBlock) {
TRACEF(( "[ScalableMalloc trace] in mallocBigBlock, getMemory returns 0\n" ));
@@ -716,13 +782,17 @@ static int mallocBigBlock()
splitBlock = (Block*)alignedBigBlock;
- while ( ((uintptr_t)splitBlock + blockSize) <= (uintptr_t)bigBlockCeiling ) {
+ // distribute alignedBigBlock between all freeBlockList elements
+ for (unsigned currListIdx = 0;
+ ((uintptr_t)splitBlock + blockSize) <= (uintptr_t)bigBlockCeiling;
+ currListIdx = (currListIdx+1) % numOfFreeBlockLists) {
splitEdge = (void*)((uintptr_t)splitBlock + bigBlockSplitSize);
if( splitEdge > bigBlockCeiling) {
splitEdge = alignDown(bigBlockCeiling, blockSize);
}
splitBlock->bumpPtr = (FreeObject*)splitEdge;
- freeBlockList.push((void**) splitBlock);
+ MALLOC_ITT_SYNC_RELEASING(freeBlockList+currListIdx);
+ freeBlockList[currListIdx].push((void**) splitBlock);
splitBlock = (Block*)splitEdge;
}
@@ -743,7 +813,6 @@ static Block *getEmptyBlock(size_t size);
static BackRefIdx newBackRef();
static void setBackRef(BackRefIdx backRefIdx, void *newPtr);
static void removeBackRef(BackRefIdx backRefIdx);
-static inline void *getBackRef(BackRefIdx backRefIdx);
static MallocMutex bootStrapLock;
@@ -977,9 +1046,9 @@ static void freePublicObject (Block *block, FreeObject *objectToFree)
Bin* theBin;
FreeObject *publicFreeList;
+ MALLOC_ITT_SYNC_RELEASING(&block->publicFreeList);
#if FREELIST_NONBLOCKING
FreeObject *temp = block->publicFreeList;
- MALLOC_ITT_SYNC_RELEASING(&block->publicFreeList);
do {
publicFreeList = objectToFree->next = temp;
temp = (FreeObject*)AtomicCompareExchange(
@@ -1033,7 +1102,6 @@ static void privatizePublicFreeList (Block *mallocBlock)
0, (intptr_t)publicFreeList);
// no backoff necessary because trying to make change, not waiting for a change
} while( temp != publicFreeList );
- MALLOC_ITT_SYNC_ACQUIRED(&mallocBlock->publicFreeList);
#else
STAT_increment(mallocBlock->owner, ThreadCommonCounters, lockPublicFreeList);
{
@@ -1043,6 +1111,7 @@ static void privatizePublicFreeList (Block *mallocBlock)
}
temp = publicFreeList;
#endif
+ MALLOC_ITT_SYNC_ACQUIRED(&mallocBlock->publicFreeList);
MALLOC_ASSERT( publicFreeList && publicFreeList==temp, ASSERT_TEXT ); // there should be something in publicFreeList!
if( !isNotForUse(temp) ) { // return/getPartialBlock could set it to UNUSABLE
@@ -1090,6 +1159,7 @@ static Block *getPartialBlock(Bin* bin, unsigned int size)
unsigned int index = getIndex(size);
result = (Block *) globalSizeBins[index].pop();
if (result) {
+ MALLOC_ITT_SYNC_ACQUIRED(globalSizeBins+index);
result->next = NULL;
result->previous = NULL;
MALLOC_ASSERT( result->publicFreeList!=NULL, ASSERT_TEXT );
@@ -1156,6 +1226,7 @@ static void returnPartialBlock(Bin* bin, Block *block)
// formed by nextPrivatizable pointers is kept consistent if required.
// if only called from thread shutdown code, it does not matter.
(uintptr_t&)(block->nextPrivatizable) = UNUSABLE;
+ MALLOC_ITT_SYNC_RELEASING(globalSizeBins+index);
globalSizeBins[index].push((void **)block);
}
@@ -1225,33 +1296,52 @@ void FreeBlockPool::returnBlock(Block *block)
headToFree = headToFree->next;
tail->next = NULL;
size = POOL_LOW_MARK-1;
- freeBlockList.pushList((void **)headToFree, (void **)tailToFree);
+ for (Block *currBl = headToFree; currBl; currBl = currBl->next)
+ removeBackRef(currBl->backRefIdx);
+ unsigned myFreeList = getCPUid()%numOfFreeBlockLists;
+ MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
+ freeBlockList[myFreeList].pushList((void **)headToFree, (void **)tailToFree);
}
insertBlock(block);
}
void FreeBlockPool::releaseAllBlocks()
{
- if (head)
- freeBlockList.pushList((void**)head, (void**)tail);
+ if (head) {
+ for (Block *currBl = head; currBl; currBl = currBl->next)
+ removeBackRef(currBl->backRefIdx);
+ unsigned myFreeList = getCPUid()%numOfFreeBlockLists;
+ MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
+ freeBlockList[myFreeList].pushList((void**)head, (void**)tail);
+ }
}
/* Return an empty uninitialized block in a non-blocking fashion. */
-static Block *getRawBlock()
+static Block *getRawBlock(bool startup)
{
Block *result;
Block *bigBlock;
-
+ const unsigned myFreeList = startup? 0 : getCPUid()%numOfFreeBlockLists;
+ unsigned currListIdx = myFreeList;
+
result = NULL;
- bigBlock = (Block *) freeBlockList.pop();
+ do {
+ if (bigBlock = (Block *) freeBlockList[currListIdx].pop()) {
+ MALLOC_ITT_SYNC_ACQUIRED(freeBlockList+currListIdx);
+ break;
+ }
+ currListIdx = (currListIdx+1) % numOfFreeBlockLists;
+ } while (currListIdx != myFreeList);
while (!bigBlock) {
/* We are out of blocks so go to the OS and get another one */
if (!mallocBigBlock()) {
return NULL;
}
- bigBlock = (Block *) freeBlockList.pop();
+ bigBlock = (Block *) freeBlockList[myFreeList].pop();
+ if (bigBlock)
+ MALLOC_ITT_SYNC_ACQUIRED(freeBlockList+myFreeList);
}
// check alignment
@@ -1263,7 +1353,8 @@ static Block *getRawBlock()
result = (Block *)bigBlock->bumpPtr;
if ( result!=bigBlock ) {
TRACEF(( "[ScalableMalloc trace] Pushing partial rest of block back on.\n" ));
- freeBlockList.push((void **)bigBlock);
+ MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
+ freeBlockList[myFreeList].push((void **)bigBlock);
}
return result;
@@ -1278,7 +1369,7 @@ static Block *getEmptyBlock(size_t size)
result = tls->pool.getBlock();
if (!result) {
BackRefIdx backRefIdx = newBackRef();
- if (backRefIdx == invalidIdx || !(result = getRawBlock()))
+ if (backRefIdx == invalidIdx || !(result = getRawBlock(/*startup=*/false)))
return NULL;
setBackRef(backRefIdx, result);
result->backRefIdx = backRefIdx;
@@ -1314,7 +1405,9 @@ static void returnEmptyBlock (Block *block, bool poolTheBlock)
}
else {
removeBackRef(block->backRefIdx);
- freeBlockList.push((void **)block);
+ unsigned myFreeList = getCPUid()%numOfFreeBlockLists;
+ MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
+ freeBlockList[myFreeList].push((void **)block);
}
}
@@ -1369,7 +1462,7 @@ static StartupBlock *getNewStartupBlock()
BackRefIdx backRefIdx = newBackRef();
if (backRefIdx == invalidIdx) return NULL;
- StartupBlock *block = (StartupBlock *)getRawBlock();
+ StartupBlock *block = (StartupBlock *)getRawBlock(/*startup=*/true);
if (!block) return NULL;
cleanBlockHeader(block);
@@ -1513,14 +1606,14 @@ static bool initBackRefMaster()
{
// MapMemory forced because the function runs during startup
backRefMaster = (BackRefMaster*)getRawMemory(BackRefMaster::bytes,
- /*alwaysUseMap=*/true);
+ /*useMapMem=*/true);
if (NULL == backRefMaster)
return false;
backRefMaster->listForUse = NULL;
backRefMaster->lastUsed = 0;
if (!backRefMaster->addActiveBackRefBlock()) {
- freeRawMemory(backRefMaster, BackRefMaster::bytes, /*alwaysUseMap=*/true);
+ freeRawMemory(backRefMaster, BackRefMaster::bytes, /*useMapMem=*/true);
return false;
}
return true;
@@ -1528,8 +1621,10 @@ static bool initBackRefMaster()
bool BackRefMaster::addActiveBackRefBlock()
{
- if (NULL == (active = (BackRefBlock*)getRawBlock()))
- return false;
+ BackRefBlock *newBl = (BackRefBlock*)getRawBlock(/*startup=*/true);
+
+ if (!newBl) return false;
+ active = newBl;
memset(active, 0, blockSize);
new (active) BackRefBlock(active, lastUsed);
backRefBl[lastUsed] = active;
@@ -1724,19 +1819,16 @@ static void checkInitialization()
/********* Allocation of large objects ************/
/*
- * The program wants a large object that we are not prepared to deal with.
- * so we pass the problem on to the OS. 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.
- *
+ * 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.
*/
-void CachedObjectsList::push(void *buf, bool fromMapMemory, BackRefIdx backRefIdx, uintptr_t currAge)
+static uintptr_t cleanupCacheIfNeed();
+
+void CachedBlocksList::push(LargeMemoryBlock *ptr)
{
- CachedObject *ptr = (CachedObject*)buf;
ptr->prev = NULL;
- ptr->age = currAge;
- ptr->backRefIdx = backRefIdx;
- ptr->fromMapMemory = fromMapMemory;
+ ptr->age = cleanupCacheIfNeed ();
MallocMutex::scoped_lock scoped_cs(lock);
ptr->next = first;
@@ -1744,14 +1836,15 @@ void CachedObjectsList::push(void *buf, bool fromMapMemory, BackRefIdx backRefId
if (ptr->next) ptr->next->prev = ptr;
if (!last) {
MALLOC_ASSERT(0 == oldest, ASSERT_TEXT);
- oldest = currAge;
+ oldest = ptr->age;
last = ptr;
}
}
-CachedObject *CachedObjectsList::pop(uintptr_t currAge)
+LargeMemoryBlock *CachedBlocksList::pop()
{
- CachedObject *result=NULL;
+ uintptr_t currAge = cleanupCacheIfNeed();
+ LargeMemoryBlock *result=NULL;
{
MallocMutex::scoped_lock scoped_cs(lock);
if (first) {
@@ -1772,9 +1865,9 @@ CachedObject *CachedObjectsList::pop(uintptr_t currAge)
return result;
}
-void CachedObjectsList::releaseLastIfOld(uintptr_t currAge, size_t size)
+void CachedBlocksList::releaseLastIfOld(uintptr_t currAge, size_t size)
{
- CachedObject *toRelease = NULL;
+ LargeMemoryBlock *toRelease = NULL;
/* oldest may be more recent then age, that's why cast to signed type
was used. age overflow is also processed correctly. */
@@ -1801,7 +1894,7 @@ void CachedObjectsList::releaseLastIfOld(uintptr_t currAge, size_t size)
return;
}
while ( toRelease ) {
- CachedObject *helper = toRelease->next;
+ LargeMemoryBlock *helper = toRelease->next;
removeBackRef(toRelease->backRefIdx);
freeRawMemory(toRelease, size, toRelease->fromMapMemory);
toRelease = helper;
@@ -1820,7 +1913,7 @@ static uintptr_t cleanupCacheIfNeed ()
* its current value and some recent.
*
* Both malloc and free should increment loCacheStat.age, as in
- * a different case mulitiple cache object would have same age,
+ * a different case multiple cached blocks would have same age,
* and accuracy of predictors suffers.
*/
uintptr_t currAge = (uintptr_t)AtomicIncrement((intptr_t&)loCacheStat.age);
@@ -1829,84 +1922,78 @@ static uintptr_t cleanupCacheIfNeed ()
size_t objSize;
int i;
- for (i = numLargeObjectBins-1,
- objSize = (numLargeObjectBins-1)*largeObjectCacheStep+blockSize;
+ for (i = numLargeBlockBins-1,
+ objSize = (numLargeBlockBins-1)*largeBlockCacheStep+blockSize;
i >= 0;
- i--, objSize-=largeObjectCacheStep) {
- /* cached object size on iteration is
- * i*largeObjectCacheStep+blockSize, it seems iterative
+ i--, objSize-=largeBlockCacheStep) {
+ /* cached block size on iteration is
+ * i*largeBlockCacheStep+blockSize, it seems iterative
* computation of it improves performance.
*/
- // release from cache objects that are older then ageThreshold
- globalCachedObjectBins[i].releaseLastIfOld(currAge, objSize);
+ // release from cache blocks that are older than ageThreshold
+ globalCachedBlockBins[i].releaseLastIfOld(currAge, objSize);
}
}
return currAge;
}
-static CachedObject* allocateCachedLargeObject (size_t size)
+static LargeMemoryBlock* getCachedLargeBlock (size_t size)
{
- MALLOC_ASSERT( size%largeObjectCacheStep==0, ASSERT_TEXT );
- CachedObject *block = NULL;
+ 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-blockSize)/largeObjectCacheStep;
- if (idx<numLargeObjectBins) {
- uintptr_t currAge = cleanupCacheIfNeed();
- block = globalCachedObjectBins[idx].pop(currAge);
- if (block) {
- STAT_increment(getThreadId(), ThreadCommonCounters, allocCachedLargeObj);
+ size_t idx = (size-blockSize)/largeBlockCacheStep;
+ if (idx<numLargeBlockBins) {
+ lmb = globalCachedBlockBins[idx].pop();
+ if (lmb) {
+ MALLOC_ITT_SYNC_ACQUIRED(globalCachedBlockBins+idx);
+ STAT_increment(getThreadId(), ThreadCommonCounters, allocCachedLargeBlk);
}
}
- return block;
+ return lmb;
}
static inline void* mallocLargeObject (size_t size, size_t alignment,
bool startupAlloc = false)
{
- void * unalignedArea;
- CachedObject* co;
- size_t allocationSize = alignUp(size+sizeof(LargeObjectHeader)+alignment,
- largeObjectCacheStep);
- bool blockFromMapMemory = false;
- BackRefIdx backRefIdx;
-
- if (!startupAlloc && (co = allocateCachedLargeObject(allocationSize))) {
- blockFromMapMemory = co->fromMapMemory;
- backRefIdx = co->backRefIdx;
- unalignedArea = co;
- } else {
+ LargeMemoryBlock* lmb;
+ size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
+ size_t allocationSize = alignUp(size+headersSize+alignment, largeBlockCacheStep);
+
+ if (startupAlloc || !(lmb = getCachedLargeBlock(allocationSize))) {
+ BackRefIdx backRefIdx;
+
if ((backRefIdx = newBackRef()) == invalidIdx) return NULL;
- unalignedArea = getRawMemory(allocationSize, /*alwaysUseMap=*/startupAlloc);
- if (!unalignedArea) return NULL;
+ lmb = (LargeMemoryBlock*)getRawMemory(allocationSize, /*useMapMem=*/startupAlloc);
+ if (!lmb) return NULL;
+ lmb->fromMapMemory = startupAlloc;
+ lmb->backRefIdx = backRefIdx;
+ lmb->unalignedSize = allocationSize;
STAT_increment(getThreadId(), ThreadCommonCounters, allocNewLargeObj);
}
- void *alignedArea =
- (void*)alignUp((uintptr_t)unalignedArea+sizeof(LargeObjectHeader), alignment);
- LargeObjectHeader *header = ((LargeObjectHeader*)alignedArea)-1;
- setBackRef(backRefIdx, header);
- header->backRefIdx = backRefIdx;
- header->unalignedResult = unalignedArea;
- header->unalignedSize = allocationSize;
- header->objectSize = size;
- header->fromMapMemory = startupAlloc || blockFromMapMemory;
+ void *alignedArea = (void*)alignUp((uintptr_t)lmb+headersSize, alignment);
+ LargeObjectHdr *header = (LargeObjectHdr*)alignedArea-1;
+ header->memoryBlock = lmb;
+ header->backRefIdx = lmb->backRefIdx;
+ setBackRef(header->backRefIdx, header);
+
+ lmb->objectSize = size;
+
MALLOC_ASSERT( isLargeObject(alignedArea), ASSERT_TEXT );
return alignedArea;
}
-static bool freeLargeObjectToCache (LargeObjectHeader* header)
+static bool freeLargeObjectToCache (LargeMemoryBlock* largeBlock)
{
- size_t size = header->unalignedSize;
- size_t idx = (size-blockSize)/largeObjectCacheStep;
- if (idx<numLargeObjectBins) {
- MALLOC_ASSERT( size%largeObjectCacheStep==0, ASSERT_TEXT );
- uintptr_t currAge = cleanupCacheIfNeed ();
- globalCachedObjectBins[idx].push(header->unalignedResult,
- header->fromMapMemory,
- header->backRefIdx,
- currAge);
+ size_t size = largeBlock->unalignedSize;
+ size_t idx = (size-blockSize)/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, cacheLargeObj);
+ STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
return true;
}
return false;
@@ -1914,12 +2001,14 @@ static bool freeLargeObjectToCache (LargeObjectHeader* header)
static inline void freeLargeObject (void *object)
{
- LargeObjectHeader *header;
- header = (LargeObjectHeader *)((uintptr_t)object - sizeof(LargeObjectHeader));
- if (!freeLargeObjectToCache(header)) {
- removeBackRef(header->backRefIdx);
- freeRawMemory(header->unalignedResult, header->unalignedSize,
- /*alwaysUseMap=*/ header->fromMapMemory);
+ LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
+
+ // overwrite backRefIdx to simplify double free detection
+ header->backRefIdx = invalidIdx;
+ if (!freeLargeObjectToCache(header->memoryBlock)) {
+ removeBackRef(header->memoryBlock->backRefIdx);
+ freeRawMemory(header->memoryBlock, header->memoryBlock->unalignedSize,
+ /*useMapMem=*/ header->memoryBlock->fromMapMemory);
STAT_increment(getThreadId(), ThreadCommonCounters, freeLargeObj);
}
}
@@ -2049,13 +2138,13 @@ static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
size_t copySize;
if (isLargeObject(ptr)) {
- LargeObjectHeader* loh = (LargeObjectHeader *)((uintptr_t)ptr - sizeof(LargeObjectHeader));
- copySize = loh->unalignedSize-((uintptr_t)ptr-(uintptr_t)loh->unalignedResult);
+ LargeMemoryBlock* lmb = ((LargeObjectHdr *)ptr - 1)->memoryBlock;
+ copySize = lmb->unalignedSize-((uintptr_t)ptr-(uintptr_t)lmb);
if (size <= copySize && (0==alignment || isAligned(ptr, alignment))) {
- loh->objectSize = size;
+ lmb->objectSize = size;
return ptr;
} else {
- copySize = loh->objectSize;
+ copySize = lmb->objectSize;
result = alignment ? allocateAligned(size, alignment) : scalable_malloc(size);
}
} else {
@@ -2207,8 +2296,8 @@ static inline bool isRecognized (void* ptr)
BackRefIdx* idx;
if (isLargeObject(ptr)) {
- expected = (LargeObjectHeader*)((uintptr_t)ptr-sizeof(LargeObjectHeader));
- idx = &((LargeObjectHeader*)expected)->backRefIdx;
+ expected = (LargeObjectHdr*)ptr - 1;
+ idx = &((LargeObjectHdr*)expected)->backRefIdx;
} else {
expected = alignDown(ptr, blockSize);
idx = &((Block*)expected)->backRefIdx;
@@ -2616,9 +2705,10 @@ extern "C" void scalable_aligned_free(void *ptr)
extern "C" size_t scalable_msize(void* ptr)
{
if (ptr) {
+ MALLOC_ASSERT(isRecognized(ptr), "Invalid pointer in scalable_msize detected.");
if (isLargeObject(ptr)) {
- LargeObjectHeader* loh = (LargeObjectHeader*)((uintptr_t)ptr - sizeof(LargeObjectHeader));
- return loh->unalignedSize-((uintptr_t)ptr-(uintptr_t)loh->unalignedResult);
+ LargeMemoryBlock* lmb = ((LargeObjectHdr*)ptr - 1)->memoryBlock;
+ return lmb->objectSize;
} else {
Block* block = (Block *)alignDown(ptr, blockSize);
#if MALLOC_CHECK_RECURSION
diff --git a/src/tbbmalloc/proxy.cpp b/src/tbbmalloc/proxy.cpp
index 648c20e..87b03e5 100644
--- a/src/tbbmalloc/proxy.cpp
+++ b/src/tbbmalloc/proxy.cpp
@@ -28,6 +28,16 @@
#include "proxy.h"
+#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)
+ #if TBB_USE_EXCEPTIONS
+ #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.
+ #elif !defined(TBB_USE_EXCEPTIONS)
+ #define TBB_USE_EXCEPTIONS 0
+ #endif
+#elif !defined(TBB_USE_EXCEPTIONS)
+ #define TBB_USE_EXCEPTIONS 1
+#endif
+
#if MALLOC_LD_PRELOAD
/*** service functions and variables ***/
@@ -149,12 +159,18 @@ extern "C" struct mallinfo mallinfo() __THROW
void * operator new(size_t sz) throw (std::bad_alloc) {
void *res = scalable_malloc(sz);
- if (NULL == res) throw std::bad_alloc();
+#if TBB_USE_EXCEPTIONS
+ if (NULL == res)
+ throw std::bad_alloc();
+#endif /* TBB_USE_EXCEPTIONS */
return res;
}
void* operator new[](size_t sz) throw (std::bad_alloc) {
void *res = scalable_malloc(sz);
- if (NULL == res) throw std::bad_alloc();
+#if TBB_USE_EXCEPTIONS
+ if (NULL == res)
+ throw std::bad_alloc();
+#endif /* TBB_USE_EXCEPTIONS */
return res;
}
void operator delete(void* ptr) throw() {
@@ -196,7 +212,6 @@ void* safer_expand( void *, size_t )
return NULL;
}
-#define __TBB_QV(EXP) #EXP
#define __TBB_ORIG_ALLOCATOR_REPLACEMENT_WRAPPER(CRTLIB)\
void (*orig_free_##CRTLIB)(void*); \
void safer_scalable_free_##CRTLIB( void *ptr) \
@@ -243,28 +258,28 @@ const char* known_bytecodes[] = {
#if _WIN64
#define __TBB_ORIG_ALLOCATOR_REPLACEMENT_CALL(CRT_VER)\
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ## d ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ## d ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER ## d, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER ## d, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER, 0, NULL);
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ## d ); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ## d ); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER ## d, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER ## d, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER, 0, NULL);
#else
#define __TBB_ORIG_ALLOCATOR_REPLACEMENT_CALL(CRT_VER)\
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ## d ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ## d ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER ## d, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ## d.dll), "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER ## d, 0, NULL); \
- ReplaceFunctionWithStore( __TBB_QV(CRT_VER ##.dll), "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER, 0, NULL);
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ## d ); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_free_ ## CRT_VER ); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER ## d, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ## d ); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "_msize",(FUNCPTR)safer_scalable_msize_ ## CRT_VER, known_bytecodes, (FUNCPTR*)&orig_msize_ ## CRT_VER ); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER ## d, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "realloc", (FUNCPTR)safer_scalable_realloc_ ## CRT_VER, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER ## d, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "_aligned_free", (FUNCPTR)safer_scalable_free_ ## CRT_VER, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER "d.dll", "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER ## d, 0, NULL); \
+ ReplaceFunctionWithStore( #CRT_VER ".dll", "_aligned_realloc",(FUNCPTR)safer_scalable_aligned_realloc_ ## CRT_VER, 0, NULL);
#endif
__TBB_ORIG_ALLOCATOR_REPLACEMENT_WRAPPER(msvcr70d);
@@ -322,12 +337,12 @@ void operator_delete_arr_t(void* ptr, const std::nothrow_t&) throw() {
}
const char* modules_to_replace[] = {
- "msvcr100d.dll",
- "msvcr100.dll",
"msvcr80d.dll",
"msvcr80.dll",
"msvcr90d.dll",
"msvcr90.dll",
+ "msvcr100d.dll",
+ "msvcr100.dll",
"msvcr70d.dll",
"msvcr70.dll",
"msvcr71d.dll",
diff --git a/src/tbbmalloc/tbb_function_replacement.cpp b/src/tbbmalloc/tbb_function_replacement.cpp
index 818c5ac..02ebea6 100644
--- a/src/tbbmalloc/tbb_function_replacement.cpp
+++ b/src/tbbmalloc/tbb_function_replacement.cpp
@@ -26,7 +26,7 @@
the GNU General Public License.
*/
-//We works on windows only
+// Works on windows only
#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE 1
#define __TBB_NO_IMPLICIT_LINKAGE 1
@@ -191,7 +191,7 @@ size_t compareStrings( const char *str1, const char *str2 )
{
size_t str1Lentgh = strlen(str1);
for (size_t i=0; i<str1Lentgh; i++){
- if( str1[i] != '*' && str1[i] != str2[i] ) return NULL;
+ if( str1[i] != '*' && str1[i] != str2[i] ) return 0;
}
return str1Lentgh;
}
@@ -237,7 +237,7 @@ UINT CheckOpcodes( const char ** opcodes, void *inpAddr )
return (UINT)(result/2-1);
}
// TODO: to add more stuff to patterns
- __TBB_ASSERT( NULL, "CheckOpcodes failed" );
+ __TBB_ASSERT( false, "CheckOpcodes failed" );
// No matches found just do not store original calls
return 0;
@@ -245,7 +245,7 @@ UINT CheckOpcodes( const char ** opcodes, void *inpAddr )
// Insert jump relative instruction to the input address
// RETURN: the size of the trampoline or 0 on failure
-static DWORD InsertTrampoline32(void *inpAddr, void *targetAddr, const char ** opcodes, FUNCPTR* storedAddr)
+static DWORD InsertTrampoline32(void *inpAddr, void *targetAddr, const char ** opcodes, void** storedAddr)
{
UINT opcodesNumber = SIZE_OF_RELJUMP;
UINT_PTR srcAddr = Ptr2Addrint(inpAddr);
@@ -265,10 +265,10 @@ static DWORD InsertTrampoline32(void *inpAddr, void *targetAddr, const char ** o
UINT_PTR strdAddr = memProvider.GetLocation(srcAddr);
if (!strdAddr)
return 0;
- *storedAddr = (FUNCPTR)Addrint2Ptr(strdAddr);
+ *storedAddr = Addrint2Ptr(strdAddr);
// Set 'executable' flag for original instructions in the new place
DWORD pageFlags = PAGE_EXECUTE_READWRITE;
- if(!VirtualProtect(*storedAddr, MAX_PROBE_SIZE, pageFlags, &pageFlags)) return 0;
+ if (!VirtualProtect(*storedAddr, MAX_PROBE_SIZE, pageFlags, &pageFlags)) return 0;
// Copy original instructions to the new place
memcpy(*storedAddr, codePtr, opcodesNumber);
// Set jump to the code after replacement
@@ -303,7 +303,7 @@ static DWORD InsertTrampoline32(void *inpAddr, void *targetAddr, const char ** o
// 2 Put jump RIP relative indirect through the address in the close page
// 3 Put the absolute address of the target in the allocated location
// RETURN: the size of the trampoline or 0 on failure
-static DWORD InsertTrampoline64(void *inpAddr, void *targetAddr, const char ** opcodes, FUNCPTR* storedAddr)
+static DWORD InsertTrampoline64(void *inpAddr, void *targetAddr, const char ** opcodes, void** storedAddr)
{
UINT opcodesNumber = SIZE_OF_INDJUMP;
@@ -330,7 +330,7 @@ static DWORD InsertTrampoline64(void *inpAddr, void *targetAddr, const char ** o
UINT_PTR strdAddr = memProvider.GetLocation(srcAddr);
if (!strdAddr)
return 0;
- *storedAddr = (FUNCPTR)Addrint2Ptr(strdAddr);
+ *storedAddr = Addrint2Ptr(strdAddr);
// Set 'executable' flag for original instructions in the new place
DWORD pageFlags = PAGE_EXECUTE_READWRITE;
if (!VirtualProtect(*storedAddr, MAX_PROBE_SIZE, pageFlags, &pageFlags)) return 0;
@@ -368,7 +368,7 @@ static DWORD InsertTrampoline64(void *inpAddr, void *targetAddr, const char ** o
// 3. Call InsertTrampoline32 or InsertTrampoline64
// 4. Restore memory protection
// RETURN: FALSE on failure, TRUE on success
-static bool InsertTrampoline(void *inpAddr, void *targetAddr, const char ** opcodes, FUNCPTR* origFunc)
+static bool InsertTrampoline(void *inpAddr, void *targetAddr, const char ** opcodes, void** origFunc)
{
DWORD probeSize;
// Change page protection to EXECUTE+WRITE
@@ -425,7 +425,7 @@ FRR_TYPE ReplaceFunctionA(const char *dllName, const char *funcName, FUNCPTR new
return FRR_NOFUNC;
}
- if (!InsertTrampoline((void*)inpFunc, (void*)newFunc, opcodes, origFunc)){
+ if (!InsertTrampoline((void*)inpFunc, (void*)newFunc, opcodes, (void**)origFunc)){
// Failed to insert the trampoline to the target address
return FRR_FAILED;
}
@@ -465,7 +465,7 @@ FRR_TYPE ReplaceFunctionW(const wchar_t *dllName, const char *funcName, FUNCPTR
return FRR_NOFUNC;
}
- if (!InsertTrampoline((void*)inpFunc, (void*)newFunc, opcodes, origFunc)){
+ if (!InsertTrampoline((void*)inpFunc, (void*)newFunc, opcodes, (void**)origFunc)){
// Failed to insert the trampoline to the target address
return FRR_FAILED;
}
diff --git a/src/tbbmalloc/tbb_function_replacement.h b/src/tbbmalloc/tbb_function_replacement.h
index a0af43b..bf520b6 100644
--- a/src/tbbmalloc/tbb_function_replacement.h
+++ b/src/tbbmalloc/tbb_function_replacement.h
@@ -62,16 +62,16 @@ inline UINT_PTR Ptr2Addrint(LPVOID ptr);
inline LPVOID Addrint2Ptr(UINT_PTR ptr);
// Use this value as the maximum size the trampoline region
-const int MAX_PROBE_SIZE = 32;
+const unsigned MAX_PROBE_SIZE = 32;
// The size of a jump relative instruction "e9 00 00 00 00"
-const int SIZE_OF_RELJUMP = 5;
+const unsigned SIZE_OF_RELJUMP = 5;
// The size of jump RIP relative indirect "ff 25 00 00 00 00"
-const int SIZE_OF_INDJUMP = 6;
+const unsigned SIZE_OF_INDJUMP = 6;
// The size of address we put in the location (in Intel64)
-const int SIZE_OF_ADDRESS = 8;
+const unsigned SIZE_OF_ADDRESS = 8;
// The max distance covered in 32 bits: 2^31 - 1 - C
// where C should not be smaller than the size of a probe.
@@ -79,6 +79,6 @@ const int SIZE_OF_ADDRESS = 8;
const __int64 MAX_DISTANCE = (((__int64)1 << 31) - 1) - MAX_PROBE_SIZE;
// The maximum number of distinct buffers in memory
-const int MAX_NUM_BUFFERS = 256;
+const ptrdiff_t MAX_NUM_BUFFERS = 256;
#endif //__TBB_function_replacement_H
diff --git a/src/tbbmalloc/tbbmalloc.cpp b/src/tbbmalloc/tbbmalloc.cpp
index e585684..1b4b3ba 100644
--- a/src/tbbmalloc/tbbmalloc.cpp
+++ b/src/tbbmalloc/tbbmalloc.cpp
@@ -28,7 +28,7 @@
#include "TypeDefinitions.h" // Customize.h and proxy.h get included
-#include "tbb/itt_notify.cpp"
+#include "tbb/itt_notify.h" // for __TBB_load_ittnotify()
#undef UNICODE
@@ -74,31 +74,20 @@ static void* (*original_realloc_ptr)(void*,size_t) = 0;
#endif /* MALLOC_CHECK_RECURSION */
-#if __TBB_NEW_ITT_NOTIFY
-extern "C"
-#endif
-void ITT_DoOneTimeInitialization() {} // required for itt_notify.cpp to work
-
#if DO_ITT_NOTIFY
/** Caller is responsible for ensuring this routine is called exactly once. */
void MallocInitializeITT() {
-#if __TBB_NEW_ITT_NOTIFY
tbb::internal::__TBB_load_ittnotify();
-#else
- bool success = false;
- // Check if we are running under control of VTune.
- if( GetBoolEnvironmentVariable("KMP_FOR_TCHECK") || GetBoolEnvironmentVariable("KMP_FOR_TPROFILE") ) {
- // Yes, we are under control of VTune. Check for libittnotify library.
- success = dynamic_link( LIBITTNOTIFY_NAME, ITT_HandlerTable, 5 );
- }
- if (!success){
- for (int i = 0; i < 5; i++)
- *ITT_HandlerTable[i].handler = NULL;
- }
-#endif /* !__TBB_NEW_ITT_NOTIFY */
}
+#else
+void MallocInitializeITT() {}
#endif /* DO_ITT_NOTIFY */
+extern "C"
+void ITT_DoOneTimeInitialization() {
+ MallocInitializeITT();
+} // required for itt_notify.cpp to work
+
#if TBB_USE_DEBUG
#define DEBUG_SUFFIX "_debug"
#else
@@ -209,7 +198,14 @@ void __TBB_internal_free(void *object)
} } // namespaces
#ifdef _WIN32
+
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
#include <windows.h>
+#endif
extern "C" BOOL WINAPI DllMain( HINSTANCE hInst, DWORD callReason, LPVOID )
{
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/src/tbbmalloc/win-gcc-tbbmalloc-export.def
index 96c2631..7a7d072 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win-gcc-tbbmalloc-export.def
@@ -1,21 +1,29 @@
/*
Copyright 2005-2010 Intel Corporation. All Rights Reserved.
- The source code contained or described herein and all documents related
- to the source code ("Material") are owned by Intel Corporation or its
- suppliers or licensors. Title to the Material remains with Intel
- Corporation or its suppliers and licensors. The Material is protected
- by worldwide copyright laws and treaty provisions. No part of the
- Material may be used, copied, reproduced, modified, published, uploaded,
- posted, transmitted, distributed, or disclosed in any way without
- Intel's prior express written permission.
+ This file is part of Threading Building Blocks.
- No license under any patent, copyright, trade secret or other
- intellectual property right is granted to or conferred upon you by
- disclosure or delivery of the Materials, either expressly, by
- implication, inducement, estoppel or otherwise. Any license under such
- intellectual property rights must be express and approved by Intel in
- writing.
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
*/
{
diff --git a/src/tbbmalloc/xbox360-tbbmalloc-export.def b/src/tbbmalloc/xbox360-tbbmalloc-export.def
new file mode 100644
index 0000000..86509ad
--- /dev/null
+++ b/src/tbbmalloc/xbox360-tbbmalloc-export.def
@@ -0,0 +1,42 @@
+; Copyright 2005-2010 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.
+
+EXPORTS
+
+; MemoryAllocator.cpp
+scalable_calloc @1
+scalable_free @2
+scalable_malloc @3
+scalable_realloc @4
+scalable_posix_memalign @5
+scalable_aligned_malloc @6
+scalable_aligned_realloc @7
+scalable_aligned_free @8
+safer_scalable_free @9
+safer_scalable_realloc @10
+scalable_msize @11
+safer_scalable_msize @12
+safer_scalable_aligned_realloc @13
diff --git a/src/test/harness.h b/src/test/harness.h
index b8e2aff..2d570db 100644
--- a/src/test/harness.h
+++ b/src/test/harness.h
@@ -36,6 +36,8 @@
#ifndef tbb_tests_harness_H
#define tbb_tests_harness_H
+#include "tbb/tbb_config.h"
+
namespace Harness {
enum TestResult {
Done,
@@ -69,21 +71,34 @@ int TestMain ();
#if __SUNPRO_CC
#include <stdlib.h>
#include <string.h>
-#else
+#else /* !__SUNPRO_CC */
#include <cstdlib>
+#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 <cstring>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
#endif
+#endif /* !__SUNPRO_CC */
+
#include <new>
-#if __LRB__
- #include "harness_lrb.h"
-#else
- #define __TBB_TEST_EXPORT
+ #define HARNESS_EXPORT
#define REPORT_FATAL_ERROR REPORT
-#endif /* !__LRB__ */
#if _WIN32||_WIN64
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+ #undef HARNESS_NO_PARSE_COMMAND_LINE
+ #define HARNESS_NO_PARSE_COMMAND_LINE 1
+#else
#include <windows.h>
+#endif
#include <process.h>
#else
#include <pthread.h>
@@ -114,13 +129,13 @@ void ReportError( const char* filename, int line, const char* expression, const
#endif
if( ErrorExtraCall )
(*ErrorExtraCall)();
-#if TBB_TERMINATE_ON_ASSERT
+#if HARNESS_TERMINATE_ON_ASSERT
TerminateProcess(GetCurrentProcess(), 1);
-#elif TBB_EXIT_ON_ASSERT
+#elif HARNESS_EXIT_ON_ASSERT
exit(1);
#else
abort();
-#endif /* TBB_EXIT_ON_ASSERT */
+#endif /* HARNESS_EXIT_ON_ASSERT */
}
//! Reports warnings issued by failed warning assertions
void ReportWarning( const char* filename, int line, const char* expression, const char * message ) {
@@ -158,9 +173,10 @@ static int MaxThread = HARNESS_DEFAULT_MAX_THREADS;
The numbers must be non-negative.
Clients often treat the value 0 as "run sequentially." */
static void ParseCommandLine( int argc, char* argv[] ) {
+ if( !argc ) REPORT("Command line with 0 arguments\n");
int i = 1;
if( i<argc ) {
- if( strcmp( argv[i], "-v" )==0 ) {
+ if( strncmp( argv[i], "-v", 2 )==0 ) {
Verbose = true;
++i;
}
@@ -203,7 +219,7 @@ static void ParseCommandLine( int argc, char* argv[] ) {
#if !HARNESS_CUSTOM_MAIN
-__TBB_TEST_EXPORT
+HARNESS_EXPORT
#if HARNESS_NO_PARSE_COMMAND_LINE
int main() {
#else
@@ -315,15 +331,15 @@ private:
#endif
{
NativeParallelForTask& self = *static_cast<NativeParallelForTask*>(object);
-#if defined(__EXCEPTIONS) || defined(_CPPUNWIND) || defined(__SUNPRO_CC)
+#if TBB_USE_EXCEPTIONS
try {
(self.body)(self.index);
} catch(...) {
ASSERT( false, "uncaught exception" );
}
-#else
+#else /* !TBB_USE_EXCEPTIONS */
(self.body)(self.index);
-#endif// exceptions are enabled
+#endif /* !TBB_USE_EXCEPTIONS */
return 0;
}
};
@@ -359,47 +375,52 @@ void NativeParallelFor( Index n, const Body& body ) {
//! The function to zero-initialize arrays; useful to avoid warnings
template <typename T>
-void zero_fill(void* array, size_t N) {
- memset(array, 0, sizeof(T)*N);
+void zero_fill(void* array, size_t n) {
+ memset(array, 0, sizeof(T)*n);
}
+#if __SUNPRO_CC && defined(min)
+#undef min
+#undef max
+#endif
+
#ifndef min
- //! Utility template function returning lesser of the two values.
- /** Provided here to avoid including not strict safe <algorithm>.\n
- In case operands cause signed/unsigned or size mismatch warnings it is caller's
- responsibility to do the appropriate cast before calling the function. **/
- template<typename T1, typename T2>
- T1 min ( const T1& val1, const T2& val2 ) {
- return val1 < val2 ? val1 : val2;
- }
+//! Utility template function returning lesser of the two values.
+/** Provided here to avoid including not strict safe <algorithm>.\n
+ In case operands cause signed/unsigned or size mismatch warnings it is caller's
+ responsibility to do the appropriate cast before calling the function. **/
+template<typename T1, typename T2>
+T1 min ( const T1& val1, const T2& val2 ) {
+ return val1 < val2 ? val1 : val2;
+}
#endif /* !min */
#ifndef max
- //! Utility template function returning greater of the two values. Provided here to avoid including not strict safe <algorithm>.
- /** Provided here to avoid including not strict safe <algorithm>.\n
- In case operands cause signed/unsigned or size mismatch warnings it is caller's
- responsibility to do the appropriate cast before calling the function. **/
- template<typename T1, typename T2>
- T1 max ( const T1& val1, const T2& val2 ) {
- return val1 < val2 ? val2 : val1;
- }
+//! Utility template function returning greater of the two values.
+/** Provided here to avoid including not strict safe <algorithm>.\n
+ In case operands cause signed/unsigned or size mismatch warnings it is caller's
+ responsibility to do the appropriate cast before calling the function. **/
+template<typename T1, typename T2>
+T1 max ( const T1& val1, const T2& val2 ) {
+ return val1 < val2 ? val2 : val1;
+}
#endif /* !max */
#if __linux__
inline unsigned LinuxKernelVersion()
{
- unsigned a, b, c;
+ unsigned digit1, digit2, digit3;
struct utsname utsnameBuf;
if (-1 == uname(&utsnameBuf)) {
REPORT_FATAL_ERROR("Can't call uname: errno %d\n", errno);
exit(1);
}
- if (3 != sscanf(utsnameBuf.release, "%u.%u.%u", &a, &b, &c)) {
+ if (3 != sscanf(utsnameBuf.release, "%u.%u.%u", &digit1, &digit2, &digit3)) {
REPORT_FATAL_ERROR("Unable to parse OS release '%s'\n", utsnameBuf.release);
exit(1);
}
- return 1000000*a+1000*b+c;
+ return 1000000*digit1+1000*digit2+digit3;
}
#endif
@@ -442,7 +463,7 @@ public:
#else /* !WIN */
void Sleep ( int ms ) {
timespec requested = { ms / 1000, (ms % 1000)*1000000 };
- timespec remaining = {0};
+ timespec remaining = { 0, 0 };
nanosleep(&requested, &remaining);
}
#endif /* !WIN */
diff --git a/src/test/harness_allocator.h b/src/test/harness_allocator.h
index bf6d15c..3f771d8 100644
--- a/src/test/harness_allocator.h
+++ b/src/test/harness_allocator.h
@@ -36,10 +36,28 @@
#elif __APPLE__ || __sun
#include <unistd.h>
#elif _WIN32
+#if _XBOX
+ #define NONET
+ #define NOD3D
+ #include <xtl.h>
+#else
#include <windows.h>
#endif
+#endif /* OS specific */
#include <new>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
#include <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include <tbb/atomic.h>
#if __SUNPRO_CC
@@ -77,10 +95,12 @@ public:
static_counting_allocator() throw() { }
- static_counting_allocator(const static_counting_allocator&) throw() { }
+ static_counting_allocator(const static_counting_allocator& src) throw()
+ : base_alloc_t(src) { }
template<typename U, typename C>
- static_counting_allocator(const static_counting_allocator<U, C>&) throw() { }
+ 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; }
@@ -90,7 +110,8 @@ public:
if(verbose) printf("\t+%d|", int(n));
if(max_items && items_allocated + n >= max_items) {
if(verbose) printf("items limit hits!");
- if(throwing) throw std::bad_alloc();
+ if(throwing)
+ __TBB_THROW( std::bad_alloc() );
return NULL;
}
allocations++;
@@ -170,7 +191,8 @@ public:
}
local_counting_allocator(const local_counting_allocator &a) throw()
- : items_allocated(a.items_allocated)
+ : base_alloc_t(a)
+ , items_allocated(a.items_allocated)
, items_freed(a.items_freed)
, allocations(a.allocations)
, frees(a.frees)
@@ -201,7 +223,7 @@ public:
pointer allocate(const size_type n)
{
if(max_items && items_allocated + n >= max_items)
- throw std::bad_alloc();
+ __TBB_THROW( std::bad_alloc() );
++allocations;
items_allocated += n;
return base_alloc_t::allocate(n, pointer(0));
diff --git a/src/test/harness_bad_expr.h b/src/test/harness_bad_expr.h
index 9fdb089..2fc0b4a 100644
--- a/src/test/harness_bad_expr.h
+++ b/src/test/harness_bad_expr.h
@@ -30,6 +30,10 @@
// This header is an optional part of the test harness.
// It assumes that "harness.h" has already been included.
+#define TRY_BAD_EXPR_ENABLED (TBB_USE_ASSERT && TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN)
+
+#if TRY_BAD_EXPR_ENABLED
+
//! Check that expression x raises assertion failure with message containing given substring.
/** Assumes that tbb::set_assertion_handler( AssertionFailureHandler ) was called earlier. */
#define TRY_BAD_EXPR(x,substr) \
@@ -78,3 +82,4 @@ void CheckAssertionFailure( int line, const char* expression, bool okay, const c
}
}
+#endif /* TRY_BAD_EXPR_ENABLED */
diff --git a/src/test/harness_cpu.h b/src/test/harness_cpu.h
index 84fa1a7..4f2c324 100644
--- a/src/test/harness_cpu.h
+++ b/src/test/harness_cpu.h
@@ -30,7 +30,7 @@
// This header is an optional part of the test harness.
// It assumes that "harness_assert.h" has already been included.
-#if _WIN32
+#if _WIN32 && !_XBOX
#include <windows.h>
#else
#include <sys/time.h>
@@ -40,7 +40,9 @@
//! Return time (in seconds) spent by the current process in user mode.
/* Returns 0 if not implemented on platform. */
static double GetCPUUserTime() {
-#if _WIN32
+#if _XBOX
+ return 0;
+#elif _WIN32
FILETIME my_times[4];
bool status = GetProcessTimes(GetCurrentProcess(), my_times, my_times+1, my_times+2, my_times+3)!=0;
ASSERT( status, NULL );
@@ -81,19 +83,35 @@ static void TestCPUUserTime( int nthreads, int nactive = 1 ) {
double lastusrtime = GetCPUUserTime();
if( !lastusrtime ) return;
- static double minimal_waittime = WAITTIME;
+ static double minimal_waittime = WAITTIME,
+ maximal_waittime = WAITTIME * 10;
double usrtime;
- while( (usrtime=GetCPUUserTime())-lastusrtime < THRESHOLD )
- ; // wait for GetCPUUserTime update
- lastusrtime = usrtime;
-
- // Test that all workers sleep when no work.
double waittime;
tbb::tick_count stamp = tbb::tick_count::now();
+ // wait for GetCPUUserTime update
+ while( (usrtime=GetCPUUserTime())-lastusrtime < THRESHOLD ) {
+ volatile intptr_t k = (intptr_t)&usrtime;
+ for ( int i = 0; i < 1000; ++i ) ++k;
+ if ( (waittime = (tbb::tick_count::now()-stamp).seconds()) > maximal_waittime ) {
+ REPORT( "Warning: %.2f sec elapsed but user mode time is still below its threshold (%g < %g)\n",
+ waittime, usrtime - lastusrtime, THRESHOLD );
+ break;
+ }
+ }
+ lastusrtime = usrtime;
+
+ // Wait for workers to go sleep
+ stamp = tbb::tick_count::now();
while( ((waittime=(tbb::tick_count::now()-stamp).seconds()) < minimal_waittime)
- || ((usrtime=GetCPUUserTime()-lastusrtime) < THRESHOLD) )
- ; // Wait for workers to go sleep
+ || ((usrtime=GetCPUUserTime()-lastusrtime) < THRESHOLD) )
+ {
+ if ( waittime > maximal_waittime ) {
+ REPORT( "Warning: %.2f sec elapsed but GetCPUUserTime reported only %g sec\n", waittime, usrtime );
+ break;
+ }
+ }
+ // Test that all workers sleep when no work.
while( nactive>1 && usrtime-nactive*waittime<0 ) {
// probably the number of active threads was mispredicted
--nactive; ++nworkers;
diff --git a/src/test/harness_eh.h b/src/test/harness_eh.h
index 6fa617d..48f4b2e 100644
--- a/src/test/harness_eh.h
+++ b/src/test/harness_eh.h
@@ -44,29 +44,6 @@ namespace Harness {
int g_NumThreads = 0;
Harness::tid_t g_Master = 0;
-class test_exception : public std::exception {
- const char* my_description;
-public:
- test_exception ( const char* description ) : my_description(description) {}
-
- const char* what() const throw() { return my_description; }
-};
-
-class solitary_test_exception : public test_exception {
-public:
- solitary_test_exception ( const char* description ) : test_exception(description) {}
-};
-
-#if TBB_USE_CAPTURED_EXCEPTION
- typedef tbb::captured_exception PropagatedException;
- #define EXCEPTION_NAME(e) e.name()
-#else
- typedef test_exception PropagatedException;
- #define EXCEPTION_NAME(e) typeid(e).name()
-#endif
-
-#define EXCEPTION_DESCR "Test exception"
-
tbb::atomic<intptr_t> g_CurExecuted,
g_ExecutedAtCatch,
g_ExceptionsThrown;
@@ -92,6 +69,30 @@ inline void ResetEhGlobals ( bool throwException = true, bool flog = false ) {
g_ExceptionsThrown = g_Exceptions = 0;
}
+#if TBB_USE_EXCEPTIONS
+class test_exception : public std::exception {
+ const char* my_description;
+public:
+ test_exception ( const char* description ) : my_description(description) {}
+
+ const char* what() const throw() { return my_description; }
+};
+
+class solitary_test_exception : public test_exception {
+public:
+ solitary_test_exception ( const char* description ) : test_exception(description) {}
+};
+
+#if TBB_USE_CAPTURED_EXCEPTION
+ typedef tbb::captured_exception PropagatedException;
+ #define EXCEPTION_NAME(e) e.name()
+#else
+ typedef test_exception PropagatedException;
+ #define EXCEPTION_NAME(e) typeid(e).name()
+#endif
+
+#define EXCEPTION_DESCR "Test exception"
+
#if HARNESS_EH_SIMPLE_MODE
static void ThrowTestException () {
@@ -115,10 +116,6 @@ static void ThrowTestException ( intptr_t threshold ) {
}
#endif /* !HARNESS_EH_SIMPLE_MODE */
-#define TRY() \
- bool exceptionCaught = false, unknownException = false; \
- try {
-
#define CATCH() \
} catch ( PropagatedException& e ) { \
g_ExecutedAtCatch = g_CurExecuted; \
@@ -150,6 +147,22 @@ static void ThrowTestException ( intptr_t threshold ) {
CATCH() \
ASSERT_EXCEPTION()
+#else /* !TBB_USE_EXCEPTIONS */
+
+inline void ThrowTestException ( intptr_t ) {}
+
+#endif /* !TBB_USE_EXCEPTIONS */
+
+#define TRY() \
+ bool exceptionCaught = false, unknownException = false; \
+ __TBB_TRY {
+
+// "exceptionCaught || unknownException" is used only to "touch" otherwise unused local variables
+#define CATCH_AND_FAIL() } __TBB_CATCH(...) { \
+ ASSERT (false, "Canceling tasks must not cause any exceptions"); \
+ (void)(exceptionCaught && unknownException); \
+ }
+
const int c_Timeout = 1000000;
void WaitUntilConcurrencyPeaks ( int expected_peak ) {
@@ -202,10 +215,14 @@ public:
static void Reset () { s_Ready = false; }
- static void WaitUntilReady () {
+ static bool WaitUntilReady () {
+ const intptr_t limit = 10000000;
+ intptr_t n = 0;
do {
__TBB_Yield();
- } while( !s_Ready );
+ } while( !s_Ready && ++n < limit );
+ ASSERT( s_Ready || n == limit, NULL );
+ return s_Ready;
}
};
@@ -222,7 +239,6 @@ void RunCancellationTest ( intptr_t threshold = 1 )
r.spawn( *new( r.allocate_child() ) LauncherTaskT(ctx) );
TRY();
r.wait_for_all();
- CATCH();
+ CATCH_AND_FAIL();
r.destroy(r);
- ASSERT (!g_ExceptionCaught && !exceptionCaught, "Cancelling tasks should not cause any exceptions");
}
diff --git a/include/tbb/compat/ppl.h b/src/test/harness_inject_scheduler.h
similarity index 57%
copy from include/tbb/compat/ppl.h
copy to src/test/harness_inject_scheduler.h
index 5c18f29..3c7ac61 100644
--- a/include/tbb/compat/ppl.h
+++ b/src/test/harness_inject_scheduler.h
@@ -26,39 +26,37 @@
the GNU General Public License.
*/
-#ifndef __TBB_compat_ppl_H
-#define __TBB_compat_ppl_H
-
-#include "../task_group.h"
-#include "../parallel_invoke.h"
-#include "../parallel_for_each.h"
-#include "../parallel_for.h"
-#include "../critical_section.h"
-#include "../tbb_exception.h"
-
-namespace Concurrency {
-
- using tbb::task_handle;
- using tbb::task_group_status;
- using tbb::task_group;
- using tbb::structured_task_group;
- using tbb::invalid_multiple_scheduling;
- using tbb::missing_wait;
- using tbb::make_task;
-
- using tbb::not_complete;
- using tbb::complete;
- using tbb::canceled;
-
- using tbb::is_current_task_group_canceling;
-
- using tbb::parallel_invoke;
- using tbb::strict_ppl::parallel_for;
- using tbb::parallel_for_each;
- using tbb::critical_section;
-
- using tbb::improper_lock;
-
-} // namespace Concurrency
-
-#endif /* __TBB_compat_ppl_H */
+// Used in tests that work with TBB scheduler but do not link to the TBB library.
+// In other words it embeds the TBB library core into the test executable.
+
+#ifndef harness_inject_scheduler_H
+#define harness_inject_scheduler_H
+
+// Suppress usage of #pragma comment
+#define __TBB_NO_IMPLICIT_LINKAGE 1
+
+#define __TBB_TASK_CPP_DIRECTLY_INCLUDED 1
+#include "../tbb/tbb_main.cpp"
+
+// Tasking subsystem files
+#include "../tbb/governor.cpp"
+#if __TBB_ARENA_PER_MASTER
+#include "../tbb/market.cpp"
+#endif /* __TBB_ARENA_PER_MASTER */
+#include "../tbb/arena.cpp"
+#include "../tbb/scheduler.cpp"
+#include "../tbb/observer_proxy.cpp"
+#include "../tbb/task.cpp"
+#include "../tbb/task_group_context.cpp"
+
+// Other dependencies
+#include "../tbb/cache_aligned_allocator.cpp"
+#include "../tbb/dynamic_link.cpp"
+#include "../tbb/tbb_thread.cpp"
+#include "../tbb/mutex.cpp"
+#include "../tbb/spin_rw_mutex.cpp"
+#include "../tbb/spin_mutex.cpp"
+#include "../tbb/private_server.cpp"
+#include "../rml/client/rml_tbb.cpp"
+
+#endif /* harness_inject_scheduler_H */
diff --git a/src/test/harness_lrb.h b/src/test/harness_lrb.h
deleted file mode 100644
index 3dd2b36..0000000
--- a/src/test/harness_lrb.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- Copyright 2005-2010 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_test_harness_lrb_H
-#define tbb_test_harness_lrb_H
-
-#if !(__LRB__||__TBB_LRB_HOST)
- #error test/harness_lrb.h should be included only when building for LRB platform
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#define __TBB_LRB_COMM_MSG_SIZE_MAX 1024
-#define __TBB_LRB_COMMUNICATOR_NAME "__TBB_LRB_COMMUNICATOR"
-
-#define __TBB_MSG_DONE "done\n"
-#define __TBB_MSG_SKIP "skip\n"
-#define __TBB_MSG_ABORT "__TBB_abort__"
-
-#define XNCALL(X) \
- { \
- XNERROR result = (X); \
- if (XN_SUCCESS != result) \
- { \
- printf("ERROR: Call to %s\n\t at line %d of %s\n\t failed with code %s\n", # X, __LINE__, __FILE__, XN0ErrorGetName(result)); fflush(0); \
- ASSERT(false, 0); \
- } \
- }
-
-
-#define INTCALL(X) \
- { \
- int result = (X); \
- if (0 != result) \
- { \
- printf("ERROR: Call to %s\n\t at line %d of %s\n\t failed with value %d\n", # X, __LINE__, __FILE__, result); fflush(0); \
- ASSERT(false, 0); \
- } \
- }
-
-#if __TBB_LRB_HOST
-
-#include "host/XN0_host.h"
-
-#else /* !__TBB_LRB_HOST */
-
-#if __TBB_LRB_NO_XN // no LRB launcher needed
-#define REPORT_FATAL_ERROR REPORT
-#define __TBB_TEST_EXPORT
-#else
-
-#include "lrb/XN0_lrb.h"
-#include "harness_assert.h"
-
-#if !__TBB_LRB_OLD_LAUNCHER // new launcher from LRB Tutorial
-
-#define __TBB_TEST_EXPORT
-
-#ifndef _WIN32
-#include <unistd.h> // Needed for usleep
-#include <dlfcn.h>
-#include <string.h>
-#endif
-
-#ifndef HARNESS_NO_MAIN_ARGS
-#define HARNESS_NO_MAIN_ARGS HARNESS_NO_PARSE_COMMAND_LINE
-#endif
-#if HARNESS_NO_MAIN_ARGS
-int main();
-#else
-int main(int, char**);
-#endif
-
-typedef int
-(*Main2FunctionPtr_t)(
- int argc,
- char** argv);
-
-typedef struct
-{
- int argc;
- char** argv;
- Main2FunctionPtr_t mainPtr;
-} main_wrapper_t;
-
-static pthread_t g_mainThread;
-XNEVENT g_mainExitedSyncObj;
-
-#define REPORT_FATAL_ERROR signalExited(-1); REPORT
-
-void signalExited(int Res) {
- fflush(0); // workaraund for LRB printf bug
- // Store the value main returned in the sync object used to
- // signal main has exited, then signal the sync object
- XNCALL(XN0SyncObjectSetUserData(g_mainExitedSyncObj, (int64_t) Res));
- XNCALL(XN0EventSet(g_mainExitedSyncObj));
-}
-
-// Wrapper function used to keep track of whether main has returned or not.
-void* mainWrapperFn(void* in_mainInput)
-{
- main_wrapper_t* pWrapper = static_cast<main_wrapper_t*>(in_mainInput);
- int mainResult = pWrapper->mainPtr(pWrapper->argc, pWrapper->argv);
- signalExited( mainResult );
-
- return NULL;
-} /* mainWrapperFn() */
-
-// Argc and argv are encoded in the in_pMiscData - the argc is at the start,
-// the rest of it is argv.
-extern "C" XNNATIVELIBEXPORT void
-SpawnMain(
- XN_BUFFER_LIST in_bufList,
- void* in_pMiscData,
- uint16_t in_pMiscDataSize)
-{
- UNREFERENCED_PARAM(in_bufList);
-
- // First thing we do is register the sync object that will
- // be used to signal when main exits
- XNCALL(XN0EventCreate( XN_NOT_SIGNALED, XN_AUTO_RESET, &g_mainExitedSyncObj));
- XNCALL(XN0SyncObjectRegister( g_mainExitedSyncObj,
- "/Intel/Larrabee SDK Core/mainExitedSyncObj"));
-
- main_wrapper_t* pMainWrapper = static_cast<main_wrapper_t*>(
- malloc(sizeof(main_wrapper_t)));
- ASSERT(NULL != pMainWrapper, 0);
-
- // Figure out how many/how long the argv arguments are and build up
- // an argv buffer.
- pMainWrapper->argc = *(static_cast<int32_t*>(in_pMiscData));
- pMainWrapper->argv = static_cast<char**>(malloc(pMainWrapper->argc * sizeof(char*)));
- char* pCurrentArg = 4 + static_cast<char*>(in_pMiscData);
- for (int i = 0; i < pMainWrapper->argc; i++)
- {
- int currentArgLen = 1 + (int) strlen(pCurrentArg); // Add 1 for null termination
- pMainWrapper->argv[i] = static_cast<char*>(malloc(currentArgLen));
-#ifdef _WIN32
- strcpy_s(pMainWrapper->argv[i], currentArgLen, pCurrentArg);
-#else
- strncpy(pMainWrapper->argv[i], pCurrentArg, currentArgLen);
-#endif
- pCurrentArg = pCurrentArg + currentArgLen;
- }
-
- // Sanity check to make sure length of buffer matches what we found via strlens.
- ASSERT((pCurrentArg - static_cast<char*>(in_pMiscData)) == in_pMiscDataSize, 0);
-
- pMainWrapper->mainPtr = reinterpret_cast<Main2FunctionPtr_t>(main);
-
- pthread_attr_t attr;
- INTCALL(pthread_attr_init(&attr));
- // We want to be able to join the main thread to prove it is gone
- INTCALL(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
-
- INTCALL(pthread_create(&g_mainThread, &attr, mainWrapperFn, pMainWrapper));
-
- pthread_set_name_np(g_mainThread, "main TBB test thread");
- INTCALL(pthread_attr_destroy(&attr)); // Cleanup
-} /* StartMain() */
-
-extern "C" XNNATIVELIBEXPORT void
-RunForAQuantum(
- XN_BUFFER_LIST in_bufList,
- void* in_pMiscData,
- uint16_t in_pMiscDataSize)
-{
- UNREFERENCED_PARAM(in_bufList);
-
- ASSERT(sizeof(uint32_t) == in_pMiscDataSize, 0);
- uint32_t msToSleep = *static_cast<uint32_t*>(in_pMiscData);
-
-#ifdef _WIN32
- // Windows emulation does not implement uSleep
- Sleep((DWORD) msToSleep);
-#else
- usleep(1000 * msToSleep); // usleep is in microseconds
-#endif
-} /* RunForAQuantum() */
-
-#else // __TBB_LRB_OLD_LAUNCHER
-
-#define __TBB_STDARGS_BROKEN 1
-#define __TBB_TEST_EXPORT XNNATIVELIBEXPORT
-namespace Harness {
- namespace internal {
-
- class LrbReporter {
- XNCOMMUNICATOR m_communicator;
-
- public:
- LrbReporter () {
- XNERROR res = XN0MessageCreateCommunicator( __TBB_LRB_COMMUNICATOR_NAME,
- __TBB_LRB_COMM_MSG_SIZE_MAX,
- &m_communicator );
- assert( XN_SUCCESS == res );
- }
-
- ~LrbReporter () {
- XN0MessageDestroyCommunicator( m_communicator );
- }
-
- void Report ( const char* msg ) {
- XN0MessageSend( m_communicator, msg, __TBB_LRB_COMM_MSG_SIZE_MAX );
- }
- }; // class LrbReporter
-
- } // namespace internal
-} // namespace Harness
-
-#define TbbHarnessReporter LrbReporter
-#define REPORT_FATAL_ERROR REPORT(__TBB_MSG_ABORT); REPORT
-#endif // __TBB_LRB_OLD_LAUNCHER
-
-#endif//__TBB_LRB_NO_XN
-
-#if __TBB_LRB_NATIVE
- #define TBB_EXIT_ON_ASSERT 1
- #define __TBB_EXCEPTION_HANDLING_BROKEN 1
- #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1
- #define __TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN 1
-#else
- #define TBB_TERMINATE_ON_ASSERT 1
-#endif
-
-// Suppress warnings caused by windows.h during NetSim build
-#pragma warning (disable: 4005)
-
-#endif /* !__TBB_LRB_HOST */
-
-#endif /* tbb_test_harness_lrb_H */
diff --git a/src/test/harness_lrb_host.cpp b/src/test/harness_lrb_host.cpp
deleted file mode 100644
index 7d13550..0000000
--- a/src/test/harness_lrb_host.cpp
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- Copyright 2005-2010 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.
-*/
-
-/** @file harness_lrb_host.cpp
- This is the launcher for TBB tests compiled for native or NetSim environments.
-**/
-
-#include <windows.h>
-
-#define __TBB_LRB_HOST 1
-#include "harness_lrb.h"
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#define HARNESS_CUSTOM_MAIN 1
-#include "harness.h"
-#include <assert.h>
-
-bool IsSupportedTest ( int argc, char* argv[] ) {
- const char* test[] = {
- "test_openmp",
- "test_model_plugin",
- "test_tbb_version",
- "malloc_overload",
- NULL
- };
- for ( size_t i = 0; test[i]; ++i ) {
- for ( size_t j = 1; j < argc; ++j ) {
- if ( strstr(argv[j], test[i]) )
- return false;
- }
- }
- return true;
-}
-
-#if !__TBB_LRB_OLD_LAUNCHER
-
-char* ConfigAndExt();
-
-XNERROR LoadNativeAppWrapper(
- const char* pTestName,
- XNCONTEXT* out_pContext,
- XNLIBRARY* out_pLibrary)
-{
- XNERROR result = XN_SUCCESS;
-
- UINT32 NumberOfEngines = XN0EngineGetCount1( XN_ISA_LRB1, NULL );
- if (0 == NumberOfEngines)
- {
- printf("ERROR: No Larrabee card detected\n");
- result = XN_NOT_INITIALIZED;
- goto end;
- }
-
- XNENGINE engine;
- XNCALL(XN0EngineGetHandle1( XN_ISA_LRB1, NULL, 0, &engine ));
-
- XNCALL(XN0ContextCreate1(engine, out_pContext));
-
- char path[MAX_PATH];
- DWORD pathLength = GetModuleFileNameA( NULL, path, MAX_PATH );
- while ( path[--pathLength] != '\\' ) {};
- path[++pathLength] = 0; // Terminate the string just after the path
- char libName[MAX_PATH];
- sprintf_s( libName, "%s%s", path, pTestName );
- XNCALL(XN0ContextLoadLib3(*out_pContext, libName, 0, out_pLibrary));
-
-end:
- return result;
-} /* LoadNativeAppWrapper() */
-
-
-XNERROR
-SpawnMain(
- XNLIBRARY in_pWrapperLibrary,
- int in_argc,
- char** in_ppArgv)
-{
- XNERROR result = XN_SUCCESS;
-
- XN_BUFFER_LIST bufList;
- bufList.numBufs = 0;
- bufList.pBufArray = NULL;
-
- XNFUNCTION SpawnMainHandle;
- XNCALL(XN0ContextGetLibFunctionHandle(in_pWrapperLibrary, "SpawnMain", &SpawnMainHandle));
-
- // Argc and argv by the time they are passed into us count and point to
- // the arguments to pass to the LRB native app's main.
- // Calculate size of buffer needed to hold all args
- int argBufLen = sizeof(int);
- for (int i = 0; i < in_argc; i++)
- {
- argBufLen += (int) strnlen(in_ppArgv[i], 512);
- argBufLen++; // Leave space for null termination
- }
- void* pArgBuffer = malloc(argBufLen);
- assert(NULL != pArgBuffer);
-
- // Place argc at the start of the buffer
- *(int*) pArgBuffer = in_argc;
- // Copy in the argvs to the rest of it
- char* pCurrentArgBufPosition = &((static_cast<char*>(pArgBuffer))[4]);
- int currentArgBufPosition = 4;
- for (int i = 0; i < in_argc; i++)
- {
- strcpy_s(pCurrentArgBufPosition,
- argBufLen - currentArgBufPosition,
- in_ppArgv[i]);
- currentArgBufPosition += (int) strlen(in_ppArgv[i]);
- currentArgBufPosition += 1; // For null termination byte
- pCurrentArgBufPosition = pCurrentArgBufPosition + (int) strlen(in_ppArgv[i]) + 1;
- }
-
- XNCALL(XN0ContextRunFunction(SpawnMainHandle, bufList, pArgBuffer, (uint16_t) currentArgBufPosition));
-
- free(pArgBuffer);
-
- return result;
-} /* LoadNativeApp() */
-
-
-XNERROR
-WaitForNativeMainToExit(
- int &out_Result,
- XNLIBRARY in_wrapperLibrary)
-{
- XNFUNCTION RunForAQuantum;
- XNCALL(XN0ContextGetLibFunctionHandle(in_wrapperLibrary, "RunForAQuantum", &RunForAQuantum));
- /*
- printf("Sending quanta of duration 10ms at frequency 10hz to allow main\n");
- printf("to execute while waiting for it to exit\n\n");
- printf("\tSending quanta:/");
- */
-
- // Look up the sync object the LRB side will set when main has exited
- XNSYNCOBJECT mainExitedSyncObj;
- while ( XN_DOES_NOT_EXIST ==
- XN0SyncObjectLookup(
- "/Intel/Larrabee SDK Core/mainExitedSyncObj", &mainExitedSyncObj ) ) {};
-
- XNERROR xnResult;
- uint32_t quantaExecuted = 0;
- do
- {
- XN_BUFFER_LIST bufList = { 0, NULL };
- uint32_t quantum = 10; // Let native app run for 10ms at a time
- XNCALL(XN0ContextRunFunction(RunForAQuantum, bufList, &quantum, sizeof(quantum)));
- /*
- switch(quantaExecuted++ % 4)
- {
- case 0: printf("\b-");break;
- case 1: printf("\b\\");break;
- case 2: printf("\b|");break;
- case 3: printf("\b/");break;
- }
- */
- Sleep(100); // Send 10 quanta per second
- xnResult = XN0SyncObjectWaitWithTimeout(mainExitedSyncObj, 0);
- } while (XN_SUCCESS != xnResult);
-
- int64_t mainResult;
- XNCALL(XN0SyncObjectGetUserData(mainExitedSyncObj, &mainResult));
- XNCALL(XN0SyncObjectRelease(&mainExitedSyncObj, 1));
-
- out_Result = int(mainResult);
- return XN_SUCCESS;
-}
-
-XNERROR
-Cleanup(
- XNCONTEXT in_context,
- XNLIBRARY in_wrapperLibrary)
-{
- XNCALL(XN0ContextUnloadLib1(in_wrapperLibrary));
- XNCALL(XN0ContextDestroy(in_context));
- return XN_SUCCESS;
-} /* Cleanup() */
-
-
-int main(int argc, char** argv)
-{
- int Result = 0;
-
- if (argc < 2) {
- printf( "Usage: %s test_name [test_args]\n", argv[0] );
- return -1;
- }
- if ( !IsSupportedTest(argc, argv) ) {
- printf(__TBB_MSG_SKIP);
- return 0;
- }
-
- XNCONTEXT context;
- XNLIBRARY wrapperLibrary;
- XNCALL(LoadNativeAppWrapper(argv[1], &context, &wrapperLibrary));
-
- XNCALL(SpawnMain(wrapperLibrary, argc-1, argv+1));
-
- XNCALL(WaitForNativeMainToExit(Result, wrapperLibrary));
-
- XNCALL(Cleanup(context, wrapperLibrary));
-
- return Result;
-} /* main() */
-
-#else // __TBB_LRB_OLD_LAUNCHER
-#define __TBB_HOST_EXIT(status) exitStatus = status; goto hard_stop;
-
-bool IsCompletionMsg ( const char* msg ) {
- return strncmp(msg, __TBB_MSG_DONE, __TBB_LRB_COMM_MSG_SIZE_MAX) == 0 ||
- strncmp(msg, __TBB_MSG_SKIP, __TBB_LRB_COMM_MSG_SIZE_MAX) == 0;
-}
-
-int main( int argc, char* argv[] ) {
- int exitStatus = 0;
-
- if (argc < 2) {
- printf( "Usage: %s test_name test_args\n", argv[0] );
- __TBB_HOST_EXIT(-1);
- }
- if ( !IsSupportedTest(argc, argv) ) {
- printf(__TBB_MSG_SKIP);
- __TBB_HOST_EXIT(0);
- }
-
- XNENGINE engine;
- XNERROR result = XN0EngineGetHandle(0, &engine);
- assert( XN_SUCCESS == result );
-
- // Try with a run schedule of one second
- XN_RUN_SCHEDULE runSchedule;
- runSchedule.executionQuantumInUsecs = 500000;
- runSchedule.frequencyInHz = 1;
-
- XNCONTEXT ctxHandle;
- result = XN0ContextCreate(engine, &runSchedule, &ctxHandle);
- assert( XN_SUCCESS == result );
-
- XNCOMMUNICATOR communicator;
- result = XN0MessageCreateCommunicator( __TBB_LRB_COMMUNICATOR_NAME, __TBB_LRB_COMM_MSG_SIZE_MAX, &communicator );
- assert( XN_SUCCESS == result );
-
- XNLIBRARY libHandle;
- if ( argc == 2 )
- result = XN0ContextLoadLib(ctxHandle, argv[1], &libHandle);
- else
- result = XN0ContextLoadLib1(ctxHandle, argv[1], argc - 1, argv + 1, &libHandle);
- if( result != XN_SUCCESS ) {
- printf( "ERROR: Loading module \"%s\" failed", argv[1] );
- __TBB_HOST_EXIT(-2);
- }
-
- char msg[__TBB_LRB_COMM_MSG_SIZE_MAX + 1] = { 0 };
- bool abort_signalled = false;
- for( ; !IsCompletionMsg(msg); ) {
- XN0MessageReceive( communicator, msg, __TBB_LRB_COMM_MSG_SIZE_MAX, NULL );
- if ( strncmp(msg, __TBB_MSG_ABORT, __TBB_LRB_COMM_MSG_SIZE_MAX ) == 0 ) {
- abort_signalled = true;
- // The next message should provide the reason
- continue;
- }
- printf("%s\n", msg); fflush(stdout);
- if ( abort_signalled ) {
- // After exit() or abort() was invoked in a LRB library, it cannot be
- // unloaded, and the host hangs in XN0ContextDestroy. Thus we have to
- // bypass the graceful termination code.
- __TBB_HOST_EXIT(1);
- }
- }
- XN0MessageDestroyCommunicator( communicator );
-
- result = XN0ContextUnloadLib(libHandle, 10 * 1000, &exitStatus);
- if( result == XN_TIME_OUT_REACHED ) {
- printf("ERROR: timed out waiting for LRB module unload\n");
- }
- else {
- result = XN0ContextDestroy(ctxHandle);
- assert( XN_SUCCESS == result );
- }
- if ( exitStatus != 0 )
- printf("ERROR: %s returned failure status %d", argv[1], exitStatus);
-hard_stop:
- fflush(stdout);
- // We do not need a dump of memory leaks statistics
- TerminateProcess( GetCurrentProcess(), 0 );
- return 0;
-}
-#endif // __TBB_LRB_OLD_LAUNCHER
diff --git a/src/test/harness_memory.h b/src/test/harness_memory.h
index 6f68e94..dca372f 100644
--- a/src/test/harness_memory.h
+++ b/src/test/harness_memory.h
@@ -50,7 +50,7 @@ const size_t shared_size = SHARED_TEXT_REGION_SIZE+SHARED_DATA_REGION_SIZE;
const size_t shared_size = 0;
#endif
-#elif _WIN32
+#elif _WIN32 && !_XBOX
#include <windows.h>
#include <psapi.h>
#if _MSC_VER
@@ -62,7 +62,14 @@ const size_t shared_size = 0;
//! Return estimate of number of bytes of memory that this program is currently using.
/* Returns 0 if not implemented on platform. */
size_t GetMemoryUsage() {
-#if __linux__
+#if _XBOX
+ return 0;
+#elif _WIN32
+ PROCESS_MEMORY_COUNTERS mem;
+ bool status = GetProcessMemoryInfo(GetCurrentProcess(), &mem, sizeof(mem))!=0;
+ ASSERT(status, NULL);
+ return mem.PagefileUsage;
+#elif __linux__
FILE* statsfile = fopen("/proc/self/statm","r");
size_t pagesize = getpagesize();
ASSERT(statsfile, NULL);
@@ -81,11 +88,6 @@ size_t GetMemoryUsage() {
status = task_info(mach_task_self(), TASK_BASIC_INFO, reinterpret_cast<task_info_t>(&info), &msg_type);
ASSERT(status==KERN_SUCCESS, NULL);
return info.virtual_size - shared_size;
-#elif _WIN32
- PROCESS_MEMORY_COUNTERS mem;
- bool status = GetProcessMemoryInfo(GetCurrentProcess(), &mem, sizeof(mem))!=0;
- ASSERT(status, NULL);
- return mem.PagefileUsage;
#else
return 0;
#endif
diff --git a/src/test/harness_report.h b/src/test/harness_report.h
index d91bfc1..034f958 100644
--- a/src/test/harness_report.h
+++ b/src/test/harness_report.h
@@ -55,9 +55,6 @@
#include <cstdarg>
-#if __LRB__
-#include "harness_lrb.h"
-#endif
#if _MSC_VER
#define snprintf _snprintf
@@ -159,7 +156,7 @@ namespace Harness {
//! printf style remark macro
/** Produces output only when the test is run with the -v (verbose) option. **/
-#define REMARK !Verbose ? (void)0 : TRACE
+#define REMARK !Verbose ? (void)0 : TRACENL
//! printf style remark macro
/** Produces output only when invoked first time.
diff --git a/src/test/test_allocator_STL.h b/src/test/test_allocator_STL.h
index 6b12bc3..54820c0 100644
--- a/src/test/test_allocator_STL.h
+++ b/src/test/test_allocator_STL.h
@@ -63,12 +63,22 @@ void TestMap() {
ASSERT( m.find(i)->second==i*i, NULL );
}
+#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 <deque>
#include <list>
#include <map>
#include <set>
#include <vector>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
template<typename Allocator>
void TestAllocatorWithSTL() {
typedef typename Allocator::template rebind<int>::other Ai;
diff --git a/src/test/test_assembly.cpp b/src/test/test_assembly.cpp
index 6f5058a..0496a13 100644
--- a/src/test/test_assembly.cpp
+++ b/src/test/test_assembly.cpp
@@ -27,69 +27,29 @@
*/
// Program for basic correctness testing of assembly-language routines.
-// This program deliberately #includes ../internal/task.cpp so that
-// it can get intimate access to the scheduler.
-
-// Test correctness of forceful TBB initialization before any dynamic initialization
-// of static objects inside the library took place.
-namespace tbb {
-namespace internal {
- // Forward declaration of the TBB general initialization routine from task.cpp
- void DoOneTimeInitializations();
-}}
-
-struct StaticInitializationChecker {
- StaticInitializationChecker () { tbb::internal::DoOneTimeInitializations(); }
-} theChecker;
-
-#define TEST_ASSEMBLY_ROUTINES 1
-#define __TBB_TASK_CPP_DIRECTLY_INCLUDED 1
-// to avoid usage of #pragma comment
-#define __TBB_NO_IMPLICIT_LINKAGE 1
-
-#include "../tbb/task.cpp"
-#include <new>
-#include "harness.h"
-namespace tbb {
+#include "tbb/task.h"
-namespace internal {
+#include <new>
+#include "harness.h"
-class TestTask: public task {
-public:
- /*override*/ task* execute() {
- return NULL;
- }
- const char* name;
- TestTask( const char* name_ ) : name(name_) {}
-};
-
-void GenericScheduler::test_assembly_routines() {
- __TBB_ASSERT( assert_okay(), NULL );
- try_enter_arena();
- ASSERT( arena_slot->task_pool == dummy_slot.task_pool, "entering arena must not lock the task pool" );
- arena->mark_pool_full();
- acquire_task_pool();
- release_task_pool();
- acquire_task_pool(); // leave_arena requires the pool to be locked
- leave_arena();
-}
+using tbb::internal::reference_count;
//! Test __TBB_CompareAndSwapW
static void TestCompareExchange() {
- ASSERT( intptr(-10)<10, "intptr not a signed integral type?" );
+ ASSERT( intptr_t(-10)<10, "intptr_t not a signed integral type?" );
REMARK("testing __TBB_CompareAndSwapW\n");
- for( intptr a=-10; a<10; ++a )
- for( intptr b=-10; b<10; ++b )
- for( intptr c=-10; c<10; ++c ) {
+ for( intptr_t a=-10; a<10; ++a )
+ for( intptr_t b=-10; b<10; ++b )
+ for( intptr_t c=-10; c<10; ++c ) {
// Workaround for a bug in GCC 4.3.0; and one more is below.
#if __GNUC__==4&&__GNUC_MINOR__==3&&__GNUC_PATCHLEVEL__==0
- intptr x;
+ intptr_t x;
__TBB_store_with_release( x, a );
#else
- intptr x = a;
+ intptr_t x = a;
#endif
- intptr y = __TBB_CompareAndSwapW(&x,b,c);
+ intptr_t y = __TBB_CompareAndSwapW(&x,b,c);
ASSERT( y==a, NULL );
if( a==c )
ASSERT( x==b, NULL );
@@ -101,16 +61,16 @@ static void TestCompareExchange() {
//! Test __TBB___TBB_FetchAndIncrement and __TBB___TBB_FetchAndDecrement
static void TestAtomicCounter() {
// "canary" is a value used to detect illegal overwrites.
- const internal::reference_count canary = ~(internal::uintptr)0/3;
+ const reference_count canary = ~(uintptr_t)0/3;
REMARK("testing __TBB_FetchAndIncrement\n");
struct {
- internal::reference_count prefix, i, suffix;
+ reference_count prefix, i, suffix;
} x;
x.prefix = canary;
x.i = 0;
x.suffix = canary;
for( int k=0; k<10; ++k ) {
- internal::reference_count j = __TBB_FetchAndIncrementWacquire((volatile void *)&x.i);
+ reference_count j = __TBB_FetchAndIncrementWacquire((volatile void *)&x.i);
ASSERT( x.prefix==canary, NULL );
ASSERT( x.suffix==canary, NULL );
ASSERT( x.i==k+1, NULL );
@@ -119,7 +79,7 @@ static void TestAtomicCounter() {
REMARK("testing __TBB_FetchAndDecrement\n");
x.i = 10;
for( int k=10; k>0; --k ) {
- internal::reference_count j = __TBB_FetchAndDecrementWrelease((volatile void *)&x.i);
+ reference_count j = __TBB_FetchAndDecrementWrelease((volatile void *)&x.i);
ASSERT( j==k, NULL );
ASSERT( x.i==k-1, NULL );
ASSERT( x.prefix==canary, NULL );
@@ -131,7 +91,7 @@ static void TestTinyLock() {
REMARK("testing __TBB_LockByte\n");
unsigned char flags[16];
for( int i=0; i<16; ++i )
- flags[i] = i;
+ flags[i] = (unsigned char)i;
#if __GNUC__==4&&__GNUC_MINOR__==3&&__GNUC_PATCHLEVEL__==0
__TBB_store_with_release( flags[8], 0 );
#else
@@ -166,30 +126,15 @@ static void TestPause() {
}
-} // namespace internal
-} // namespace tbb
-
-using namespace tbb;
-
int TestMain () {
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
- try {
-#endif
+ __TBB_TRY {
TestLog2();
TestTinyLock();
TestCompareExchange();
TestAtomicCounter();
TestPause();
-
- task_scheduler_init init(1);
-
- REMARK("testing __TBB_(scheduler assists)\n");
- GenericScheduler* scheduler = internal::Governor::local_scheduler();
- scheduler->test_assembly_routines();
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
- } catch(...) {
+ } __TBB_CATCH(...) {
ASSERT(0,"unexpected exception");
}
-#endif
return Harness::Done;
}
diff --git a/src/test/test_atomic.cpp b/src/test/test_atomic.cpp
index 2ac758e..2b6322e 100644
--- a/src/test/test_atomic.cpp
+++ b/src/test/test_atomic.cpp
@@ -60,6 +60,11 @@ struct TestStruct {
#pragma warning( pop )
#endif
+#if defined(__INTEL_COMPILER)
+ // reference to EBX in a function requiring stack alignment
+ #pragma warning( disable: 998 )
+#endif
+
//! 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 ) {
@@ -259,7 +264,7 @@ void TestAtomicInteger( const char* name ) {
// SUNPRO_CC does have this problem as well
if( sizeof(T)==8 ) {
if( sizeof(AlignmentChecker<T>)!=2*sizeof(tbb::atomic<T>) ) {
- REPORT("Warning: alignment for atomic<%s> is wrong (known issue with gcc 3.3 and sunCC 5.9 2008/01/28 for IA32)\n",name);
+ REPORT("Known issue: alignment for atomic<%s> is wrong with gcc 3.3 and sunCC 5.9 2008/01/28 for IA32\n",name);
}
} else
#endif /* ( __linux__ && __TBB_x86_32 && __GNUC__==3 && __GNUC_MINOR__==3 ) || defined(__SUNPRO_CC) */
@@ -467,7 +472,7 @@ int TestMain () {
TestAtomicInteger<unsigned long long>("unsigned long long");
TestAtomicInteger<long long>("long long");
#else
- REPORT("Warning: atomic<64-bits> not tested because of known problem in Microsoft compiler\n");
+ REPORT("Known issue: atomic<64-bits> does not compile with VC 7.1\n");
#endif /*defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400 */
TestAtomicInteger<unsigned long>("unsigned long");
TestAtomicInteger<long>("long");
diff --git a/src/test/test_blocked_range.cpp b/src/test/test_blocked_range.cpp
index 386dba2..2ee2c88 100644
--- a/src/test/test_blocked_range.cpp
+++ b/src/test/test_blocked_range.cpp
@@ -90,8 +90,8 @@ static void SerialTest() {
}
}
-#include "harness.h"
#include "tbb/parallel_for.h"
+#include "harness.h"
const int N = 1<<22;
diff --git a/src/test/test_blocked_range2d.cpp b/src/test/test_blocked_range2d.cpp
index d13cc39..5eb109c 100644
--- a/src/test/test_blocked_range2d.cpp
+++ b/src/test/test_blocked_range2d.cpp
@@ -113,8 +113,8 @@ static void SerialTest() {
}
}
-#include "harness.h"
#include "tbb/parallel_for.h"
+#include "harness.h"
const int N = 1<<10;
diff --git a/src/test/test_blocked_range3d.cpp b/src/test/test_blocked_range3d.cpp
index 48c1289..259cce7 100644
--- a/src/test/test_blocked_range3d.cpp
+++ b/src/test/test_blocked_range3d.cpp
@@ -139,8 +139,8 @@ static void SerialTest() {
}
}
-#include "harness.h"
#include "tbb/parallel_for.h"
+#include "harness.h"
const int N = 1<<5;
diff --git a/src/test/test_combinable.cpp b/src/test/test_combinable.cpp
index 9aac01c..b395f04 100644
--- a/src/test/test_combinable.cpp
+++ b/src/test/test_combinable.cpp
@@ -36,10 +36,20 @@
#include "tbb/tbb_allocator.h"
#include "tbb/tbb_thread.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 <cstring>
#include <vector>
#include <utility>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "harness_assert.h"
#include "harness.h"
diff --git a/src/test/test_compiler.cpp b/src/test/test_compiler.cpp
index 039c000..5a5834c 100644
--- a/src/test/test_compiler.cpp
+++ b/src/test/test_compiler.cpp
@@ -59,11 +59,14 @@ void TestBoolRepresentation () {
template <typename E>
void TestExceptionClassExports ( const E& exc, tbb::internal::exception_id eid ) {
+ // The assertion here serves to shut up warnings about "eid not used".
+ ASSERT( eid<tbb::internal::eid_max, NULL );
+#if TBB_USE_EXCEPTIONS
for ( int i = 0; i < 2; ++i ) {
try {
if ( i == 0 )
throw exc;
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
else
tbb::internal::throw_exception( eid );
#endif
@@ -75,6 +78,9 @@ void TestExceptionClassExports ( const E& exc, tbb::internal::exception_id eid )
ASSERT ( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unrecognized exception. Likely RTTI related exports are missing" );
}
}
+#else /* !TBB_USE_EXCEPTIONS */
+ (void)exc;
+#endif /* !TBB_USE_EXCEPTIONS */
}
void TestExceptionClassesExports () {
diff --git a/src/test/test_concurrent_hash_map.cpp b/src/test/test_concurrent_hash_map.cpp
index 6cf0ca2..caeb12d 100644
--- a/src/test/test_concurrent_hash_map.cpp
+++ b/src/test/test_concurrent_hash_map.cpp
@@ -66,6 +66,19 @@ void test_ADL() {
}
#endif
+struct UserDefinedKeyType {
+};
+
+namespace tbb {
+ // Test whether tbb_hash_compare can be partially specialized as stated in Reference manual.
+ template<> struct tbb_hash_compare<UserDefinedKeyType> {
+ size_t hash( UserDefinedKeyType ) const {return 0;}
+ bool equal( UserDefinedKeyType /*x*/, UserDefinedKeyType /*y*/ ) {return true;}
+ };
+};
+
+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):
// http://www.threadingbuildingblocks.org/bug_desc.php?id=120
tbb::concurrent_hash_map<std::pair<std::pair<int,std::string>,const char*>,int> TestInstantiation;
@@ -117,7 +130,7 @@ public:
my_state = LIVE;
data = i;
if(MyDataCountLimit && MyDataCount + 1 >= MyDataCountLimit)
- throw MyException();
+ __TBB_THROW( MyException() );
++MyDataCount;
}
MyData( const MyData& other ) {
@@ -125,7 +138,7 @@ public:
my_state = LIVE;
data = other.data;
if(MyDataCountLimit && MyDataCount + 1 >= MyDataCountLimit)
- throw MyException();
+ __TBB_THROW( MyException() );
++MyDataCount;
}
~MyData() {
@@ -776,15 +789,15 @@ void TestIteratorsAndRanges() {
void TestRehash() {
REMARK("testing rehashing\n");
- MyTable v;
- v.insert( std::make_pair(MyKey::make(-5), MyData()) );
- v.rehash(); // without this, assertion will fail
- MyTable::const_iterator it = v.begin();
+ MyTable w;
+ w.insert( std::make_pair(MyKey::make(-5), MyData()) );
+ w.rehash(); // without this, assertion will fail
+ MyTable::const_iterator it = w.begin();
int i = 0; // check for non-rehashed buckets
- for( ; it != v.end(); ++it, i++ )
- v.count( it->first );
+ for( ; it != w.end(); ++it, i++ )
+ w.count( it->first );
ASSERT( i == 1, NULL );
- for( int i=0; i<1000; i=(i<29 ? i+1 : i*2) ) {
+ for( i=0; i<1000; i=(i<29 ? i+1 : i*2) ) {
for( int j=max(256+i, i*2); j<10000; j*=3 ) {
MyTable v;
FillTable( v, i );
@@ -797,6 +810,7 @@ void TestRehash() {
}
}
+#if TBB_USE_EXCEPTIONS
void TestExceptions() {
typedef local_counting_allocator<tbb::tbb_allocator<MyData2> > allocator_t;
typedef tbb::concurrent_hash_map<MyKey,MyData2,MyHashCompare,allocator_t> ThrowingTable;
@@ -865,6 +879,7 @@ void TestExceptions() {
}
src.clear(); MyDataCount = 0;
}
+#endif /* TBB_USE_EXCEPTIONS */
//------------------------------------------------------------------------
// Test driver
@@ -884,9 +899,9 @@ int TestMain () {
TestRehash();
TestAssignment();
TestIteratorsAndRanges();
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if TBB_USE_EXCEPTIONS
TestExceptions();
-#endif
+#endif /* TBB_USE_EXCEPTIONS */
// Do concurrency tests.
for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
diff --git a/src/test/test_concurrent_monitor.cpp b/src/test/test_concurrent_monitor.cpp
new file mode 100644
index 0000000..71246d8
--- /dev/null
+++ b/src/test/test_concurrent_monitor.cpp
@@ -0,0 +1,244 @@
+/*
+ Copyright 2005-2010 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/concurrent_monitor.h"
+#include "tbb/atomic.h"
+#include "tbb/parallel_for.h"
+#include "tbb/blocked_range.h"
+#include "harness.h"
+#include "tbb/concurrent_monitor.cpp"
+
+using namespace tbb;
+
+//! Queuing lock with concurrent_monitor; to test concurrent_monitor::notify( Predicate p )
+class QueuingMutex {
+public:
+ //! Construct unacquired mutex.
+ QueuingMutex() { q_tail = NULL; }
+
+ //! The scoped locking pattern
+ class ScopedLock: internal::no_copy {
+ void Initialize() { mutex = NULL; }
+ public:
+ ScopedLock() {Initialize();}
+ ScopedLock( QueuingMutex& m ) { Initialize(); Acquire(m); }
+ ~ScopedLock() { if( mutex ) Release(); }
+ void Acquire( QueuingMutex& m );
+ void Release();
+ void SleepPerhaps();
+
+ private:
+ QueuingMutex* mutex;
+ ScopedLock* next;
+ uintptr_t going;
+ internal::concurrent_monitor::thread_context thr_ctx;
+ };
+
+ friend class ScopedLock;
+private:
+ //! The last competitor requesting the lock
+ atomic<ScopedLock*> q_tail;
+ internal::concurrent_monitor waitq;
+};
+
+struct PredicateEq {
+ void* p;
+ PredicateEq( void* p_ ) : p(p_) {}
+ bool operator() ( void* v ) const {return p==v;}
+};
+
+//! A method to acquire QueuingMutex lock
+void QueuingMutex::ScopedLock::Acquire( QueuingMutex& m )
+{
+ // Must set all fields before the fetch_and_store, because once the
+ // fetch_and_store executes, *this becomes accessible to other threads.
+ mutex = &m;
+ next = NULL;
+ going = 0;
+
+ // The fetch_and_store must have release semantics, because we are
+ // "sending" the fields initialized above to other processors.
+ ScopedLock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
+ if( pred ) {
+ __TBB_ASSERT( !pred->next, "the predecessor has another successor!");
+ pred->next = this;
+ for( int i=0; i<16; ++i ) {
+ if( going!=0ul ) break;
+ __TBB_Yield();
+ }
+ 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);
+}
+
+//! A method to release QueuingMutex lock
+void QueuingMutex::ScopedLock::Release( )
+{
+ if( !next ) {
+ if( this == 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;
+ }
+ // Someone in the queue
+ spin_wait_while_eq( next, (ScopedLock*)0 );
+ }
+ __TBB_store_with_release(next->going, 1);
+ mutex->waitq.notify( PredicateEq(next) );
+done:
+ Initialize();
+}
+
+//! Yield and block; go to sleep
+void QueuingMutex::ScopedLock::SleepPerhaps()
+{
+ bool slept = false;
+ internal::concurrent_monitor& mq = mutex->waitq;
+ mq.prepare_wait( thr_ctx, this );
+ while( going==0ul ) {
+ if( (slept=mq.commit_wait( thr_ctx ))==true )
+ break;
+ mq.prepare_wait( thr_ctx, this );
+ }
+ if( !slept )
+ mq.cancel_wait( thr_ctx );
+}
+
+// Spin lock with concurrent_monitor; to test concurrent_monitor::notify_all() and concurrent_monitor::notify()
+class SpinMutex {
+public:
+ //! Construct unacquired mutex.
+ SpinMutex() : toggle(false) { flag = 0; }
+
+ //! The scoped locking pattern
+ class ScopedLock: internal::no_copy {
+ void Initialize() { mutex = NULL; }
+ public:
+ ScopedLock() {Initialize();}
+ ScopedLock( SpinMutex& m ) { Initialize(); Acquire(m); }
+ ~ScopedLock() { if( mutex ) Release(); }
+ void Acquire( SpinMutex& m );
+ void Release();
+ void SleepPerhaps();
+
+ private:
+ SpinMutex* mutex;
+ internal::concurrent_monitor::thread_context thr_ctx;
+ };
+
+ friend class ScopedLock;
+private:
+ tbb::atomic<unsigned> flag;
+ bool toggle;
+ internal::concurrent_monitor waitq;
+};
+
+//! A method to acquire SpinMutex lock
+void SpinMutex::ScopedLock::Acquire( SpinMutex& m )
+{
+ mutex = &m;
+retry:
+ if( m.flag.compare_and_swap( 1, 0 )!=0 ) {
+ SleepPerhaps();
+ goto retry;
+ }
+}
+
+//! A method to release SpinMutex lock
+void SpinMutex::ScopedLock::Release()
+{
+ bool old_toggle = mutex->toggle;
+ mutex->toggle = !mutex->toggle;
+ mutex->flag = 0;
+ if( old_toggle )
+ mutex->waitq.notify_one();
+ else
+ mutex->waitq.notify_all();
+}
+
+//! Yield and block; go to sleep
+void SpinMutex::ScopedLock::SleepPerhaps()
+{
+ bool slept = false;
+ internal::concurrent_monitor& mq = mutex->waitq;
+ mq.prepare_wait( thr_ctx, this );
+ while( mutex->flag ) {
+ if( (slept=mq.commit_wait( thr_ctx ))==true )
+ break;
+ mq.prepare_wait( thr_ctx, this );
+ }
+ if( !slept )
+ mq.cancel_wait( thr_ctx );
+}
+
+template<typename M>
+struct Counter {
+ typedef M mutex_type;
+ M mutex;
+ volatile long value;
+};
+
+//! Function object for use with parallel_for.h.
+template<typename C>
+struct AddOne: NoAssign {
+ C& counter;
+ /** Increments counter once for each iteration in the iteration space. */
+ void operator()( tbb::blocked_range<size_t>& range ) const {
+ for( size_t i=range.begin(); i!=range.end(); ++i ) {
+ typename C::mutex_type::ScopedLock lock(counter.mutex);
+ counter.value = counter.value+1;
+ }
+ }
+ 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() {
+ 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));
+ if( counter.value!=n )
+ REPORT("ERROR : counter.value=%ld\n",counter.value);
+}
+
+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 the notify_all method
+ Test<SpinMutex>();
+ REMARK( "calling destructor for task_scheduler_init\n" );
+ }
+ return Harness::Done;
+}
diff --git a/src/test/test_concurrent_queue.cpp b/src/test/test_concurrent_queue.cpp
index b6f3cc4..fad9485 100644
--- a/src/test/test_concurrent_queue.cpp
+++ b/src/test/test_concurrent_queue.cpp
@@ -73,6 +73,7 @@ public:
// problem size
static const int N = 50000; // # of bytes
+#if TBB_USE_EXCEPTIONS
//! Exception for concurrent_queue
class Foo_exception : public std::bad_alloc {
public:
@@ -119,6 +120,7 @@ public:
throw Foo_exception();
}
} ;
+#endif /* TBB_USE_EXCEPTIONS */
const size_t MAXTHREAD = 256;
@@ -213,9 +215,9 @@ void TestPushPop( size_t prefill, ptrdiff_t capacity, int nthread ) {
tbb::tick_count t1 = tbb::tick_count::now();
#if !__TBB_FLOATING_POINT_BROKEN
double timing = (t1-t0).seconds();
- REMARK("prefill=%d capacity=%d time = %g = %g nsec/operation\n", int(prefill), int(capacity), timing, timing/(2*M*nthread)*1.E9);
+ REMARK("prefill=%d capacity=%d threads=%d time = %g = %g nsec/operation\n", int(prefill), int(capacity), nthread, timing, timing/(2*M*nthread)*1.E9);
#else
- ((void)capacity); // touch it to suppress the warning
+ REMARK("prefill=%d capacity=%d threads=%d time=%g\n", int(prefill), int(capacity), (t1-t0).seconds(), nthread);
#endif /* !__TBB_FLOATING_POINT_BROKEN */
int sum = 0;
for( int k=0; k<nthread; ++k )
@@ -338,14 +340,14 @@ bool operator!=(const BarIterator& bia, const BarIterator& bib) {
return bia.bar_ptr!=bib.bar_ptr;
}
+#if TBB_USE_EXCEPTIONS
class Bar_exception : public std::bad_alloc {
public:
virtual const char *what() const throw() { return "making the entry invalid"; }
virtual ~Bar_exception() throw() {}
};
-class BarEx
-{
+class BarEx {
enum state_t {
LIVE=0x1234,
DEAD=0xDEAD
@@ -396,6 +398,7 @@ bool operator==(const BarEx& bar1, const BarEx& bar2) {
ASSERT( (bar2.my_id ^ bar2.my_tilda_id) == -1, NULL );
return bar1.my_id==bar2.my_id && bar1.my_tilda_id==bar2.my_tilda_id;
}
+#endif /* TBB_USE_EXCEPTIONS */
#if TBB_DEPRECATED
#define CALL_BEGIN(q,i) (((i)&0x1)?q.begin():q.unsafe_begin())
@@ -502,9 +505,9 @@ void TestConstructors ()
ASSERT( *dqb == *iter, "unexpected element" );
ASSERT( iter==src_queue.unsafe_end(), "different size?" );
-#if __TBB_EXCEPTION_HANDLING_BROKEN || __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN
- REPORT("Warning: Part of the constructor test is skipped due to a known issue.\n");
-#else
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN || __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN
+ REPORT("Known issue: part of the constructor test is skipped.\n");
+#elif TBB_USE_EXCEPTIONS
k = 0;
#if TBB_DEPRECATED==0
unsigned
@@ -544,7 +547,7 @@ void TestConstructors ()
ASSERT( *dqb_ex == *iter_ex, "unexpected element" );
ASSERT( iter_ex==CALL_END(src_queue_ex,size), "different size?" );
}
-#endif
+#endif /* TBB_USE_EXCEPTIONS */
}
template<typename Iterator1, typename Iterator2>
@@ -745,6 +748,7 @@ void TestNegativeQueue( int nthread ) {
}
#endif /* if TBB_DEPRECATED */
+#if TBB_USE_EXCEPTIONS
void TestExceptions() {
typedef static_counting_allocator<std::allocator<FooEx>, size_t> allocator_t;
typedef static_counting_allocator<std::allocator<char>, size_t> allocator_char_t;
@@ -863,6 +867,7 @@ void TestExceptions() {
ASSERT(false, "unexpected exception");
}
}
+#endif /* TBB_USE_EXCEPTIONS */
template<typename T>
struct TestQueueElements: NoAssign {
@@ -894,6 +899,37 @@ void TestPrimitiveTypes( int nthread, T exemplar )
NativeParallelFor( nthread, TestQueueElements<T>(queue,nthread) );
}
+#include "harness_m128.h"
+
+#if HAVE_m128
+
+//! Test concurrent queue with SSE type
+/** Type Queue should be a queue of ClassWithSSE. */
+template<typename Queue>
+void TestSSE() {
+ Queue q1;
+ for( int i=0; i<100; ++i )
+ q1.push(ClassWithSSE(i));
+
+ // 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 );
+ ++ci;
+ }
+
+ for( int i=0; i<101; ++i ) {
+ ClassWithSSE tmp;
+ bool b = q1.try_pop( tmp );
+ ASSERT( b==(i<100), NULL );
+ ASSERT( !b || tmp==ClassWithSSE(i), NULL );
+ }
+}
+#endif /* HAVE_m128 */
+
int TestMain () {
TestEmptyQueue<char>();
TestEmptyQueue<Foo>();
@@ -909,6 +945,10 @@ int TestMain () {
TestPrimitiveTypes( MaxThread, (int)-12 );
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 */
// Test concurrent operations
for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
@@ -923,10 +963,10 @@ int TestMain () {
TestPushPop(prefill,ptrdiff_t(100),nthread);
}
}
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception safety test is skipped due to a known issue.\n");
-#else
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception safety test is skipped.\n");
+#elif TBB_USE_EXCEPTIONS
TestExceptions();
-#endif
+#endif /* TBB_USE_EXCEPTIONS */
return Harness::Done;
}
diff --git a/src/test/test_concurrent_unordered.cpp b/src/test/test_concurrent_unordered.cpp
new file mode 100644
index 0000000..d781e6b
--- /dev/null
+++ b/src/test/test_concurrent_unordered.cpp
@@ -0,0 +1,452 @@
+/*
+ Copyright 2005-2010 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.
+*/
+
+/* Some tests in this source file are based on PPL tests provided by Microsoft. */
+
+#define __TBB_EXTRA_DEBUG 1
+#include "tbb/concurrent_unordered_map.h"
+#include "tbb/parallel_for.h"
+#include "tbb/tick_count.h"
+#include <stdio.h>
+#include "harness.h"
+#include "harness_allocator.h"
+
+using namespace std;
+
+typedef local_counting_allocator<debug_allocator<std::pair<const int,int>,std::allocator> > MyAllocator;
+typedef tbb::concurrent_unordered_map<int, int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> Mycumap;
+//typedef tbb::concurrent_unordered_map<int, int> Mycumap;
+//typedef concurrent_unordered_multimap<int, int> Mycummap;
+
+#define CheckAllocatorE(t,a,f) CheckAllocator(t,a,f,true,__LINE__)
+#define CheckAllocatorA(t,a,f) CheckAllocator(t,a,f,false,__LINE__)
+template<typename MyTable>
+inline void CheckAllocator(MyTable &table, size_t expected_allocs, size_t expected_frees, bool exact = true, int line = 0) {
+ typename MyTable::allocator_type a = table.get_allocator();
+ REMARK("#%d checking allocators: items %u/%u, allocs %u/%u\n", line,
+ unsigned(a.items_allocated), unsigned(a.items_freed), unsigned(a.allocations), unsigned(a.frees) );
+ ASSERT( a.items_allocated == a.allocations, NULL); ASSERT( a.items_freed == a.frees, NULL);
+ if(exact) {
+ ASSERT( a.allocations == expected_allocs, NULL); ASSERT( a.frees == expected_frees, NULL);
+ } else {
+ ASSERT( a.allocations >= expected_allocs, NULL); ASSERT( a.frees >= expected_frees, NULL);
+ ASSERT( a.allocations - a.frees == expected_allocs - expected_frees, NULL );
+ }
+}
+
+template <typename K, typename V = std::pair<const K, K> >
+struct ValueFactory {
+ static V make(const K &value) { return V(value, value); }
+ static K get(const V& value) { return value.second; }
+};
+
+template <typename T>
+struct ValueFactory<T, T> {
+ static T make(const T &value) { return value; }
+ static T get(const T &value) { return value; }
+};
+
+template <typename T>
+struct Value : ValueFactory<typename T::key_type, typename T::value_type> {};
+
+#if _MSC_VER
+#pragma warning(disable: 4189) // warning 4189 -- local variable is initialized but not referenced
+#pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it
+#endif
+
+template<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;
+ }
+ 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 );
+ sum1.first += sum2.first; sum1.second += sum2.second;
+ ASSERT( sum == sum1, "Mismatched ranges after division");
+ }
+ return sum;
+}
+
+template <typename T>
+struct SpecialTests {
+ static void Test() {}
+};
+
+template <>
+struct SpecialTests <Mycumap>
+{
+ static void Test()
+ {
+ Mycumap cont;
+ const Mycumap &ccont(cont);
+
+ // mapped_type& operator[](const key_type& k);
+ cont[1] = 2;
+
+ // bool empty() const;
+ ASSERT(!ccont.empty(), "Concurrent container empty after adding an element");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 1, "Concurrent container size incorrect");
+
+ ASSERT(cont[1] == 2, "Concurrent container size incorrect");
+
+ // mapped_type& at( const key_type& k );
+ // const mapped_type& at(const key_type& k) const;
+ ASSERT(cont.at(1) == 2, "Concurrent container size incorrect");
+ ASSERT(ccont.at(1) == 2, "Concurrent container size incorrect");
+
+ // 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");
+
+ REMARK("passed -- specialized concurrent unordered map tests\n");
+ }
+};
+
+template<typename T>
+void test_basic(const char * str)
+{
+ T cont;
+ const T &ccont(cont);
+
+ // bool empty() const;
+ ASSERT(ccont.empty(), "Concurrent container not empty after construction");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 0, "Concurrent container not empty after construction");
+
+ // size_type max_size() const;
+ ASSERT(ccont.max_size() > 0, "Concurrent container max size invalid");
+
+ //iterator begin();
+ //iterator end();
+ ASSERT(cont.begin() == cont.end(), "Concurrent container iterators invalid after construction");
+ ASSERT(ccont.begin() == ccont.end(), "Concurrent container iterators invalid after construction");
+ ASSERT(cont.cbegin() == cont.cend(), "Concurrent container iterators invalid after construction");
+
+ //std::pair<iterator, bool> insert(const value_type& obj);
+ std::pair<typename T::iterator, bool> ins = cont.insert(Value<T>::make(1));
+ ASSERT(ins.second == true && Value<T>::get(*(ins.first)) == 1, "Element 1 not properly inserted");
+
+ // bool empty() const;
+ ASSERT(!ccont.empty(), "Concurrent container empty after adding an element");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 1, "Concurrent container size incorrect");
+
+ std::pair<typename T::iterator, bool> ins2 = cont.insert(Value<T>::make(1));
+
+ if (T::allow_multimapping)
+ {
+ // std::pair<iterator, bool> insert(const value_type& obj);
+ ASSERT(ins2.second == true && Value<T>::get(*(ins2.first)) == 1, "Element 1 not properly inserted");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 2, "Concurrent container size incorrect");
+
+ // size_type count(const key_type& k) const;
+ ASSERT(ccont.count(1) == 2, "Concurrent container count(1) incorrect");
+
+ // std::pair<iterator, iterator> equal_range(const key_type& k);
+ std::pair<typename T::iterator, typename T::iterator> range = cont.equal_range(1);
+ typename T::iterator it = range.first;
+ ASSERT(it != cont.end() && Value<T>::get(*it) == 1, "Element 1 not properly found");
+ unsigned int count = 0;
+ for (; it != range.second; it++)
+ {
+ count++;
+ ASSERT(Value<T>::get(*it) == 1, "Element 1 not properly found");
+ }
+
+ ASSERT(count == 2, "Range doesn't have the right number of elements");
+ }
+ else
+ {
+ // std::pair<iterator, bool> insert(const value_type& obj);
+ ASSERT(ins2.second == false && ins2.first == ins.first, "Element 1 should not be re-inserted");
+
+ // size_type size() const;
+ ASSERT(ccont.size() == 1, "Concurrent container size incorrect");
+
+ // size_type count(const key_type& k) const;
+ ASSERT(ccont.count(1) == 1, "Concurrent container count(1) incorrect");
+
+ // std::pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
+ // std::pair<iterator, iterator> equal_range(const key_type& k);
+ std::pair<typename T::iterator, typename T::iterator> range = cont.equal_range(1);
+ typename T::iterator i = range.first;
+ ASSERT(i != cont.end() && Value<T>::get(*i) == 1, "Element 1 not properly found");
+ ASSERT(++i == range.second, "Range doesn't have the right number of elements");
+ }
+
+ // const_iterator find(const key_type& k) const;
+ // iterator find(const key_type& k);
+ typename T::iterator it = cont.find(1);
+ ASSERT(it != cont.end() && Value<T>::get(*(it)) == 1, "Element 1 not properly found");
+ ASSERT(ccont.find(1) == it, "Element 1 not properly found");
+
+ // iterator insert(const_iterator hint, const value_type& obj);
+ typename T::iterator it2 = cont.insert(ins.first, Value<T>::make(2));
+ ASSERT(Value<T>::get(*it2) == 2, "Element 2 not properly inserted");
+
+ // T(const T& _Umap)
+ T newcont = ccont;
+ ASSERT(T::allow_multimapping ? (newcont.size() == 3) : (newcont.size() == 2), "Copy construction did not copy the elements properly");
+
+ // size_type unsafe_erase(const key_type& k);
+ typename T::size_type size = cont.unsafe_erase(1);
+ ASSERT(T::allow_multimapping ? (size == 2) : (size == 1), "Erase did not remove the right number of elements");
+
+ // iterator unsafe_erase(const_iterator position);
+ typename T::iterator it4 = cont.unsafe_erase(cont.find(2));
+ ASSERT(it4 == cont.end() && cont.size() == 0, "Erase did not remove the last element properly");
+
+ // template<class InputIterator> void insert(InputIterator first, InputIterator last);
+ cont.insert(newcont.begin(), newcont.end());
+ ASSERT(T::allow_multimapping ? (cont.size() == 3) : (cont.size() == 2), "Range insert did not copy the elements properly");
+
+ // iterator unsafe_erase(const_iterator first, const_iterator last);
+ std::pair<typename T::iterator, typename T::iterator> range2 = newcont.equal_range(1);
+ newcont.unsafe_erase(range2.first, range2.second);
+ ASSERT(newcont.size() == 1, "Range erase did not erase the elements properly");
+
+ // void clear();
+ newcont.clear();
+ ASSERT(newcont.begin() == newcont.end() && newcont.size() == 0, "Clear did not clear the container");
+
+ // T& operator=(const T& _Umap)
+ newcont = ccont;
+ ASSERT(T::allow_multimapping ? (newcont.size() == 3) : (newcont.size() == 2), "Assignment operator did not copy the elements properly");
+
+ // void rehash(size_type n);
+ newcont.rehash(16);
+ ASSERT(T::allow_multimapping ? (newcont.size() == 3) : (newcont.size() == 2), "Rehash should not affect the container elements");
+
+ // float load_factor() const;
+ // float max_load_factor() const;
+ ASSERT(ccont.load_factor() <= ccont.max_load_factor(), "Load factor invalid");
+
+ // void max_load_factor(float z);
+ cont.max_load_factor(16.0f);
+ ASSERT(ccont.max_load_factor() == 16.0f, "Max load factor not properly changed");
+
+ // hasher hash_function() const;
+ ccont.hash_function();
+
+ // key_equal key_eq() const;
+ ccont.key_eq();
+
+ cont.clear();
+ CheckAllocatorA(cont, 1, 0); // one dummy is always allocated
+ for (int i = 0; i < 256; i++)
+ {
+ std::pair<typename T::iterator, bool> ins3 = cont.insert(Value<T>::make(i));
+ 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);
+
+ // size_type unsafe_bucket_count() const;
+ ASSERT(ccont.unsafe_bucket_count() == 16, "Wrong number of buckets");
+
+ // size_type unsafe_max_bucket_count() const;
+ ASSERT(ccont.unsafe_max_bucket_count() > 65536, "Wrong max number of buckets");
+
+ for (unsigned int i = 0; i < 256; i++)
+ {
+ typename T::size_type buck = ccont.unsafe_bucket(i);
+
+ // size_type unsafe_bucket(const key_type& k) const;
+ ASSERT(buck < 16, "Wrong bucket mapping");
+ }
+
+ for (unsigned int i = 0; i < 16; i++)
+ {
+ // size_type unsafe_bucket_size(size_type n);
+ ASSERT(cont.unsafe_bucket_size(i) == 16, "Wrong number elements in a bucket");
+
+ // local_iterator unsafe_begin(size_type n);
+ // const_local_iterator unsafe_begin(size_type n) const;
+ // local_iterator unsafe_end(size_type n);
+ // const_local_iterator unsafe_end(size_type n) const;
+ // const_local_iterator unsafe_cbegin(size_type n) const;
+ // const_local_iterator unsafe_cend(size_type n) const;
+ unsigned int count = 0;
+ for (typename T::iterator bit = cont.unsafe_begin(i); bit != cont.unsafe_end(i); bit++)
+ {
+ count++;
+ }
+ ASSERT(count == 16, "Bucket iterators are invalid");
+ }
+
+ // void swap(T&);
+ cont.swap(newcont);
+ ASSERT(newcont.size() == 256, "Wrong number of elements after swap");
+ ASSERT(newcont.count(200) == 1, "Element with key 200 not present after swap");
+ ASSERT(newcont.count(16) == 1, "Element with key 16 not present after swap");
+ ASSERT(newcont.count(99) == 1, "Element with key 99 not present after swap");
+ ASSERT(T::allow_multimapping ? (cont.size() == 3) : (cont.size() == 2), "Wrong number of elements after swap");
+
+ REMARK("passed -- basic %S tests\n", str);
+
+#if defined (VERBOSE)
+ REMARK("container dump debug:\n");
+ cont._Dump();
+ REMARK("container dump release:\n");
+ cont.dump();
+ REMARK("\n");
+#endif
+
+ SpecialTests<T>::Test();
+}
+
+void test_machine() {
+ ASSERT(__TBB_ReverseByte(0)==0, NULL );
+ ASSERT(__TBB_ReverseByte(1)==0x80, NULL );
+ ASSERT(__TBB_ReverseByte(0xFE)==0x7F, NULL );
+ ASSERT(__TBB_ReverseByte(0xFF)==0xFF, NULL );
+}
+
+template<typename T>
+class FillTable: NoAssign {
+ T &table;
+ const int items;
+ typedef std::pair<typename T::iterator, bool> pairIB;
+public:
+ FillTable(T &t, int i) : table(t), items(i) {
+ ASSERT( !(items&1) && items > 100, NULL);
+ }
+ void operator()(int threadn) const {
+ if( threadn == 0 ) { // Fill even keys forward (single thread)
+ bool last_inserted = true;
+ for( int i = 0; i < items; i+=2 ) {
+ pairIB pib = table.insert(Value<T>::make(i));
+ ASSERT(Value<T>::get(*(pib.first)) == i, "Element not properly inserted");
+ ASSERT( last_inserted || !pib.second, "Previous key was not inserted but this is inserted" );
+ last_inserted = pib.second;
+ }
+ } else if( threadn == 1 ) { // Fill even keys backward (single thread)
+ bool last_inserted = true;
+ for( int i = items-2; i >= 0; i-=2 ) {
+ pairIB pib = table.insert(Value<T>::make(i));
+ ASSERT(Value<T>::get(*(pib.first)) == i, "Element not properly inserted");
+ ASSERT( last_inserted || !pib.second, "Previous key was not inserted but this is inserted" );
+ last_inserted = pib.second;
+ }
+ } else if( !(threadn&1) ) { // Fill odd keys forward (multiple threads)
+ for( int i = 1; i < items; i+=2 ) {
+ pairIB pib = table.insert(Value<T>::make(i));
+ ASSERT(Value<T>::get(*(pib.first)) == i, "Element not properly inserted");
+ }
+ } else { // Check odd keys backward (multiple threads)
+ bool last_found = false;
+ for( int i = items-1; i >= 0; i-=2 ) {
+ typename T::iterator it = table.find(i);
+ if( it != table.end() ) { // found
+ ASSERT(Value<T>::get(*it) == i, "Element not properly inserted");
+ last_found = true;
+ } else ASSERT( !last_found, "Previous key was found but this is not" );
+ }
+ }
+ }
+};
+
+typedef tbb::atomic<unsigned char> AtomicByte;
+
+template<typename RangeType>
+struct ParallelTraverseBody: NoAssign {
+ const int n;
+ AtomicByte* const array;
+ ParallelTraverseBody( AtomicByte an_array[], int a_n ) :
+ n(a_n), array(an_array)
+ {}
+ 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 );
+ ASSERT( 0<=k && k<n, NULL );
+ array[k]++;
+ }
+ }
+};
+
+void CheckRange( AtomicByte array[], int n ) {
+ for( int k=0; k<n; ++k ) {
+ if( array[k] != 1 ) {
+ REPORT("array[%d]=%d\n", k, int(array[k]));
+ ASSERT(false,NULL);
+ }
+ }
+}
+
+template<typename T>
+void test_concurrent(const char *tablename) {
+ T table;
+#if TBB_USE_ASSERT
+ int items = 2000;
+#else
+ int items = 100000;
+#endif
+ tbb::tick_count t0 = tbb::tick_count::now();
+ NativeParallelFor( 16/*min 6*/, FillTable<T>(table, items) );
+ tbb::tick_count t1 = tbb::tick_count::now();
+ REMARK( "time for filling '%s' by %d items = %g\n", tablename, items, (t1-t0).seconds() );
+ ASSERT( int(table.size()) == items, NULL);
+
+ AtomicByte* array = new AtomicByte[items];
+ memset( array, 0, items*sizeof(AtomicByte) );
+
+ typename T::range_type r = table.range();
+ ASSERT(items == CheckRecursiveRange<typename T::iterator>(r).first, NULL);
+ tbb::parallel_for( r, ParallelTraverseBody<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 ));
+ CheckRange( array, items );
+
+ delete[] array;
+
+ table.clear();
+ CheckAllocatorA(table, items+1, items); // one dummy is always allocated
+}
+
+int TestMain () {
+ test_machine();
+ test_basic<Mycumap>("concurrent unordered map");
+ test_concurrent<Mycumap>("concurrent unordered map");
+ return Harness::Done;
+}
diff --git a/src/test/test_concurrent_vector.cpp b/src/test/test_concurrent_vector.cpp
index 9c8e6d9..97aca28 100644
--- a/src/test/test_concurrent_vector.cpp
+++ b/src/test/test_concurrent_vector.cpp
@@ -32,13 +32,14 @@
#include "tbb/tbb_exception.h"
#include <cstdio>
#include <cstdlib>
-#include <stdexcept>
#include "harness_report.h"
#include "harness_assert.h"
#include "harness_allocator.h"
+#if TBB_USE_EXCEPTIONS
static bool known_issue_verbose = false;
#define KNOWN_ISSUE(msg) if(!known_issue_verbose) known_issue_verbose = true, REPORT(msg)
+#endif /* TBB_USE_EXCEPTIONS */
tbb::atomic<long> FooCount;
long MaxFooCount = 0;
@@ -81,10 +82,10 @@ public:
ASSERT( is_valid(), NULL );
return my_bar;
}
- Foo( int bar = initial_value_of_bar ) {
- my_bar = bar;
+ Foo( int barr = initial_value_of_bar ) {
+ my_bar = barr;
if(MaxFooCount && FooCount >= MaxFooCount)
- throw Foo_exception();
+ __TBB_THROW( Foo_exception() );
FooCount++;
state = DefaultInitialized;
}
@@ -92,7 +93,7 @@ public:
my_bar = foo.my_bar;
ASSERT( foo.is_valid_or_zero(), "bad source for copy" );
if(MaxFooCount && FooCount >= MaxFooCount)
- throw Foo_exception();
+ __TBB_THROW( Foo_exception() );
FooCount++;
state = CopyInitialized;
}
@@ -409,24 +410,24 @@ void TestSequentialFor() {
}
// Now go forwards and backwards
- ptrdiff_t j = 0;
+ ptrdiff_t k = 0;
cp = u.begin();
for( size_t i=0; i<u.size(); ++i ) {
- CheckConstIterator(u,int(j),cp);
+ CheckConstIterator(u,int(k),cp);
typename V::difference_type delta = i*3 % u.size();
- if( 0<=j+delta && size_t(j+delta)<u.size() ) {
+ if( 0<=k+delta && size_t(k+delta)<u.size() ) {
V::const_iterator &cpr = (cp += delta);
ASSERT( &cpr == &cp, "+= not returning a reference?");
- j += delta;
+ k += delta;
}
delta = i*7 % u.size();
- if( 0<=j-delta && size_t(j-delta)<u.size() ) {
+ if( 0<=k-delta && size_t(k-delta)<u.size() ) {
if( i&1 ) {
V::const_iterator &cpr = (cp -= delta);
ASSERT( &cpr == &cp, "-= not returning a reference?");
} else
cp = cp - delta; // Test operator-
- j -= delta;
+ k -= delta;
}
}
@@ -678,7 +679,18 @@ void TestAssign() {
}
// Test the comparison operators
+#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 <string>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
void TestComparison() {
std::string str[3]; str[0] = "abc";
str[1].assign("cba");
@@ -752,8 +764,11 @@ void TestFindPrimes() {
double t2 = TimeFindPrimes( tbb::task_scheduler_init::automatic );
// Time parallel run that is very likely oversubscribed.
+#if _XBOX
+ double t128 = TimeFindPrimes(32); //XBOX360 can't handle too many threads
+#else
double t128 = TimeFindPrimes(128);
-
+#endif
REMARK("TestFindPrimes: t2==%g t128=%g k=%g\n", t2, t128, t128/t2);
// We allow the 128-thread run a little extra time to allow for thread overhead.
@@ -782,6 +797,7 @@ void TestSort() {
}
}
+#if TBB_USE_EXCEPTIONS
//------------------------------------------------------------------------
// Test exceptions safety (from allocator and items constructors)
//------------------------------------------------------------------------
@@ -900,7 +916,7 @@ void TestExceptions() {
try {
FooWithAssign &foo = victim.at(i);
if( !foo.is_valid_or_zero() ) {
- std::printf("i: %d size: %zd req_size: %zd state: %d\n", i, size, req_size, foo.state);
+ std::printf("i: %d size: %u req_size: %u state: %d\n", i, unsigned(size), unsigned(req_size), foo.state);
}
int bar = foo.zero_bar();
if(m != grow) ASSERT( bar == i || (t && bar == 0), NULL);
@@ -940,6 +956,25 @@ void TestExceptions() {
ASSERT(false, "unexpected exception");
}
}
+#endif /* TBB_USE_EXCEPTIONS */
+
+//------------------------------------------------------------------------
+// Test SSE
+//------------------------------------------------------------------------
+#include "harness_m128.h"
+
+#if HAVE_m128
+
+void TestSSE() {
+ tbb::concurrent_vector<ClassWithSSE> 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 );
+ }
+}
+#endif /* HAVE_m128 */
+
//------------------------------------------------------------------------
int TestMain () {
@@ -952,6 +987,9 @@ int TestMain () {
TestSequentialFor<FooWithAssign> ();
TestResizeAndCopy();
TestAssign();
+#if HAVE_m128
+ TestSSE();
+#endif /* HAVE_m128 */
#endif
TestCapacity();
ASSERT( !FooCount, NULL );
@@ -968,12 +1006,12 @@ int TestMain () {
TestFindPrimes();
#endif
TestSort();
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception safety test is skipped due to a known issue.\n");
-#else
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception safety test is skipped.\n");
+#elif TBB_USE_EXCEPTIONS
TestExceptions();
-#endif
-#endif//!TBB_DEPRECATED
+#endif /* TBB_USE_EXCEPTIONS */
+#endif /* !TBB_DEPRECATED */
ASSERT( !FooCount, NULL );
REMARK("sizeof(concurrent_vector<int>) == %d\n", (int)sizeof(tbb::concurrent_vector<int>));
return Harness::Done;
diff --git a/src/test/test_condition_variable.h b/src/test/test_condition_variable.h
new file mode 100644
index 0000000..5422557
--- /dev/null
+++ b/src/test/test_condition_variable.h
@@ -0,0 +1,693 @@
+/*
+ Copyright 2005-2010 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/compat/condition_variable"
+#include "tbb/mutex.h"
+#include "tbb/recursive_mutex.h"
+#include "tbb/tick_count.h"
+#include "tbb/atomic.h"
+
+#include "harness.h"
+
+// This test deliberately avoids a "using tbb" statement,
+// so that the error of putting types in the wrong namespace will be caught.
+
+using namespace std;
+
+template<typename M>
+struct Counter {
+ typedef M mutex_type;
+ M mutex;
+ volatile long value;
+ void flog_once_lock_guard( size_t mode );
+ void flog_once_unique_lock( size_t mode );
+};
+
+template<typename M>
+void Counter<M>::flog_once_lock_guard(size_t mode)
+/** Increments counter once for each iteration in the iteration space. */
+{
+ if( mode&1 ) {
+ // Try acquire and release with implicit lock_guard
+ // precondition: if mutex_type is not a recursive mutex, the calling thread does not own the mutex m.
+ // if the prcondition is not met, either dead-lock incorrect 'value' would result in.
+ lock_guard<M> lg(mutex);
+ value = value+1;
+ } else {
+ // Try acquire and release with adopt lock_quard
+ // precodition: the calling thread owns the mutex m.
+ // if the prcondition is not met, incorrect 'value' would result in because the thread unlocks
+ // mutex that it does not own.
+ mutex.lock();
+ lock_guard<M> lg( mutex, adopt_lock );
+ value = value+1;
+ }
+}
+
+template<typename M>
+void Counter<M>::flog_once_unique_lock(size_t mode)
+/** Increments counter once for each iteration in the iteration space. */
+{
+ switch( mode&7 ) {
+ case 0:
+ {// implicitly acquire and release mutex with unique_lock
+ unique_lock<M> ul( mutex );
+ value = value+1;
+ ASSERT( ul==true, NULL );
+ }
+ break;
+ case 1:
+ {// unique_lock with defer_lock
+ unique_lock<M> ul( mutex, defer_lock );
+ ASSERT( ul.owns_lock()==false, NULL );
+ ul.lock();
+ value = value+1;
+ ASSERT( ul.owns_lock()==true, NULL );
+ }
+ break;
+ case 2:
+ {// unique_lock::try_lock() with try_to_lock
+ unique_lock<M> ul( mutex, try_to_lock );
+ if( !ul )
+ while( !ul.try_lock() )
+ __TBB_Yield();
+ value = value+1;
+ }
+ break;
+ case 3:
+ {// unique_lock::try_lock_for() with try_to_lock
+ unique_lock<M> ul( mutex, defer_lock );
+ tbb::tick_count::interval_t i(1.0);
+ while( !ul.try_lock_for( i ) )
+ ;
+ value = value+1;
+ ASSERT( ul.owns_lock()==true, NULL );
+ }
+ break;
+ case 4:
+ {
+ unique_lock<M> ul_o4;
+ {// unique_lock with adopt_lock
+ mutex.lock();
+ unique_lock<M> ul( mutex, adopt_lock );
+ value = value+1;
+ ASSERT( ul.owns_lock()==true, NULL );
+ ASSERT( ul.mutex()==&mutex, NULL );
+ ASSERT( ul_o4.owns_lock()==false, NULL );
+ ASSERT( ul_o4.mutex()==NULL, NULL );
+ swap( ul, ul_o4 );
+ ASSERT( ul.owns_lock()==false, NULL );
+ ASSERT( ul.mutex()==NULL, NULL );
+ ASSERT( ul_o4.owns_lock()==true, NULL );
+ ASSERT( ul_o4.mutex()==&mutex, NULL );
+ ul_o4.unlock();
+ }
+ ASSERT( ul_o4.owns_lock()==false, NULL );
+ }
+ break;
+ case 5:
+ {
+ unique_lock<M> ul_o5;
+ {// unique_lock with adopt_lock
+ mutex.lock();
+ unique_lock<M> ul( mutex, adopt_lock );
+ value = value+1;
+ ASSERT( ul.owns_lock()==true, NULL );
+ ASSERT( ul.mutex()==&mutex, NULL );
+ ASSERT( ul_o5.owns_lock()==false, NULL );
+ ASSERT( ul_o5.mutex()==NULL, NULL );
+ ul_o5.swap( ul );
+ ASSERT( ul.owns_lock()==false, NULL );
+ ASSERT( ul.mutex()==NULL, NULL );
+ ASSERT( ul_o5.owns_lock()==true, NULL );
+ ASSERT( ul_o5.mutex()==&mutex, NULL );
+ ul_o5.unlock();
+ }
+ ASSERT( ul_o5.owns_lock()==false, NULL );
+ }
+ break;
+ default:
+ {// unique_lock with adopt_lock, and release()
+ mutex.lock();
+ unique_lock<M> ul( mutex, adopt_lock );
+ ASSERT( ul==true, NULL );
+ value = value+1;
+ M* old_m = ul.release();
+ old_m->unlock();
+ ASSERT( ul.owns_lock()==false, NULL );
+ }
+ break;
+ }
+}
+
+static tbb::atomic<size_t> Order;
+
+template<typename State, long TestSize>
+struct WorkForLocks: NoAssign {
+ static const size_t chunk = 100;
+ State& state;
+ WorkForLocks( State& state_ ) : state(state_) {}
+ void operator()( int ) const {
+ size_t step;
+ while( (step=Order.fetch_and_add<tbb::acquire>(chunk))<TestSize ) {
+ for( size_t i=0; i<chunk && step<TestSize; ++i, ++step ) {
+ state.flog_once_lock_guard(step);
+ state.flog_once_unique_lock(step);
+ }
+ }
+ }
+};
+
+template<typename M>
+void TestLocks( const char* name, int nthread ) {
+ REMARK("testing %s in TestLocks\n",name);
+ Counter<M> counter;
+ counter.value = 0;
+ Order = 0;
+ const long 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);
+}
+
+static tbb::atomic<int> barrier;
+
+// Test if the constructor works and if native_handle() works
+template<typename M>
+struct WorkForCondVarCtor: NoAssign {
+ condition_variable& my_cv;
+ M& my_mtx;
+ WorkForCondVarCtor( condition_variable& cv_, M& mtx_ ) : my_cv(cv_), my_mtx(mtx_) {}
+ void operator()( int tid ) const {
+ ASSERT( tid<=1, NULL ); // test with 2 threads.
+ condition_variable::native_handle_type handle = my_cv.native_handle();
+ if( tid&1 ) {
+ my_mtx.lock();
+ ++barrier;
+#if _WIN32||_WIN64
+ if( !tbb::interface5::internal::internal_condition_variable_wait( *handle, &my_mtx ) ) {
+ int ec = GetLastError();
+ ASSERT( ec!=WAIT_TIMEOUT, NULL );
+ throw_exception( tbb::internal::eid_condvar_wait_failed );
+ }
+#else
+ if( pthread_cond_wait( handle, my_mtx.native_handle() ) )
+ throw_exception( tbb::internal::eid_condvar_wait_failed );
+#endif
+ ++barrier;
+ my_mtx.unlock();
+ } else {
+ bool res;
+ while( (res=my_mtx.try_lock())==true && barrier==0 ) {
+ my_mtx.unlock();
+ __TBB_Yield();
+ }
+ if( res ) my_mtx.unlock();
+ do {
+#if _WIN32||_WIN64
+ tbb::interface5::internal::internal_condition_variable_notify_one( *handle );
+#else
+ pthread_cond_signal( handle );
+#endif
+ __TBB_Yield();
+ } while ( barrier<2 );
+ }
+ }
+};
+
+static condition_variable* test_cv;
+static tbb::atomic<int> n_waiters;
+
+// Test if the destructor works
+template<typename M>
+struct WorkForCondVarDtor: NoAssign {
+ int nthread;
+ M& my_mtx;
+ WorkForCondVarDtor( int n, M& mtx_ ) : nthread(n), my_mtx(mtx_) {}
+ void operator()( int tid ) const {
+ if( tid==0 ) {
+ unique_lock<M> ul( my_mtx, defer_lock );
+ test_cv = new condition_variable;
+
+ while( n_waiters<nthread-1 )
+ __TBB_Yield();
+ ul.lock();
+ test_cv->notify_all();
+ ul.unlock();
+ while( n_waiters>0 )
+ __TBB_Yield();
+ delete test_cv;
+ } else {
+ while( test_cv==NULL )
+ __TBB_Yield();
+ unique_lock<M> ul(my_mtx);
+ ++n_waiters;
+ test_cv->wait( ul );
+ --n_waiters;
+ }
+ }
+};
+
+static const int max_ticket = 100;
+static const int short_delay = 10;
+static const int long_delay = 100;
+
+tbb::atomic<int> n_signaled;
+tbb::atomic<int> n_done, n_done_1, n_done_2;
+tbb::atomic<int> n_timed_out;
+
+static bool false_to_true;
+
+struct TestPredicateFalseToTrue {
+ TestPredicateFalseToTrue() {}
+ bool operator()() { return false_to_true; }
+};
+
+struct TestPredicateFalse {
+ TestPredicateFalse() {}
+ bool operator()() { return false; }
+};
+
+struct TestPredicateTrue {
+ TestPredicateTrue() {}
+ bool operator()() { return true; }
+};
+
+// Test timed wait and timed wait with pred
+template<typename M>
+struct WorkForCondVarTimedWait: NoAssign {
+ int nthread;
+ condition_variable& test_cv;
+ M& my_mtx;
+ WorkForCondVarTimedWait( int n_, condition_variable& cv_, M& mtx_ ) : nthread(n_), test_cv(cv_), my_mtx(mtx_) {}
+ void operator()( int tid ) const {
+ tbb::tick_count t1, t2;
+
+ unique_lock<M> ul( my_mtx, defer_lock );
+
+ ASSERT( n_timed_out==0, NULL );
+ ++barrier;
+ while( barrier<nthread ) __TBB_Yield();
+
+ // test if a thread times out with wait_for()
+ for( int i=1; i<10; ++i ) {
+ tbb::tick_count::interval_t intv((double)i*0.0001 /*seconds*/);
+ ul.lock();
+ cv_status st = no_timeout;
+ __TBB_TRY {
+ /** Some version of glibc return EINVAL instead 0 when spurious wakeup occurs on pthread_cond_timedwait() **/
+ st = test_cv.wait_for( ul, intv );
+ } __TBB_CATCH( std::runtime_error& ) {}
+ ASSERT( ul, "mutex should have been reacquired" );
+ ul.unlock();
+ if( st==timeout )
+ ++n_timed_out;
+ }
+
+ ASSERT( n_timed_out>0, "should have been timed-out at least once\n" );
+ ++n_done_1;
+ while( n_done_1<nthread ) __TBB_Yield();
+
+ for( int i=1; i<10; ++i ) {
+ tbb::tick_count::interval_t intv((double)i*0.0001 /*seconds*/);
+ ul.lock();
+ __TBB_TRY {
+ /** Some version of glibc return EINVAL instead 0 when spurious wakeup occurs on pthread_cond_timedwait() **/
+ ASSERT( false==test_cv.wait_for( ul, intv, TestPredicateFalse()), "incorrect return value" );
+ } __TBB_CATCH( std::runtime_error& ) {}
+ ASSERT( ul, "mutex should have been reacquired" );
+ ul.unlock();
+ }
+
+ if( tid==0 )
+ n_waiters = 0;
+ // barrier
+ ++n_done_2;
+ while( n_done_2<nthread ) __TBB_Yield();
+
+ // at this point, we know wait_for() successfully times out.
+ // so test if a thread blocked on wait_for() could receive a signal before its waiting time elapses.
+ if( tid==0 ) {
+ // signaler
+ n_signaled = 0;
+ ASSERT( n_waiters==0, NULL );
+ ++n_done_2; // open gate 1
+
+ while( n_waiters<(nthread-1) ) __TBB_Yield(); // wait until all other threads block on cv. flag_1
+
+ ul.lock();
+ test_cv.notify_all();
+ n_waiters = 0;
+ ul.unlock();
+
+ while( n_done_2<2*nthread ) __TBB_Yield();
+ ASSERT( n_signaled>0, "too small an interval?" );
+ n_signaled = 0;
+
+ } else {
+ while( n_done_2<nthread+1 ) __TBB_Yield(); // gate 1
+
+ // sleeper
+ tbb::tick_count::interval_t intv((double)2.0 /*seconds*/);
+ ul.lock();
+ ++n_waiters; // raise flag 1/(nthread-1)
+ t1 = tbb::tick_count::now();
+ cv_status st = test_cv.wait_for( ul, intv ); // gate 2
+ t2 = tbb::tick_count::now();
+ ul.unlock();
+ if( st==no_timeout ) {
+ ++n_signaled;
+ ASSERT( (t2-t1).seconds()<intv.seconds(), "got a signal after timed-out?" );
+ }
+ }
+
+ ASSERT( n_done==0, NULL );
+ ++n_done_2;
+
+ if( tid==0 ) {
+ ASSERT( n_waiters==0, NULL );
+ ++n_done; // open gate 3
+
+ while( n_waiters<(nthread-1) ) __TBB_Yield(); // wait until all other threads block on cv.
+ for( int i=0; i<2*short_delay; ++i ) __TBB_Yield(); // give some time to waiters so that all of them in the waitq
+ ul.lock();
+ false_to_true = true;
+ test_cv.notify_all(); // open gate 4
+ ul.unlock();
+
+ while( n_done<nthread ) __TBB_Yield(); // wait until all other threads wake up.
+ ASSERT( n_signaled>0, "too small an interval?" );
+ } else {
+
+ while( n_done<1 ) __TBB_Yield(); // gate 3
+
+ tbb::tick_count::interval_t intv((double)2.0 /*seconds*/);
+ ul.lock();
+ ++n_waiters;
+ // wait_for w/ predciate
+ t1 = tbb::tick_count::now();
+ ASSERT( test_cv.wait_for( ul, intv, TestPredicateFalseToTrue())==true, NULL ); // gate 4
+ t2 = tbb::tick_count::now();
+ ul.unlock();
+ if( (t2-t1).seconds()<intv.seconds() )
+ ++n_signaled;
+ ++n_done;
+ }
+ }
+};
+
+tbb::atomic<int> ticket_for_sleep, ticket_for_wakeup, signaled_ticket, wokeup_ticket;
+tbb::atomic<unsigned> n_visit_to_waitq;
+unsigned max_waitq_length;
+
+template<typename M>
+struct WorkForCondVarWaitAndNotifyOne: NoAssign {
+ int nthread;
+ condition_variable& test_cv;
+ M& my_mtx;
+ WorkForCondVarWaitAndNotifyOne( int n_, condition_variable& cv_, M& mtx_ ) : nthread(n_), test_cv(cv_), my_mtx(mtx_) {}
+ void operator()( int tid ) const {
+ if( tid&1 ) {
+ // exercise signal part
+ while( ticket_for_wakeup<max_ticket ) {
+ int my_ticket = ++ticket_for_wakeup; // atomically grab the next ticket
+ if( my_ticket>max_ticket )
+ break;
+
+ for( ;; ) {
+ unique_lock<M> ul( my_mtx, defer_lock );
+ ul.lock();
+ if( n_waiters>0 && my_ticket<=ticket_for_sleep && my_ticket==(wokeup_ticket+1) ) {
+ signaled_ticket = my_ticket;
+ test_cv.notify_one();
+ ++n_signaled;
+ ul.unlock();
+ break;
+ }
+ ul.unlock();
+ __TBB_Yield();
+ }
+
+ // give waiters time to go to sleep.
+ for( int m=0; m<short_delay; ++m )
+ __TBB_Yield();
+ }
+ } else {
+ while( ticket_for_sleep<max_ticket ) {
+ unique_lock<M> ul( my_mtx, defer_lock );
+ ul.lock();
+ // exercise wait part
+ int my_ticket = ++ticket_for_sleep; // grab my ticket
+ if( my_ticket>max_ticket ) break;
+
+ // each waiter should go to sleep at least once
+ unsigned nw = ++n_waiters;
+ for( ;; ) {
+ // update to max_waitq_length
+ if( nw>max_waitq_length ) max_waitq_length = nw;
+ ++n_visit_to_waitq;
+ test_cv.wait( ul );
+ // if( ret==false ) ++n_timedout;
+ ASSERT( ul, "mutex should have been locked" );
+ --n_waiters;
+ if( signaled_ticket==my_ticket ) {
+ wokeup_ticket = my_ticket;
+ break;
+ }
+ if( n_waiters>0 )
+ test_cv.notify_one();
+ nw = ++n_waiters; // update to max_waitq_length occurs above
+ }
+
+ ul.unlock();
+ __TBB_Yield(); // give other threads chance to run.
+ }
+ }
+ ++n_done;
+ spin_wait_until_eq( n_done, nthread );
+ ASSERT( n_signaled==max_ticket, "incorrect number of notifications sent" );
+ }
+};
+
+struct TestPredicate1 {
+ int target;
+ TestPredicate1( int i_ ) : target(i_) {}
+ bool operator()( ) { return signaled_ticket==target; }
+};
+
+template<typename M>
+struct WorkForCondVarWaitPredAndNotifyAll: NoAssign {
+ int nthread;
+ condition_variable& test_cv;
+ M& my_mtx;
+ int multiple;
+ WorkForCondVarWaitPredAndNotifyAll( int n_, condition_variable& cv_, M& mtx_, int m_ ) :
+ nthread(n_), test_cv(cv_), my_mtx(mtx_), multiple(m_) {}
+ void operator()( int tid ) const {
+ if( tid&1 ) {
+ while( ticket_for_sleep<max_ticket ) {
+ unique_lock<M> ul( my_mtx, defer_lock );
+ // exercise wait part
+ int my_ticket = ++ticket_for_sleep; // grab my ticket
+ if( my_ticket>max_ticket )
+ break;
+
+ ul.lock();
+ ++n_visit_to_waitq;
+ unsigned nw = ++n_waiters;
+ if( nw>max_waitq_length ) max_waitq_length = nw;
+ test_cv.wait( ul, TestPredicate1( my_ticket ) );
+ wokeup_ticket = my_ticket;
+ --n_waiters;
+ ASSERT( ul, "mutex should have been locked" );
+ ul.unlock();
+
+ __TBB_Yield(); // give other threads chance to run.
+ }
+ } else {
+ // exercise signal part
+ while( ticket_for_wakeup<max_ticket ) {
+ int my_ticket = ++ticket_for_wakeup; // atomically grab the next ticket
+ if( my_ticket>max_ticket )
+ break;
+
+ for( ;; ) {
+ unique_lock<M> ul( my_mtx );
+ if( n_waiters>0 && my_ticket<=ticket_for_sleep && my_ticket==(wokeup_ticket+1) ) {
+ signaled_ticket = my_ticket;
+ test_cv.notify_all();
+ ++n_signaled;
+ ul.unlock();
+ break;
+ }
+ ul.unlock();
+ __TBB_Yield();
+ }
+
+ // give waiters time to go to sleep.
+ for( int m=0; m<long_delay*multiple; ++m )
+ __TBB_Yield();
+ }
+ }
+ ++n_done;
+ spin_wait_until_eq( n_done, nthread );
+ ASSERT( n_signaled==max_ticket, "incorrect number of notifications sent" );
+ }
+};
+
+void InitGlobalCounters()
+{
+ ticket_for_sleep = ticket_for_wakeup = signaled_ticket = wokeup_ticket = 0;
+ n_waiters = 0;
+ n_signaled = 0;
+ n_done = n_done_1 = n_done_2 = 0;
+ n_visit_to_waitq = 0;
+ n_timed_out = 0;
+}
+
+template<typename M>
+void TestConditionVariable( const char* name, int nthread )
+{
+ REMARK("testing %s in TestConditionVariable\n",name);
+ Counter<M> counter;
+ M mtx;
+
+ ASSERT( nthread>1, "at least two threads are needed for testing condition_variable" );
+ REMARK(" - constructor\n" );
+ // Test constructor.
+ {
+ condition_variable cv1;
+#if _WIN32||_WIN64
+ condition_variable::native_handle_type handle = cv1.native_handle();
+ ASSERT( uintptr_t(&handle->cv_event)==uintptr_t(&handle->cv_native), NULL );
+#endif
+ M mtx1;
+ barrier = 0;
+ NativeParallelFor( 2, WorkForCondVarCtor<M>( cv1, mtx1 ) );
+ }
+
+ REMARK(" - destructor\n" );
+ // Test destructor.
+ {
+ M mtx2;
+ test_cv = NULL;
+ n_waiters = 0;
+ NativeParallelFor( nthread, WorkForCondVarDtor<M>( nthread, mtx2 ) );
+ }
+
+ REMARK(" - timed_wait (i.e., wait_for)\n");
+ // Test timed wait.
+ {
+ condition_variable cv_tw;
+ M mtx_tw;
+ barrier = 0;
+ InitGlobalCounters();
+ int nthr = nthread>4?4:nthread;
+ NativeParallelFor( nthr, WorkForCondVarTimedWait<M>( nthr, cv_tw, mtx_tw ) );
+ }
+
+ REMARK(" - wait with notify_one\n");
+ // Test wait and notify_one
+ do {
+ condition_variable cv3;
+ M mtx3;
+ InitGlobalCounters();
+ NativeParallelFor( nthread, WorkForCondVarWaitAndNotifyOne<M>( nthread, cv3, mtx3 ) );
+ } while( n_visit_to_waitq==0 || max_waitq_length==0 );
+
+ REMARK(" - predicated wait with notify_all\n");
+ // Test wait_pred and notify_all
+ int delay_multiple = 1;
+ do {
+ condition_variable cv4;
+ M mtx4;
+ InitGlobalCounters();
+ NativeParallelFor( nthread, WorkForCondVarWaitPredAndNotifyAll<M>( nthread, cv4, mtx4, delay_multiple ) );
+ if( max_waitq_length<unsigned(nthread/2) )
+ ++delay_multiple;
+ } while( n_visit_to_waitq<=0 || max_waitq_length<unsigned(nthread/2) );
+}
+
+#if TBB_USE_EXCEPTIONS
+static tbb::atomic<int> err_count;
+
+#define TRY_AND_CATCH_RUNTIME_ERROR(op,msg) \
+ try { \
+ op; \
+ ++err_count; \
+ } catch( std::runtime_error& e ) {ASSERT( strstr(e.what(), msg) , NULL );} catch(...) {++err_count;}
+
+template<typename M>
+void TestUniqueLockException( const char * name ) {
+ REMARK("testing %s TestUniqueLockException\n",name);
+ M mtx;
+ unique_lock<M> ul_0;
+ err_count = 0;
+
+ TRY_AND_CATCH_RUNTIME_ERROR( ul_0.lock(), "Operation not permitted" );
+ TRY_AND_CATCH_RUNTIME_ERROR( ul_0.try_lock(), "Operation not permitted" );
+
+ unique_lock<M> ul_1( mtx );
+
+ TRY_AND_CATCH_RUNTIME_ERROR( ul_1.lock(), "Resource deadlock" );
+ TRY_AND_CATCH_RUNTIME_ERROR( ul_1.try_lock(), "Resource deadlock" );
+
+ ul_1.unlock();
+ TRY_AND_CATCH_RUNTIME_ERROR( ul_1.unlock(), "Operation not permitted" );
+
+ ASSERT( !err_count, "Some exceptions are not thrown or incorrect ones are thrown" );
+}
+
+template<typename M>
+void TestConditionVariableException( const char * name ) {
+ REMARK("testing %s in TestConditionVariableException; yet to be implemented\n",name);
+}
+#endif /* TBB_USE_EXCEPTIONS */
+
+template<typename Mutex, typename RecursiveMutex>
+void DoCondVarTest()
+{
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ REMARK( "testing with %d threads\n", p );
+ TestLocks<Mutex>( "mutex", p );
+ TestLocks<RecursiveMutex>( "recursive_mutex", p );
+
+ if( p<=1 ) continue;
+
+ // for testing condition_variable, at least one sleeper and one notifier are needed
+ TestConditionVariable<Mutex>( "mutex", p );
+ }
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception handling tests are skipped.\n");
+#elif TBB_USE_EXCEPTIONS
+ TestUniqueLockException<Mutex>( "mutex" );
+ TestUniqueLockException<RecursiveMutex>( "recursive_mutex" );
+ TestConditionVariableException<Mutex>( "mutex" );
+#endif /* TBB_USE_EXCEPTIONS */
+}
diff --git a/src/test/test_critical_section.cpp b/src/test/test_critical_section.cpp
index 77bb9ff..7ca00b8 100644
--- a/src/test/test_critical_section.cpp
+++ b/src/test/test_critical_section.cpp
@@ -68,7 +68,7 @@ struct BusyBody : NoAssign {
}
cs.lock();
ASSERT( !cs.try_lock(), "recursive try_lock must fail" );
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
if(test_throw && j == (nIters / 2)) {
bool was_caught = false,
unknown_exception = false;
@@ -85,7 +85,7 @@ struct BusyBody : NoAssign {
ASSERT(was_caught, "Recursive lock attempt did not throw");
ASSERT(!unknown_exception, "tbb::improper_lock exception is expected");
}
-#endif
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
for(int i = 0; i < MAX_WORK * WorkRatiox100; i++) {
locals.local() += 1.0;
}
@@ -140,7 +140,6 @@ RunOneCriticalSectionTest(int nThreads, int csWorkRatio, bool test_throw) {
int myCount = 0;
BusyBody myBody(nThreads, csWorkRatio, test_locals, myCount, test_throw);
BusyBodyScoped myScopedBody(nThreads, csWorkRatio, test_locals, myCount, test_throw);
- tbb::critical_section cs;
init.initialize(nThreads);
tbb::tick_count t0;
{
diff --git a/src/test/test_eh_algorithms.cpp b/src/test/test_eh_algorithms.cpp
index e128382..833a281 100644
--- a/src/test/test_eh_algorithms.cpp
+++ b/src/test/test_eh_algorithms.cpp
@@ -35,10 +35,11 @@
#include "tbb/parallel_reduce.h"
#include "tbb/parallel_do.h"
#include "tbb/pipeline.h"
+#include "tbb/parallel_scan.h"
#include "tbb/blocked_range.h"
#include "harness_assert.h"
-#if __TBB_EXCEPTIONS && !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if __TBB_TASK_GROUP_CONTEXT
#define FLAT_RANGE 100000
#define FLAT_GRAIN 100
@@ -93,6 +94,8 @@ public:
}
};
+#if TBB_USE_EXCEPTIONS
+
void Test0 () {
ResetGlobals();
tbb::simple_partitioner p;
@@ -146,8 +149,6 @@ void TestParallelLoop() {
TestParallelLoopAux<Body>( p0 );
const tbb::auto_partitioner p1;
TestParallelLoopAux<Body>( p1 );
- tbb::affinity_partitioner p2;
- TestParallelLoopAux<Body>( p2 );
}
class SimpleParForBody: NoAssign {
@@ -257,6 +258,8 @@ void Test4 () {
}
} // void Test4 ()
+#endif /* TBB_USE_EXCEPTIONS */
+
class ParForBodyToCancel {
public:
void operator()( const range_type& ) const {
@@ -278,11 +281,11 @@ public:
};
//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
-void Test5 () {
+void TestCancelation1 () {
ResetGlobals( false );
RunCancellationTest<ParForLauncherTask<ParForBodyToCancel>, CancellatorTask>( NumSubranges(FLAT_RANGE, FLAT_GRAIN) / 4 );
ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
-} // void Test5 ()
+}
class CancellatorTask2 : public tbb::task {
tbb::task_group_context &m_GroupToCancel;
@@ -311,12 +314,12 @@ public:
//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
/** This version also tests task::is_cancelled() method. **/
-void Test6 () {
+void TestCancelation2 () {
ResetGlobals();
RunCancellationTest<ParForLauncherTask<ParForBodyToCancel2>, CancellatorTask2>();
ASSERT (g_ExecutedAtCatch < g_NumThreads, "Somehow worker tasks started their execution before the cancellator task");
ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Some tasks were executed after cancellation");
-} // void Test6 ()
+}
////////////////////////////////////////////////////////////////////////////////
// Regression test based on the contribution by the author of the following forum post:
@@ -350,9 +353,9 @@ public:
void operator() ( const tbb::blocked_range<size_t>& r ) {
for (size_t i = r.begin (); i != r.end (); ++i) {
- int result = 0;
- m_SharedWorker->DoWork (result, m_NestingLevel);
- m_Result += result;
+ int subtotal = 0;
+ m_SharedWorker->DoWork (subtotal, m_NestingLevel);
+ m_Result += subtotal;
}
}
void join (const RecursiveParReduceBodyWithSharedWorker & x) {
@@ -373,7 +376,7 @@ void Worker::DoWork ( int& result, int nest ) {
}
//! Regression test for hanging that occurred with the first version of cancellation propagation
-void Test7 () {
+void TestCancelation3 () {
Worker w;
int result = 0;
w.DoWork (result, 0);
@@ -381,20 +384,20 @@ void Test7 () {
}
void RunParForAndReduceTests () {
- REMARK( "parallel for and reduce tests" );
+ REMARK( "parallel for and reduce tests\n" );
tbb::task_scheduler_init init (g_NumThreads);
g_Master = Harness::CurrentTid();
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
Test0();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
Test1();
Test2();
Test3();
Test4();
-#endif
- Test5();
- Test6();
- Test7();
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
+ TestCancelation1();
+ TestCancelation2();
+ TestCancelation3();
}
////////////////////////////////////////////////////////////////////////////////
@@ -421,6 +424,8 @@ void Feed ( tbb::parallel_do_feeder<size_t> &feeder, size_t val ) {
#include "harness_iterator.h"
+#if TBB_USE_EXCEPTIONS
+
// Simple functor object with exception
class SimpleParDoBody {
public:
@@ -593,6 +598,32 @@ void Test4_parallel_do () {
}
} // void Test4_parallel_do ()
+// This body throws an exception only if the task was added by feeder
+class ParDoBodyWithThrowingFeederTasks {
+public:
+ //! This form of the function call operator can be used when the body needs to add more work during the processing
+ void operator() ( size_t &value, tbb::parallel_do_feeder<size_t> &feeder ) const {
+ ++g_CurExecuted;
+ Feed(feeder, 1);
+ if (value == 1)
+ ThrowTestException(1);
+ }
+}; // class ParDoBodyWithThrowingFeederTasks
+
+// Test exception in task, which was added by feeder.
+template <class Iterator>
+void Test5_parallel_do () {
+ ResetGlobals();
+ PREPARE_RANGE(Iterator, ITER_RANGE);
+ TRY();
+ tbb::parallel_do<Iterator, ParDoBodyWithThrowingFeederTasks>(begin, end, ParDoBodyWithThrowingFeederTasks());
+ CATCH();
+ if (g_SolitaryException)
+ ASSERT (exceptionCaught, "At least one exception should occur");
+} // void Test5_parallel_do ()
+
+#endif /* TBB_USE_EXCEPTIONS */
+
class ParDoBodyToCancel {
public:
void operator()( size_t& /*value*/ ) const {
@@ -624,7 +655,7 @@ public:
//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
template <class Iterator, class body_to_cancel>
-void Test5_parallel_do () {
+void TestCancelation1_parallel_do () {
ResetGlobals( false );
intptr_t threshold = 10;
tbb::task_group_context ctx;
@@ -636,11 +667,10 @@ void Test5_parallel_do () {
r.spawn( *new( r.allocate_child() ) ParDoWorkerTask<body_to_cancel, Iterator>(ctx) );
TRY();
r.wait_for_all();
- CATCH();
- r.destroy(r);
- ASSERT (!exceptionCaught, "Cancelling tasks should not cause any exceptions");
+ CATCH_AND_FAIL();
ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
-} // void Test5_parallel_do ()
+ r.destroy(r);
+}
class ParDoBodyToCancel2 {
public:
@@ -664,35 +694,11 @@ public:
//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
/** This version also tests task::is_cancelled() method. **/
template <class Iterator, class body_to_cancel>
-void Test6_parallel_do () {
+void TestCancelation2_parallel_do () {
ResetGlobals();
RunCancellationTest<ParDoWorkerTask<body_to_cancel, Iterator>, CancellatorTask2>();
ASSERT (g_CurExecuted <= g_ExecutedAtCatch + g_NumThreads, "Some tasks were executed after cancellation");
-} // void Test6_parallel_do ()
-
-// This body throws an exception only if the task was added by feeder
-class ParDoBodyWithThrowingFeederTasks {
-public:
- //! This form of the function call operator can be used when the body needs to add more work during the processing
- void operator() ( size_t &value, tbb::parallel_do_feeder<size_t> &feeder ) const {
- ++g_CurExecuted;
- Feed(feeder, 1);
- if (value == 1)
- ThrowTestException(1);
- }
-}; // class ParDoBodyWithThrowingFeederTasks
-
-// Test exception in task, which was added by feeder.
-template <class Iterator>
-void Test8_parallel_do () {
- ResetGlobals();
- PREPARE_RANGE(Iterator, ITER_RANGE);
- TRY();
- tbb::parallel_do<Iterator, ParDoBodyWithThrowingFeederTasks>(begin, end, ParDoBodyWithThrowingFeederTasks());
- CATCH();
- if (g_SolitaryException)
- ASSERT (exceptionCaught, "At least one exception should occur");
-} // void Test8_parallel_do ()
+}
#define RunWithSimpleBody(func, body) \
func<Harness::RandomIterator<size_t>, body>(); \
@@ -707,21 +713,19 @@ void Test8_parallel_do () {
func<Harness::ForwardIterator<size_t>, body##WithFeeder<Harness::ForwardIterator<size_t> > >()
void RunParDoTests() {
- REMARK( "parallel do tests" );
+ REMARK( "parallel do tests\n" );
tbb::task_scheduler_init init (g_NumThreads);
g_Master = Harness::CurrentTid();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
RunWithSimpleBody(Test1_parallel_do, SimpleParDoBody);
RunWithTemplatedBody(Test2_parallel_do, NestingParDoBody);
RunWithTemplatedBody(Test3_parallel_do, NestingParDoBodyWithIsolatedCtx);
RunWithTemplatedBody(Test4_parallel_do, NestingParDoWithEhBody);
-#endif
- RunWithSimpleBody(Test5_parallel_do, ParDoBodyToCancel);
- RunWithSimpleBody(Test6_parallel_do, ParDoBodyToCancel2);
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
- Test8_parallel_do<Harness::ForwardIterator<size_t> >();
- Test8_parallel_do<Harness::RandomIterator<size_t> >();
-#endif
+ Test5_parallel_do<Harness::ForwardIterator<size_t> >();
+ Test5_parallel_do<Harness::RandomIterator<size_t> >();
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
+ RunWithSimpleBody(TestCancelation1_parallel_do, ParDoBodyToCancel);
+ RunWithSimpleBody(TestCancelation2_parallel_do, ParDoBodyToCancel2);
}
////////////////////////////////////////////////////////////////////////////////
@@ -810,6 +814,8 @@ void Test0_pipeline () {
ASSERT(inputFilter.buffer()[i] == 50, "pipeline didn't process items properly");
} // void Test0_pipeline ()
+#if TBB_USE_EXCEPTIONS
+
// Simple filter with exception throwing
class SimpleFilter : public tbb::filter {
bool m_canThrow;
@@ -969,11 +975,10 @@ public:
/** Since exception(s) thrown from the nested pipeline are handled by the caller
in this test, they do not affect neither other tasks of the the root pipeline
nor sibling nested algorithms. **/
-
void Test4_pipeline ( const FilterSet& filters ) {
#if __GNUC__ && !__INTEL_COMPILER
if ( strncmp(__VERSION__, "4.1.0", 5) == 0 ) {
- REMARK_ONCE("Warning: One of exception handling tests is skipped due to a known issue.\n");
+ REMARK_ONCE("Known issue: one of exception handling tests is skipped.\n");
return;
}
#endif
@@ -1000,80 +1005,6 @@ void Test4_pipeline ( const FilterSet& filters ) {
}
} // void Test4_pipeline ()
-class FilterToCancel : public tbb::filter {
-public:
- FilterToCancel(bool is_parallel)
- : filter( is_parallel ? tbb::filter::parallel : tbb::filter::serial_in_order )
- {}
- void* operator()(void* item) {
- ++g_CurExecuted;
- CancellatorTask::WaitUntilReady();
- return item;
- }
-}; // class FilterToCancel
-
-template <class Filter_to_cancel>
-class PipelineLauncherTask : public tbb::task {
- tbb::task_group_context &my_ctx;
-public:
- PipelineLauncherTask ( tbb::task_group_context& ctx ) : my_ctx(ctx) {}
-
- tbb::task* execute () {
- // Run test when serial filter is the first non-input filter
- InputFilter inputFilter;
- Filter_to_cancel filterToCancel(true);
- tbb::pipeline p;
- p.add_filter(inputFilter);
- p.add_filter(filterToCancel);
- p.run(g_NumTokens, my_ctx);
- return NULL;
- }
-};
-
-//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
-void Test5_pipeline () {
- ResetGlobals();
- g_ThrowException = false;
- intptr_t threshold = 10;
- tbb::task_group_context ctx;
- ctx.reset();
- tbb::empty_task &r = *new( tbb::task::allocate_root() ) tbb::empty_task;
- r.set_ref_count(3);
- r.spawn( *new( r.allocate_child() ) CancellatorTask(ctx, threshold) );
- __TBB_Yield();
- r.spawn( *new( r.allocate_child() ) PipelineLauncherTask<FilterToCancel>(ctx) );
- TRY();
- r.wait_for_all();
- CATCH();
- r.destroy(r);
- ASSERT (!exceptionCaught, "Cancelling tasks should not cause any exceptions");
- ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
-} // void Test5_pipeline ()
-
-class FilterToCancel2 : public tbb::filter {
-public:
- FilterToCancel2(bool is_parallel)
- : filter ( is_parallel ? tbb::filter::parallel : tbb::filter::serial_in_order)
- {}
-
- void* operator()(void* item) {
- ++g_CurExecuted;
- Harness::ConcurrencyTracker ct;
- // The test will hang (and be timed out by the tesst system) if is_cancelled() is broken
- while( !tbb::task::self().is_cancelled() )
- __TBB_Yield();
- return item;
- }
-};
-
-//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
-/** This version also tests task::is_cancelled() method. **/
-void Test6_pipeline () {
- ResetGlobals();
- RunCancellationTest<PipelineLauncherTask<FilterToCancel2>, CancellatorTask2>();
- ASSERT (g_CurExecuted <= g_ExecutedAtCatch, "Some tasks were executed after cancellation");
-} // void Test6_pipeline ()
-
//! Testing filter::finalize method
#define BUFFER_SIZE 32
#define NUM_BUFFERS 1024
@@ -1141,7 +1072,7 @@ public:
};
//! Tests filter::finalize method
-void Test8_pipeline ( const FilterSet& filters ) {
+void Test5_pipeline ( const FilterSet& filters ) {
ResetGlobals();
g_AllocatedCount = 0;
CustomPipeline<InputFilterWithFinalization, ProcessingFilterWithFinalization> testPipeline(filters);
@@ -1152,9 +1083,9 @@ void Test8_pipeline ( const FilterSet& filters ) {
testPipeline.run();
CATCH();
ASSERT (g_AllocatedCount == 0, "Memory leak: Some my_object weren't destroyed");
-} // void Test8_pipeline ()
+} // void Test5_pipeline ()
-// Tests pipeline function passed with different combination of filters
+//! Tests pipeline function passed with different combination of filters
template<void testFunc(const FilterSet&)>
void TestWithDifferentFilters() {
const int NumFilterTypes = 3;
@@ -1171,26 +1102,102 @@ void TestWithDifferentFilters() {
}
}
+#endif /* TBB_USE_EXCEPTIONS */
+
+class FilterToCancel : public tbb::filter {
+public:
+ FilterToCancel(bool is_parallel)
+ : filter( is_parallel ? tbb::filter::parallel : tbb::filter::serial_in_order )
+ {}
+ void* operator()(void* item) {
+ ++g_CurExecuted;
+ CancellatorTask::WaitUntilReady();
+ return item;
+ }
+}; // class FilterToCancel
+
+template <class Filter_to_cancel>
+class PipelineLauncherTask : public tbb::task {
+ tbb::task_group_context &my_ctx;
+public:
+ PipelineLauncherTask ( tbb::task_group_context& ctx ) : my_ctx(ctx) {}
+
+ tbb::task* execute () {
+ // Run test when serial filter is the first non-input filter
+ InputFilter inputFilter;
+ Filter_to_cancel filterToCancel(true);
+ tbb::pipeline p;
+ p.add_filter(inputFilter);
+ p.add_filter(filterToCancel);
+ p.run(g_NumTokens, my_ctx);
+ return NULL;
+ }
+};
+
+//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
+void TestCancelation1_pipeline () {
+ ResetGlobals();
+ g_ThrowException = false;
+ intptr_t threshold = 10;
+ tbb::task_group_context ctx;
+ ctx.reset();
+ tbb::empty_task &r = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ r.set_ref_count(3);
+ r.spawn( *new( r.allocate_child() ) CancellatorTask(ctx, threshold) );
+ __TBB_Yield();
+ r.spawn( *new( r.allocate_child() ) PipelineLauncherTask<FilterToCancel>(ctx) );
+ TRY();
+ r.wait_for_all();
+ CATCH_AND_FAIL();
+ r.destroy(r);
+ ASSERT (g_CurExecuted < g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
+}
+
+class FilterToCancel2 : public tbb::filter {
+public:
+ FilterToCancel2(bool is_parallel)
+ : filter ( is_parallel ? tbb::filter::parallel : tbb::filter::serial_in_order)
+ {}
+
+ void* operator()(void* item) {
+ ++g_CurExecuted;
+ Harness::ConcurrencyTracker ct;
+ // The test will hang (and be timed out by the tesst system) if is_cancelled() is broken
+ while( !tbb::task::self().is_cancelled() )
+ __TBB_Yield();
+ return item;
+ }
+};
+
+//! Test for cancelling an algorithm from outside (from a task running in parallel with the algorithm).
+/** This version also tests task::is_cancelled() method. **/
+void TestCancelation2_pipeline () {
+ ResetGlobals();
+ RunCancellationTest<PipelineLauncherTask<FilterToCancel2>, CancellatorTask2>();
+ ASSERT (g_CurExecuted <= g_ExecutedAtCatch, "Some tasks were executed after cancellation");
+}
+
void RunPipelineTests() {
- REMARK( "pipeline tests" );
+ REMARK( "pipeline tests\n" );
tbb::task_scheduler_init init (g_NumThreads);
g_Master = Harness::CurrentTid();
g_NumTokens = 2 * g_NumThreads;
Test0_pipeline();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
TestWithDifferentFilters<Test1_pipeline>();
TestWithDifferentFilters<Test2_pipeline>();
TestWithDifferentFilters<Test3_pipeline>();
TestWithDifferentFilters<Test4_pipeline>();
-#endif /* !__TBB_EXCEPTION_HANDLING_BROKEN */
- Test5_pipeline();
- Test6_pipeline();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
- TestWithDifferentFilters<Test8_pipeline>();
-#endif
+ TestWithDifferentFilters<Test5_pipeline>();
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
+ TestCancelation1_pipeline();
+ TestCancelation2_pipeline();
}
-#endif /* __TBB_EXCEPTIONS */
+
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#if TBB_USE_EXCEPTIONS
class MyCapturedException : public tbb::captured_exception {
public:
@@ -1238,18 +1245,20 @@ void TestTbbExceptionAPI () {
ASSERT( MyCapturedException::m_refCount == 1, NULL );
}
+#endif /* TBB_USE_EXCEPTIONS */
+
/** If min and max thread numbers specified on the command line are different,
the test is run only for 2 sizes of the thread pool (MinThread and MaxThread)
to be able to test the high and low contention modes while keeping the test reasonably fast **/
int TestMain () {
- REMARK ("Using %s", TBB_USE_CAPTURED_EXCEPTION ? "tbb:captured_exception" : "exact exception propagation");
+ REMARK ("Using %s\n", TBB_USE_CAPTURED_EXCEPTION ? "tbb:captured_exception" : "exact exception propagation");
MinThread = min(tbb::task_scheduler_init::default_num_threads(), max(2, MinThread));
MaxThread = max(MinThread, min(tbb::task_scheduler_init::default_num_threads(), MaxThread));
ASSERT (FLAT_RANGE >= FLAT_GRAIN * MaxThread, "Fix defines");
-#if __TBB_EXCEPTIONS && !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if __TBB_TASK_GROUP_CONTEXT
int step = max((MaxThread - MinThread + 1)/2, 1);
for ( g_NumThreads = MinThread; g_NumThreads <= MaxThread; g_NumThreads += step ) {
- REMARK ("Number of threads %d", g_NumThreads);
+ REMARK ("Number of threads %d\n", g_NumThreads);
// Execute in all the possible modes
for ( size_t j = 0; j < 4; ++j ) {
g_ExceptionInMaster = (j & 1) == 1;
@@ -1259,12 +1268,14 @@ int TestMain () {
RunPipelineTests();
}
}
+#if TBB_USE_EXCEPTIONS
TestTbbExceptionAPI();
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception handling tests are skipped due to a known issue.\n");
+#endif
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception handling tests are skipped.\n");
#endif
return Harness::Done;
-#else /* !__TBB_EXCEPTIONS */
+#else /* !__TBB_TASK_GROUP_CONTEXT */
return Harness::Skipped;
-#endif /* !__TBB_EXCEPTIONS */
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
}
diff --git a/src/test/test_eh_tasks.cpp b/src/test/test_eh_tasks.cpp
index c03909e..44ed1f3 100644
--- a/src/test/test_eh_tasks.cpp
+++ b/src/test/test_eh_tasks.cpp
@@ -26,22 +26,29 @@
the GNU General Public License.
*/
-// Suppress usage of #pragma comment
-#define __TBB_NO_IMPLICIT_LINKAGE 1
+#define __TBB_COUNT_TASK_NODES 1
+#include "harness_inject_scheduler.h"
-#define COUNT_TASK_NODES 1
-#define __TBB_TASK_CPP_DIRECTLY_INCLUDED 1
-#include "../tbb/task.cpp"
-
-#if __TBB_EXCEPTIONS && !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if __TBB_TASK_GROUP_CONTEXT
#define __TBB_ATOMICS_CODEGEN_BROKEN __SUNPRO_CC
#include "tbb/task_scheduler_init.h"
#include "tbb/spin_mutex.h"
#include "tbb/tick_count.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 <string>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#define NUM_CHILD_TASKS 256
#define NUM_ROOT_TASKS 32
#define NUM_ROOTS_IN_GROUP 8
@@ -94,50 +101,26 @@ inline void ResetGlobals () {
g_CurStat.Reset();
}
-inline void WaitForException () {
- int n = 0;
- while ( ++n < c_Timeout && !__TBB_load_with_acquire(g_ExceptionCaught) )
- __TBB_Yield();
- ASSERT_WARNING( n < c_Timeout, "WaitForException failed" );
-}
-
#define ASSERT_TEST_POSTCOND() \
ASSERT (g_CurStat.Existed() >= g_CurStat.Executed(), "Total number of tasks is less than executed"); \
ASSERT (!g_CurStat.Existing(), "Not all task objects have been destroyed"); \
ASSERT (!tbb::task::self().is_cancelled(), "Scheduler's default context has not been cleaned up properly");
-
-class SimpleThrowingTask : public tbb::task {
-public:
- tbb::task* execute () { throw 0; }
-
- ~SimpleThrowingTask() {
- }
-};
-
-//! Checks if innermost running task information is updated correctly during cancellation processing
-void Test0 () {
- tbb::task_scheduler_init init (1);
- tbb::empty_task &r = *new( tbb::task::allocate_root() ) tbb::empty_task;
- tbb::task_list tl;
- tl.push_back( *new( r.allocate_child() ) SimpleThrowingTask );
- tl.push_back( *new( r.allocate_child() ) SimpleThrowingTask );
- r.set_ref_count( 3 );
- try {
- r.spawn_and_wait_for_all( tl );
- }
- catch (...) {}
- r.destroy( r );
+inline void WaitForException () {
+ int n = 0;
+ while ( ++n < c_Timeout && !__TBB_load_with_acquire(g_ExceptionCaught) )
+ __TBB_Yield();
+ ASSERT_WARNING( n < c_Timeout, "WaitForException failed" );
}
class TaskBase : public tbb::task {
tbb::task* execute () {
tbb::task* t = NULL;
- try {
+ __TBB_TRY {
t = do_execute();
- } catch ( ... ) {
+ } __TBB_CATCH( ... ) {
g_CurStat.IncExecuted();
- throw;
+ __TBB_RETHROW();
}
g_CurStat.IncExecuted();
return t;
@@ -151,8 +134,7 @@ protected:
bool m_Throw;
}; // class TaskBase
-class LeafTask : public TaskBase
-{
+class LeafTask : public TaskBase {
tbb::task* do_execute () {
Harness::ConcurrencyTracker ct;
WaitUntilConcurrencyPeaks();
@@ -180,6 +162,29 @@ public:
SimpleRootTask ( bool throw_exception = true ) : TaskBase(throw_exception) {}
};
+#if TBB_USE_EXCEPTIONS
+
+class SimpleThrowingTask : public tbb::task {
+public:
+ tbb::task* execute () { throw 0; }
+ ~SimpleThrowingTask() {}
+};
+
+//! Checks if innermost running task information is updated correctly during cancellation processing
+void Test0 () {
+ tbb::task_scheduler_init init (1);
+ tbb::empty_task &r = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ tbb::task_list tl;
+ tl.push_back( *new( r.allocate_child() ) SimpleThrowingTask );
+ tl.push_back( *new( r.allocate_child() ) SimpleThrowingTask );
+ r.set_ref_count( 3 );
+ try {
+ r.spawn_and_wait_for_all( tl );
+ }
+ catch (...) {}
+ r.destroy( r );
+}
+
//! Default exception behavior test.
/** Allocates a root task that spawns a bunch of children, one or several of which throw
a test exception in a worker or master thread (depending on the global setting). **/
@@ -440,34 +445,6 @@ void Test8 () {
ASSERT_TEST_POSTCOND();
} // void Test8 ()
-template<class T>
-class CtxLauncherTask : public tbb::task {
- tbb::task_group_context &m_Ctx;
-
- tbb::task* execute () {
- tbb::task::spawn_root_and_wait( *new( tbb::task::allocate_root(m_Ctx) ) T );
- return NULL;
- }
-public:
- CtxLauncherTask ( tbb::task_group_context& ctx ) : m_Ctx(ctx) {}
-};
-
-//! Test for cancelling a task hierarchy from outside (from a task running in parallel with it).
-void Test9 () {
- ResetGlobals();
- g_ThrowException = false;
- tbb::task_group_context ctx;
- tbb::task_list tl;
- tl.push_back( *new( tbb::task::allocate_root() ) CtxLauncherTask<SimpleRootTask>(ctx) );
- tl.push_back( *new( tbb::task::allocate_root() ) CancellatorTask(ctx, NUM_CHILD_TASKS / 4) );
- TRY();
- tbb::task::spawn_root_and_wait(tl);
- CATCH();
- ASSERT (!exceptionCaught, "Cancelling tasks should not cause any exceptions");
- ASSERT (g_CurStat.Executed() <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
- ASSERT_TEST_POSTCOND();
-} // void Test9 ()
-
template<typename T>
void ThrowMovableException ( intptr_t threshold, const T& data ) {
if ( !IsThrowingThread() )
@@ -554,7 +531,7 @@ void CheckException () {
/** Allocates a root task that spawns a bunch of children, one or several of which throw
a movable exception in a worker or master thread (depending on the global settings).
The test also checks the correctness of multiple rethrowing of the pending exception. **/
-void Test10 () {
+void TestMovableException () {
ResetGlobals();
tbb::task_group_context ctx;
tbb::empty_task *r = new( tbb::task::allocate_root() ) tbb::empty_task;
@@ -603,8 +580,34 @@ void Test10 () {
r->destroy(*r);
} // void Test10 ()
+#endif /* TBB_USE_EXCEPTIONS */
+
+template<class T>
+class CtxLauncherTask : public tbb::task {
+ tbb::task_group_context &m_Ctx;
+
+ tbb::task* execute () {
+ tbb::task::spawn_root_and_wait( *new( tbb::task::allocate_root(m_Ctx) ) T );
+ return NULL;
+ }
+public:
+ CtxLauncherTask ( tbb::task_group_context& ctx ) : m_Ctx(ctx) {}
+};
-const int MaxNestingDepth = 256;
+//! Test for cancelling a task hierarchy from outside (from a task running in parallel with it).
+void TestCancelation () {
+ ResetGlobals();
+ g_ThrowException = false;
+ tbb::task_group_context ctx;
+ tbb::task_list tl;
+ tl.push_back( *new( tbb::task::allocate_root() ) CtxLauncherTask<SimpleRootTask>(ctx) );
+ tl.push_back( *new( tbb::task::allocate_root() ) CancellatorTask(ctx, NUM_CHILD_TASKS / 4) );
+ TRY();
+ tbb::task::spawn_root_and_wait(tl);
+ CATCH_AND_FAIL();
+ ASSERT (g_CurStat.Executed() <= g_ExecutedAtCatch + g_NumThreads, "Too many tasks were executed after cancellation");
+ ASSERT_TEST_POSTCOND();
+} // void Test9 ()
class CtxDestroyerTask : public tbb::task {
int m_nestingLevel;
@@ -618,7 +621,8 @@ class CtxDestroyerTask : public tbb::task {
execute();
}
else {
- CancellatorTask::WaitUntilReady();
+ if ( !CancellatorTask::WaitUntilReady() )
+ REPORT( "Warning: missing wakeup\n" );
++g_CurExecuted;
}
if ( ctx.is_group_execution_cancelled() )
@@ -629,6 +633,7 @@ class CtxDestroyerTask : public tbb::task {
public:
CtxDestroyerTask () : m_nestingLevel(0) { s_numCancelled = 0; }
+ static const int MaxNestingDepth = 256;
static int s_numCancelled;
};
@@ -644,20 +649,82 @@ void TestCtxDestruction () {
g_BoostExecutedCount = false;
g_ThrowException = false;
CancellatorTask::Reset();
- // CtxLauncherTask just runs some work to cancel
- //tl.push_back( *new( tbb::task::allocate_root() ) CtxLauncherTask<SimpleRootTask>(ctx) );
+
tl.push_back( *new( tbb::task::allocate_root() ) CtxLauncherTask<CtxDestroyerTask>(ctx) );
tl.push_back( *new( tbb::task::allocate_root() ) CancellatorTask(ctx, 1) );
tbb::task::spawn_root_and_wait(tl);
ASSERT( g_CurExecuted == 1, "Test is broken" );
- ASSERT( CtxDestroyerTask::s_numCancelled <= MaxNestingDepth, "Test is broken" );
+ ASSERT( CtxDestroyerTask::s_numCancelled <= CtxDestroyerTask::MaxNestingDepth, "Test is broken" );
}
} // void TestCtxDestruction()
+#include <algorithm>
+#include "harness_barrier.h"
+
+class CtxConcurrentDestroyer : NoAssign, Harness::NoAfterlife {
+ static const int ContextsPerThread = 512;
+
+ static int s_Concurrency;
+ static int s_NumContexts;
+ static tbb::task_group_context** s_Contexts;
+ static char* s_Buffer;
+ static Harness::SpinBarrier s_Barrier;
+ static Harness::SpinBarrier s_ExitBarrier;
+
+ struct Shuffler {
+ void operator() () const { std::random_shuffle(s_Contexts, s_Contexts + s_NumContexts); }
+ };
+public:
+ static void Init ( int p ) {
+ s_Concurrency = p;
+ s_NumContexts = p * ContextsPerThread;
+ s_Contexts = new tbb::task_group_context*[s_NumContexts];
+ s_Buffer = new char[s_NumContexts * sizeof(tbb::task_group_context)];
+ s_Barrier.initialize( p );
+ s_ExitBarrier.initialize( p );
+ }
+ static void Uninit () {
+ for ( int i = 0; i < s_NumContexts; ++i ) {
+ tbb::internal::context_list_node_t &node = s_Contexts[i]->my_node;
+ ASSERT( !node.my_next && !node.my_prev, "Destroyed context was written to during context chain update" );
+ }
+ delete s_Contexts;
+ delete s_Buffer;
+ }
+
+ void operator() ( int id ) const {
+ int begin = ContextsPerThread * id,
+ end = begin + ContextsPerThread;
+ for ( int i = begin; i < end; ++i )
+ s_Contexts[i] = new( s_Buffer + i * sizeof(tbb::task_group_context) ) tbb::task_group_context;
+ s_Barrier.wait( Shuffler() );
+ for ( int i = begin; i < end; ++i ) {
+ s_Contexts[i]->tbb::task_group_context::~task_group_context();
+ memset( s_Contexts[i], 0, sizeof(tbb::task_group_context) );
+ }
+ s_ExitBarrier.wait();
+ }
+}; // class CtxConcurrentDestroyer
+
+int CtxConcurrentDestroyer::s_Concurrency;
+int CtxConcurrentDestroyer::s_NumContexts;
+tbb::task_group_context** CtxConcurrentDestroyer::s_Contexts;
+char* CtxConcurrentDestroyer::s_Buffer;
+Harness::SpinBarrier CtxConcurrentDestroyer::s_Barrier;
+Harness::SpinBarrier CtxConcurrentDestroyer::s_ExitBarrier;
+
+void TestConcurrentCtxDestruction () {
+ REMARK( "TestConcurrentCtxDestruction\n" );
+ CtxConcurrentDestroyer::Init(g_NumThreads);
+ NativeParallelFor( g_NumThreads, CtxConcurrentDestroyer() );
+ CtxConcurrentDestroyer::Uninit();
+}
+
void RunTests () {
- REMARK ("Number of threads %d", g_NumThreads);
+ REMARK ("Number of threads %d\n", g_NumThreads);
tbb::task_scheduler_init init (g_NumThreads);
g_Master = Harness::CurrentTid();
+#if TBB_USE_EXCEPTIONS
Test1();
Test2();
Test3();
@@ -666,25 +733,31 @@ void RunTests () {
Test6();
Test7();
Test8();
- Test9();
- Test10();
+ TestMovableException();
+#endif /* TBB_USE_EXCEPTIONS */
+ TestCancelation();
TestCtxDestruction();
+#if !RML_USE_WCRM
+ TestConcurrentCtxDestruction();
+#endif
}
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
int TestMain () {
REMARK ("Using %s", TBB_USE_CAPTURED_EXCEPTION ? "tbb:captured_exception" : "exact exception propagation");
MinThread = min(NUM_ROOTS_IN_GROUP, min(tbb::task_scheduler_init::default_num_threads(), max(2, MinThread)));
MaxThread = min(NUM_ROOTS_IN_GROUP, max(MinThread, min(tbb::task_scheduler_init::default_num_threads(), MaxThread)));
ASSERT (NUM_ROOTS_IN_GROUP < NUM_ROOT_TASKS, "Fix defines");
-#if __TBB_EXCEPTIONS && !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if __TBB_TASK_GROUP_CONTEXT
+#if TBB_USE_EXCEPTIONS
// Test0 always runs on one thread
Test0();
+#endif /* TBB_USE_EXCEPTIONS */
g_SolitaryException = 0;
for ( g_NumThreads = MinThread; g_NumThreads <= MaxThread; ++g_NumThreads )
RunTests();
return Harness::Done;
#else
return Harness::Skipped;
-#endif /* __TBB_EXCEPTIONS */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
}
diff --git a/src/test/test_enumerable_thread_specific.cpp b/src/test/test_enumerable_thread_specific.cpp
index 751b317..4f040c1 100644
--- a/src/test/test_enumerable_thread_specific.cpp
+++ b/src/test/test_enumerable_thread_specific.cpp
@@ -26,7 +26,6 @@
the GNU General Public License.
*/
-#define __TBB_EXTRA_DEBUG 1 // for concurrent_hash_map
#include "tbb/enumerable_thread_specific.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/parallel_for.h"
@@ -36,6 +35,12 @@
#include "tbb/tbb_allocator.h"
#include "tbb/tbb_thread.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 <cstring>
#include <vector>
#include <deque>
@@ -43,6 +48,10 @@
#include <map>
#include <utility>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "harness_assert.h"
#include "harness.h"
@@ -58,21 +67,21 @@ const int N = 100000;
const int VALID_NUMBER_OF_KEYS = 100;
const double EXPECTED_SUM = (REPETITIONS + 1) * N;
-//
-// A minimal class
-// Define: default and copy constructor, and allow implicit operator&
-// Hide: operator=
-//
-
+//! A minimal class that occupies N bytes.
+/** Defines default and copy constructor, and allows implicit operator&.
+ Hides operator=. */
+template<size_t N=tbb::internal::NFS_MaxLineSize>
class minimal: NoAssign {
private:
int my_value;
+ bool is_constructed;
+ char pad[N-sizeof(int) - sizeof(bool)];
public:
- minimal(int val=0) : my_value(val) { ++construction_counter; }
- minimal( const minimal &m ) : my_value(m.my_value) { ++construction_counter; }
- ~minimal() { ++destruction_counter; }
- void set_value( const int i ) { my_value = i; }
- int value( ) const { return my_value; }
+ minimal() : NoAssign(), my_value(0) { ++construction_counter; is_constructed = true; }
+ minimal( const minimal &m ) : NoAssign(), my_value(m.my_value) { ++construction_counter; is_constructed = true; }
+ ~minimal() { ++destruction_counter; ASSERT(is_constructed, NULL); is_constructed = false; }
+ void set_value( const int i ) { ASSERT(is_constructed, NULL); my_value = i; }
+ int value( ) const { ASSERT(is_constructed, NULL); return my_value; }
};
//
@@ -89,84 +98,64 @@ struct test_helper {
static inline double get(const T &e ) { return static_cast<double>(e); }
};
-template< >
-struct test_helper<minimal> {
- static inline void init(minimal &sum) { sum.set_value( 0 ); }
- static inline void sum(minimal &sum, const int addend ) { sum.set_value( sum.value() + addend); }
- static inline void sum(minimal &sum, const double addend ) { sum.set_value( sum.value() + static_cast<int>(addend)); }
- static inline void sum(minimal &sum, const minimal &addend ) { sum.set_value( sum.value() + addend.value()); }
- static inline void set(minimal &v, const int value ) { v.set_value( static_cast<int>(value) ); }
- static inline double get(const minimal &sum ) { return static_cast<double>(sum.value()); }
+template<size_t N>
+struct test_helper<minimal<N> > {
+ static inline void init(minimal<N> &sum) { sum.set_value( 0 ); }
+ static inline void sum(minimal<N> &sum, const int addend ) { sum.set_value( sum.value() + addend); }
+ static inline void sum(minimal<N> &sum, const double addend ) { sum.set_value( sum.value() + static_cast<int>(addend)); }
+ static inline void sum(minimal<N> &sum, const minimal<N> &addend ) { sum.set_value( sum.value() + addend.value()); }
+ static inline void set(minimal<N> &v, const int value ) { v.set_value( static_cast<int>(value) ); }
+ static inline double get(const minimal<N> &sum ) { return static_cast<double>(sum.value()); }
};
-//// functors for initialization and combine
+//// functors and routines for initialization and combine
// Addition
-template <typename T>
-struct FunctorAddFinit {
- T operator()() { return 0; }
-};
-
-template <>
-struct FunctorAddFinit<minimal> {
- minimal operator()() { return minimal(0); }
-};
-
-template <typename T>
-struct FunctorAddFinit7 {
- T operator()() { return 7; }
-};
-
-template <>
-struct FunctorAddFinit7<minimal> {
- minimal operator()() { return minimal(7); }
-};
template <typename T>
-struct FunctorAddCombine {
- T operator()(T left, T right ) const {
- return left + right;
+struct FunctorAddCombineRef {
+ T operator()(const T& left, const T& right) const {
+ return left+right;
}
};
-template <>
-struct FunctorAddCombine<minimal> {
- minimal operator()(minimal left, minimal right ) {
- return minimal(left.value() + right.value());
+template <size_t N>
+struct FunctorAddCombineRef<minimal<N> > {
+ minimal<N> operator()(const minimal<N>& left, const minimal<N>& right) const {
+ minimal<N> result;
+ result.set_value( left.value() + right.value() );
+ return result;
}
};
-template <typename T>
-struct FunctorAddCombineRef {
- T operator()(const T& left, const T& right ) const {
- return left + right;
- }
+template <typename T, int Value>
+struct FunctorFinit {
+ T operator()() { return Value; }
};
-template <>
-struct FunctorAddCombineRef<minimal> {
- minimal operator()(const minimal& left, const minimal& right ) const {
- return minimal(left.value() + right.value());
+template <size_t N, int Value>
+struct FunctorFinit<minimal<N>,Value> {
+ minimal<N> operator()() {
+ minimal<N> result;
+ result.set_value( Value );
+ return result;
}
};
template <typename T>
-T my_finit( ) { return 0; }
+struct FunctorAddCombine {
+ T operator()(T left, T right ) const {
+ return FunctorAddCombineRef<T>()( left, right );
+ }
+};
template <typename T>
-T my_combine( T left, T right) { return left + right; }
+T my_combine_ref( const T &left, const T &right) {
+ return FunctorAddCombineRef<T>()( left, right );
+}
template <typename T>
-T my_combine_ref( const T &left, const T &right) { return left + right; }
-
-template <>
-minimal my_finit( ) { return minimal(0); }
-
-template <>
-minimal my_combine( minimal left, minimal right) { return minimal(left.value() + right.value()); }
-
-template <>
-minimal my_combine_ref( const minimal &left, const minimal &right) { return minimal(left.value() + right.value()); }
+T my_combine( T left, T right) { return my_combine_ref(left,right); }
template <typename T>
class combine_one_helper {
@@ -181,9 +170,7 @@ private:
T& my_result;
};
-
-
-//// end functors
+//// end functors and routines
template< typename T >
void run_serial_scalar_tests(const char *test_name) {
@@ -222,9 +209,12 @@ public:
};
template< typename T >
-void run_parallel_scalar_tests(const char *test_name) {
+void run_parallel_scalar_tests_nocombine(const char *test_name) {
- static tbb::enumerable_thread_specific<T> static_sums(static_cast<T>(0));
+ typedef tbb::enumerable_thread_specific<T> ets_type;
+
+ // We assume that static_sums zero-initialized or has a default constructor that zeros it.
+ static ets_type static_sums = ets_type( T() );
T exemplar;
test_helper<T>::init(exemplar);
@@ -262,15 +252,6 @@ void run_parallel_scalar_tests(const char *test_name) {
T non_cassgn_sum;
test_helper<T>::init(non_cassgn_sum);
- T combine_sum;
- test_helper<T>::init(combine_sum);
-
- T combine_ref_sum;
- test_helper<T>::init(combine_ref_sum);
-
- T combine_one_sum;
- test_helper<T>::init(combine_one_sum);
-
T static_sum;
test_helper<T>::init(static_sum);
@@ -279,9 +260,9 @@ void run_parallel_scalar_tests(const char *test_name) {
static_sums.clear();
- tbb::enumerable_thread_specific<T> sums(exemplar);
- FunctorAddFinit<T> my_finit;
- tbb::enumerable_thread_specific<T> finit_ets(my_finit);
+ ets_type sums(exemplar);
+ FunctorFinit<T,0> my_finit;
+ ets_type finit_ets(my_finit);
ASSERT( sums.empty(), NULL);
tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( sums ) );
@@ -295,56 +276,45 @@ void run_parallel_scalar_tests(const char *test_name) {
tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( static_sums ) );
ASSERT( !static_sums.empty(), NULL);
-
- // Use combine
- test_helper<T>::sum(combine_sum, sums.combine(my_combine<T>));
- test_helper<T>::sum(combine_ref_sum, sums.combine(my_combine_ref<T>));
- test_helper<T>::sum(static_sum, static_sums.combine(my_combine<T>));
-
- combine_one_helper<T> my_helper(combine_one_sum);
- sums.combine_each(my_helper);
-
// use iterator
- typename tbb::enumerable_thread_specific<T>::size_type size = 0;
- for ( typename tbb::enumerable_thread_specific<T>::iterator i = sums.begin(); i != sums.end(); ++i ) {
+ typename ets_type::size_type size = 0;
+ for ( typename ets_type::iterator i = sums.begin(); i != sums.end(); ++i ) {
++size;
test_helper<T>::sum(iterator_sum, *i);
}
ASSERT( sums.size() == size, NULL);
// use const_iterator
- for ( typename tbb::enumerable_thread_specific<T>::const_iterator i = sums.begin(); i != sums.end(); ++i ) {
+ for ( typename ets_type::const_iterator i = sums.begin(); i != sums.end(); ++i ) {
test_helper<T>::sum(const_iterator_sum, *i);
}
// use range_type
- typename tbb::enumerable_thread_specific<T>::range_type r = sums.range();
- for ( typename tbb::enumerable_thread_specific<T>::range_type::const_iterator i = r.begin(); i != r.end(); ++i ) {
+ typename ets_type::range_type r = sums.range();
+ for ( typename ets_type::range_type::const_iterator i = r.begin(); i != r.end(); ++i ) {
test_helper<T>::sum(range_sum, *i);
}
// use const_range_type
- typename tbb::enumerable_thread_specific<T>::const_range_type cr = sums.range();
- for ( typename tbb::enumerable_thread_specific<T>::const_range_type::iterator i = cr.begin(); i != cr.end(); ++i ) {
+ typename ets_type::const_range_type cr = sums.range();
+ for ( typename ets_type::const_range_type::iterator i = cr.begin(); i != cr.end(); ++i ) {
test_helper<T>::sum(const_range_sum, *i);
}
// test copy constructor, with TLS-cached locals
-
typedef typename tbb::enumerable_thread_specific<T, tbb::cache_aligned_allocator<T>, tbb::ets_key_per_instance> cached_ets_type;
cached_ets_type cconst(sums);
- /// tbb::enumerable_thread_specific<T> cconst(sums);
for ( typename cached_ets_type::const_iterator i = cconst.begin(); i != cconst.end(); ++i ) {
test_helper<T>::sum(cconst_sum, *i);
}
// test assignment
- tbb::enumerable_thread_specific<T> assigned;
+ ets_type assigned;
assigned = sums;
- for ( typename tbb::enumerable_thread_specific<T>::const_iterator i = assigned.begin(); i != assigned.end(); ++i ) {
+ for ( typename ets_type::const_iterator i = assigned.begin(); i != assigned.end(); ++i ) {
test_helper<T>::sum(assign_sum, *i);
}
@@ -355,17 +325,22 @@ void run_parallel_scalar_tests(const char *test_name) {
test_helper<T>::sum(cassgn_sum, *i);
}
- tbb::enumerable_thread_specific<T> non_cassgn;
+ ets_type non_cassgn;
non_cassgn = cassgn;
- for ( typename tbb::enumerable_thread_specific<T>::const_iterator i = non_cassgn.begin(); i != non_cassgn.end(); ++i ) {
+ for ( typename ets_type::const_iterator i = non_cassgn.begin(); i != non_cassgn.end(); ++i ) {
test_helper<T>::sum(non_cassgn_sum, *i);
}
// test finit-initialized ets
- for(typename tbb::enumerable_thread_specific<T>::const_iterator i = finit_ets.begin(); i != finit_ets.end(); ++i) {
+ for(typename ets_type::const_iterator i = finit_ets.begin(); i != finit_ets.end(); ++i) {
test_helper<T>::sum(finit_ets_sum, *i);
}
+ // test static ets
+ for(typename ets_type::const_iterator i = static_sums.begin(); i != static_sums.end(); ++i) {
+ test_helper<T>::sum(static_sum, *i);
+ }
+
}
ASSERT( EXPECTED_SUM == test_helper<T>::get(iterator_sum), NULL);
@@ -373,8 +348,6 @@ void run_parallel_scalar_tests(const char *test_name) {
ASSERT( EXPECTED_SUM == test_helper<T>::get(range_sum), NULL);
ASSERT( EXPECTED_SUM == test_helper<T>::get(const_range_sum), NULL);
- ASSERT( EXPECTED_SUM == test_helper<T>::get(combine_sum), NULL);
- ASSERT( EXPECTED_SUM == test_helper<T>::get(combine_ref_sum), NULL);
ASSERT( EXPECTED_SUM == test_helper<T>::get(cconst_sum), NULL);
ASSERT( EXPECTED_SUM == test_helper<T>::get(assign_sum), NULL);
ASSERT( EXPECTED_SUM == test_helper<T>::get(cassgn_sum), NULL);
@@ -387,6 +360,70 @@ void run_parallel_scalar_tests(const char *test_name) {
}
}
+template< typename T >
+void run_parallel_scalar_tests(const char *test_name) {
+
+ typedef tbb::enumerable_thread_specific<T> ets_type;
+
+ // We assume that static_sums zero-initialized or has a default constructor that zeros it.
+ static ets_type static_sums = ets_type( T() );
+
+ T exemplar;
+ test_helper<T>::init(exemplar);
+
+ run_parallel_scalar_tests_nocombine<T>(test_name);
+
+ for (int p = MinThread; p <= MaxThread; ++p) {
+ REMARK("Testing parallel %s on %d thread(s)... ", test_name, p);
+ tbb::task_scheduler_init init(p);
+ tbb::tick_count t0;
+
+ T combine_sum;
+ test_helper<T>::init(combine_sum);
+
+ T combine_ref_sum;
+ test_helper<T>::init(combine_ref_sum);
+
+ T combine_one_sum;
+ test_helper<T>::init(combine_one_sum);
+
+ T static_sum;
+ test_helper<T>::init(static_sum);
+
+ for (int t = -1; t < REPETITIONS; ++t) {
+ if (Verbose && t == 0) t0 = tbb::tick_count::now();
+
+ static_sums.clear();
+
+ ets_type sums(exemplar);
+
+ ASSERT( sums.empty(), NULL);
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( sums ) );
+ ASSERT( !sums.empty(), NULL);
+
+ ASSERT(static_sums.empty(), NULL);
+ tbb::parallel_for( tbb::blocked_range<int>( 0, N, 10000 ), parallel_scalar_body<T>( static_sums ) );
+ ASSERT( !static_sums.empty(), NULL);
+
+
+ // Use combine
+ test_helper<T>::sum(combine_sum, sums.combine(my_combine<T>));
+ test_helper<T>::sum(combine_ref_sum, sums.combine(my_combine_ref<T>));
+ test_helper<T>::sum(static_sum, static_sums.combine(my_combine<T>));
+
+ combine_one_helper<T> my_helper(combine_one_sum);
+ sums.combine_each(my_helper);
+ }
+
+
+ ASSERT( EXPECTED_SUM == test_helper<T>::get(combine_sum), NULL);
+ ASSERT( EXPECTED_SUM == test_helper<T>::get(combine_ref_sum), NULL);
+ ASSERT( EXPECTED_SUM == test_helper<T>::get(static_sum), NULL);
+
+ REMARK("done\nparallel combine %s, %d, %g, %g\n", test_name, p, test_helper<T>::get(combine_sum),
+ ( tbb::tick_count::now() - t0).seconds());
+ }
+}
template <typename T>
class parallel_vector_for_body: NoAssign {
@@ -571,11 +608,13 @@ void run_serial_vector_tests(const char *test_name) {
REMARK("done\nserial %s, 0, %g, %g\n", test_name, result_value, ( tbb::tick_count::now() - t0).seconds());
}
+const size_t line_size = tbb::internal::NFS_MaxLineSize;
+
void
run_serial_tests() {
run_serial_scalar_tests<int>("int");
run_serial_scalar_tests<double>("double");
- run_serial_scalar_tests<minimal>("minimal");
+ run_serial_scalar_tests<minimal<> >("minimal<>");
run_serial_vector_tests<int>("std::vector<int, tbb::tbb_allocator<int> >");
run_serial_vector_tests<double>("std::vector<double, tbb::tbb_allocator<double> >");
}
@@ -584,7 +623,7 @@ void
run_parallel_tests() {
run_parallel_scalar_tests<int>("int");
run_parallel_scalar_tests<double>("double");
- run_parallel_scalar_tests<minimal>("minimal");
+ run_parallel_scalar_tests_nocombine<minimal<> >("minimal<>");
run_parallel_vector_tests<int>("std::vector<int, tbb::tbb_allocator<int> >");
run_parallel_vector_tests<double>("std::vector<double, tbb::tbb_allocator<double> >");
}
@@ -596,23 +635,23 @@ run_cross_type_tests() {
run_parallel_vector_tests<double>("std::vector<double, tbb::tbb_allocator<double> >");
}
-typedef tbb::enumerable_thread_specific<minimal> * minimal_ptr;
+typedef tbb::enumerable_thread_specific<minimal<line_size> > flogged_ets;
class set_body {
- minimal_ptr *a;
+ flogged_ets *a;
public:
- set_body( minimal_ptr *_a ) : a(_a) { }
+ set_body( flogged_ets*_a ) : a(_a) { }
void operator() ( ) const {
for (int i = 0; i < VALID_NUMBER_OF_KEYS; ++i) {
- a[i]->local().set_value(i + 1);
+ a[i].local().set_value(i + 1);
}
}
};
-void do_tbb_threads( int max_threads, minimal_ptr *a ) {
+void do_tbb_threads( int max_threads, flogged_ets a[] ) {
std::vector< tbb::tbb_thread * > threads;
for (int p = 0; p < max_threads; ++p) {
@@ -622,6 +661,7 @@ void do_tbb_threads( int max_threads, minimal_ptr *a ) {
for (int p = 0; p < max_threads; ++p) {
threads[p]->join();
}
+
for(int p = 0; p < max_threads; ++p) {
delete threads[p];
}
@@ -630,7 +670,6 @@ void do_tbb_threads( int max_threads, minimal_ptr *a ) {
void
flog_key_creation_and_deletion() {
const int FLOG_REPETITIONS = 100;
- minimal_ptr a[VALID_NUMBER_OF_KEYS];
for (int p = MinThread; p <= MaxThread; ++p) {
REMARK("Testing repeated deletes on %d threads... ", p);
@@ -640,25 +679,26 @@ flog_key_creation_and_deletion() {
destruction_counter = 0;
// causes VALID_NUMER_OF_KEYS exemplar instances to be constructed
- for (int i = 0; i < VALID_NUMBER_OF_KEYS; ++i) {
- a[i] = new tbb::enumerable_thread_specific<minimal>;
- }
+ flogged_ets* a = new flogged_ets[VALID_NUMBER_OF_KEYS];
+ ASSERT(int(construction_counter) == 0, NULL); // no exemplars or actual locals have been constructed
+ ASSERT(int(destruction_counter) == 0, NULL); // and none have been destroyed
// causes p * VALID_NUMBER_OF_KEYS minimals to be created
do_tbb_threads(p, a);
for (int i = 0; i < VALID_NUMBER_OF_KEYS; ++i) {
- for ( tbb::enumerable_thread_specific< minimal >::iterator tli = a[i]->begin();
- tli != a[i]->end(); ++tli ) {
+ int pcnt = 0;
+ for ( flogged_ets::iterator tli = a[i].begin(); tli != a[i].end(); ++tli ) {
ASSERT( (*tli).value() == i+1, NULL );
+ ++pcnt;
}
- delete a[i];
- a[i] = NULL;
+ ASSERT( pcnt == p, NULL); // should be one local per thread.
}
+ delete[] a;
}
- ASSERT( int(construction_counter) == (p+1)*VALID_NUMBER_OF_KEYS, NULL );
- ASSERT( int(destruction_counter) == (p+1)*VALID_NUMBER_OF_KEYS, NULL );
+ ASSERT( int(construction_counter) == (p)*VALID_NUMBER_OF_KEYS, NULL );
+ ASSERT( int(destruction_counter) == (p)*VALID_NUMBER_OF_KEYS, NULL );
REMARK("done\nTesting repeated clears on %d threads... ", p);
@@ -666,9 +706,7 @@ flog_key_creation_and_deletion() {
destruction_counter = 0;
// causes VALID_NUMER_OF_KEYS exemplar instances to be constructed
- for (int i = 0; i < VALID_NUMBER_OF_KEYS; ++i) {
- a[i] = new tbb::enumerable_thread_specific<minimal>;
- }
+ flogged_ets* a = new flogged_ets[VALID_NUMBER_OF_KEYS];
for (int j = 0; j < FLOG_REPETITIONS; ++j) {
@@ -676,23 +714,19 @@ flog_key_creation_and_deletion() {
do_tbb_threads(p, a);
for (int i = 0; i < VALID_NUMBER_OF_KEYS; ++i) {
- for ( tbb::enumerable_thread_specific< minimal >::iterator tli = a[i]->begin();
- tli != a[i]->end(); ++tli ) {
+ for ( flogged_ets::iterator tli = a[i].begin(); tli != a[i].end(); ++tli ) {
ASSERT( (*tli).value() == i+1, NULL );
}
- a[i]->clear();
- ASSERT( static_cast<int>(a[i]->end() - a[i]->begin()) == 0, NULL );
+ a[i].clear();
+ ASSERT( static_cast<int>(a[i].end() - a[i].begin()) == 0, NULL );
}
}
- for (int i = 0; i < VALID_NUMBER_OF_KEYS; ++i) {
- delete a[i];
- a[i] = NULL;
- }
+ delete[] a;
- ASSERT( int(construction_counter) == (FLOG_REPETITIONS*p+1)*VALID_NUMBER_OF_KEYS, NULL );
- ASSERT( int(destruction_counter) == (FLOG_REPETITIONS*p+1)*VALID_NUMBER_OF_KEYS, NULL );
+ ASSERT( int(construction_counter) == (FLOG_REPETITIONS*p)*VALID_NUMBER_OF_KEYS, NULL );
+ ASSERT( int(destruction_counter) == (FLOG_REPETITIONS*p)*VALID_NUMBER_OF_KEYS, NULL );
REMARK("done\n");
}
@@ -863,37 +897,47 @@ void
run_assign_and_copy_constructor_test(const char *test_name) {
REMARK("Testing assignment and copy construction for %s\n", test_name);
- // test initializer with exemplar (combine returns the exemplar value if no threads have created locals.)
+ // test initializer with exemplar
T initializer0;
test_helper<T>::init(initializer0);
T initializer7;
test_helper<T>::set(initializer7,7);
tbb::enumerable_thread_specific<T> create1(initializer7);
- ASSERT(7 == test_helper<T>::get(create1.combine(my_combine<T>)), NULL);
+ (void) create1.local(); // create an initialized value
+ ASSERT(7 == test_helper<T>::get(create1.local()), NULL);
// test copy construction with exemplar initializer
+ create1.clear();
tbb::enumerable_thread_specific<T> copy1(create1);
- ASSERT(7 == test_helper<T>::get(copy1.combine(my_combine<T>)), NULL);
+ (void) copy1.local();
+ ASSERT(7 == test_helper<T>::get(copy1.local()), NULL);
// test copy assignment with exemplar initializer
+ create1.clear();
tbb::enumerable_thread_specific<T> assign1(initializer0);
assign1 = create1;
- ASSERT(7 == test_helper<T>::get(assign1.combine(my_combine<T>)), NULL);
+ (void) assign1.local();
+ ASSERT(7 == test_helper<T>::get(assign1.local()), NULL);
- // test creation with finit function (combine returns finit return value if no threads have created locals)
- FunctorAddFinit7<T> my_finit7;
+ // test creation with finit function
+ FunctorFinit<T,7> my_finit7;
tbb::enumerable_thread_specific<T> create2(my_finit7);
- ASSERT(7 == test_helper<T>::get(create2.combine(my_combine<T>)), NULL);
+ (void) create2.local();
+ ASSERT(7 == test_helper<T>::get(create2.local()), NULL);
// test copy construction with function initializer
+ create2.clear();
tbb::enumerable_thread_specific<T> copy2(create2);
- ASSERT(7 == test_helper<T>::get(copy2.combine(my_combine<T>)), NULL);
+ (void) copy2.local();
+ ASSERT(7 == test_helper<T>::get(copy2.local()), NULL);
// test copy assignment with function initializer
- FunctorAddFinit<T> my_finit;
+ create2.clear();
+ FunctorFinit<T,0> my_finit;
tbb::enumerable_thread_specific<T> assign2(my_finit);
assign2 = create2;
- ASSERT(7 == test_helper<T>::get(assign2.combine(my_combine<T>)), NULL);
+ (void) assign2.local();
+ ASSERT(7 == test_helper<T>::get(assign2.local()), NULL);
}
void
@@ -901,7 +945,10 @@ run_assignment_and_copy_constructor_tests() {
REMARK("Running assignment and copy constructor tests\n");
run_assign_and_copy_constructor_test<int>("int");
run_assign_and_copy_constructor_test<double>("double");
- run_assign_and_copy_constructor_test<minimal>("minimal");
+ // Try class sizes that are close to a cache line in size, in order to check padding calculations.
+ run_assign_and_copy_constructor_test<minimal<line_size-1> >("minimal<line_size-1>");
+ run_assign_and_copy_constructor_test<minimal<line_size> >("minimal<line_size>");
+ run_assign_and_copy_constructor_test<minimal<line_size+1> >("minimal<line_size+1>");
}
int TestMain () {
diff --git a/src/test/test_handle_perror.cpp b/src/test/test_handle_perror.cpp
index 6825acc..60a047d 100644
--- a/src/test/test_handle_perror.cpp
+++ b/src/test/test_handle_perror.cpp
@@ -30,28 +30,48 @@
// to the TBB shared library.
#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 <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "../tbb/tbb_misc.h"
#include "harness.h"
+#if TBB_USE_EXCEPTIONS
+
static void TestHandlePerror() {
bool caught = false;
try {
tbb::internal::handle_perror( EAGAIN, "apple" );
} catch( std::runtime_error& e ) {
- REMARK("caught runtime_exception('%s')\n",e.what());
- ASSERT( memcmp(e.what(),"apple: ",7)==0, NULL );
+#if TBB_USE_EXCEPTIONS
+ REMARK("caught runtime_exception('%s')\n",e.what());
+ ASSERT( memcmp(e.what(),"apple: ",7)==0, NULL );
ASSERT( strstr(e.what(),"unavailable")!=NULL, "bad error message?" );
- caught = true;
+#endif /* TBB_USE_EXCEPTIONS */
+ caught = true;
}
ASSERT(caught,NULL);
}
int TestMain () {
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
TestHandlePerror();
return Harness::Done;
-#else
+}
+
+#else /* !TBB_USE_EXCEPTIONS */
+
+int TestMain () {
return Harness::Skipped;
-#endif
}
+
+#endif /* TBB_USE_EXCEPTIONS */
diff --git a/src/test/test_inits_loop.cpp b/src/test/test_inits_loop.cpp
index e05fbcf..1836ee2 100644
--- a/src/test/test_inits_loop.cpp
+++ b/src/test/test_inits_loop.cpp
@@ -73,7 +73,7 @@ bool exec_test(const char *self) {
return true;
}
-__TBB_TEST_EXPORT
+HARNESS_EXPORT
int main( int argc, char * argv[] ) {
MinThread = 3000;
ParseCommandLine( argc, argv );
diff --git a/src/test/test_intrusive_list.cpp b/src/test/test_intrusive_list.cpp
new file mode 100644
index 0000000..c4c4458
--- /dev/null
+++ b/src/test/test_intrusive_list.cpp
@@ -0,0 +1,156 @@
+/*
+ Copyright 2005-2010 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#include "harness.h"
+
+#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
+const uintptr_t NoliMeTangere = ~uintptr_t(0)/0xFF*0xFC;
+
+struct VerificationBase : Harness::NoAfterlife {
+ uintptr_t m_Canary;
+ VerificationBase () : m_Canary(NoliMeTangere) {}
+};
+
+struct DataItemWithInheritedNodeBase : intrusive_list_node {
+ int m_Data;
+public:
+ DataItemWithInheritedNodeBase ( int value ) : m_Data(value) {}
+
+ int Data() const { return m_Data; }
+};
+
+class DataItemWithInheritedNode : public VerificationBase, public DataItemWithInheritedNodeBase {
+ friend class tbb::internal::intrusive_list<DataItemWithInheritedNode>;
+public:
+ DataItemWithInheritedNode ( int value ) : DataItemWithInheritedNodeBase(value) {}
+};
+
+struct DataItemWithMemberNodeBase {
+ int m_Data;
+public:
+ // Cannot be used by member_intrusive_list to form lists of objects derived from DataItemBase
+ intrusive_list_node m_BaseNode;
+
+ DataItemWithMemberNodeBase ( int value ) : m_Data(value) {}
+
+ int Data() const { return m_Data; }
+};
+
+class DataItemWithMemberNodes : public VerificationBase, public DataItemWithMemberNodeBase {
+public:
+ intrusive_list_node m_Node;
+
+ DataItemWithMemberNodes ( int value ) : DataItemWithMemberNodeBase(value) {}
+};
+
+typedef tbb::internal::intrusive_list<DataItemWithInheritedNode> IntrusiveList1;
+typedef tbb::internal::memptr_intrusive_list<DataItemWithMemberNodes,
+ DataItemWithMemberNodeBase, &DataItemWithMemberNodeBase::m_BaseNode> IntrusiveList2;
+typedef tbb::internal::memptr_intrusive_list<DataItemWithMemberNodes,
+ DataItemWithMemberNodes, &DataItemWithMemberNodes::m_Node> IntrusiveList3;
+
+const int NumElements = 256 * 1024;
+
+//! Iterates through the list forward and backward checking the validity of values stored by the list nodes
+template<class List, class Iterator>
+void CheckListNodes ( List& il, int valueStep ) {
+ int i;
+ Iterator it = il.begin();
+ for ( i = valueStep - 1; it != il.end(); ++it, i += valueStep ) {
+ ASSERT( it->Data() == i, "Unexpected node value while iterating forward" );
+ ASSERT( (*it).m_Canary == NoliMeTangere, "Memory corruption" );
+ }
+ ASSERT( i == NumElements + valueStep - 1, "Wrong number of list elements while iterating forward" );
+ it = il.end();
+ for ( i = NumElements - 1, it--; it != il.end(); --it, i -= valueStep ) {
+ ASSERT( (*it).Data() == i, "Unexpected node value while iterating backward" );
+ ASSERT( it->m_Canary == NoliMeTangere, "Memory corruption" );
+ }
+ ASSERT( i == -1, "Wrong number of list elements while iterating backward" );
+}
+
+template<class List, class Item>
+void TestListOperations () {
+ typedef typename List::iterator iterator;
+ List il;
+ for ( int i = NumElements - 1; i >= 0; --i )
+ il.push_front( *new Item(i) );
+ CheckListNodes<const List, typename List::const_iterator>( il, 1 );
+ iterator it = il.begin();
+ for ( ; it != il.end(); ++it ) {
+ Item &item = *it;
+ it = il.erase( it );
+ delete &item;
+ }
+ CheckListNodes<List, iterator>( il, 2 );
+ for ( it = il.begin(); it != il.end(); ++it ) {
+ Item &item = *it;
+ il.remove( *it++ );
+ delete &item;
+ }
+ CheckListNodes<List, iterator>( il, 4 );
+}
+
+#include "harness_bad_expr.h"
+
+template<class List, class Item>
+void TestListAssertions () {
+#if TRY_BAD_EXPR_ENABLED
+ tbb::set_assertion_handler( AssertionFailureHandler );
+ List il1, il2;
+ Item n1(1), n2(2), n3(3);
+ il1.push_front(n1);
+ TRY_BAD_EXPR( il2.push_front(n1), "only one intrusive list" );
+ TRY_BAD_EXPR( il1.push_front(n1), "only one intrusive list" );
+ il2.push_front(n2);
+ TRY_BAD_EXPR( il1.remove(n3), "not in the list" );
+ 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>();
+ TestListAssertions<IntrusiveList1, DataItemWithInheritedNode>();
+ TestListAssertions<IntrusiveList2, DataItemWithMemberNodes>();
+ TestListAssertions<IntrusiveList3, DataItemWithMemberNodes>();
+ return Harness::Done;
+#else
+ return Harness::Skipped;
+#endif /* __TBB_ARENA_PER_MASTER */
+}
diff --git a/src/test/test_lambda.cpp b/src/test/test_lambda.cpp
index 6f8b883..8958877 100644
--- a/src/test/test_lambda.cpp
+++ b/src/test/test_lambda.cpp
@@ -27,19 +27,26 @@
*/
#define NOMINMAX
+#include "tbb/tbb.h"
+#include "tbb/combinable.h"
#include <cstdio>
+
+#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 <list>
-#include "tbb/tbb.h"
-#include "tbb/combinable.h"
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
using namespace std;
using namespace tbb;
typedef pair<int,int> max_element_t;
-const int N = 1000;
-const int Grainsize = N/1000;
-int a[N];
void f(int val, int *arr, int start, int stop) {
for (int i=start; i<=stop; ++i) {
@@ -69,6 +76,9 @@ int Fib(int n) {
int TestMain () {
#if __TBB_LAMBDAS_PRESENT
+ const int N = 1000;
+ const int Grainsize = N/1000;
+ int a[N];
ASSERT( MinThread>=1, "Error: Number of threads must be positive.\n");
for(int p=MinThread; p<=MaxThread; ++p) {
@@ -173,7 +183,7 @@ int TestMain () {
//test combinable
REMARK("Testing combinable... ");
- combinable<std::pair<int,int> > minmax_c([]() { return std::make_pair(a[0], a[0]); } );
+ combinable<std::pair<int,int> > minmax_c([&]() { return std::make_pair(a[0], a[0]); } );
parallel_for(blocked_range<int>(0,N),
[&] (const blocked_range<int> &r) {
@@ -199,7 +209,7 @@ int TestMain () {
//test enumerable_thread_specific
REMARK("Testing enumerable_thread_specific... ");
- enumerable_thread_specific< std::pair<int,int> > minmax_ets([]() { return std::make_pair(a[0], a[0]); } );
+ enumerable_thread_specific< std::pair<int,int> > minmax_ets([&]() { return std::make_pair(a[0], a[0]); } );
parallel_for(blocked_range<int>(0,N),
[&] (const blocked_range<int> &r) {
diff --git a/src/test/test_malloc_compliance.cpp b/src/test/test_malloc_compliance.cpp
index a28c9ee..a25bd0d 100644
--- a/src/test/test_malloc_compliance.cpp
+++ b/src/test/test_malloc_compliance.cpp
@@ -90,7 +90,6 @@ void limitMem( int limit )
#include <time.h>
#include <errno.h>
-#include <vector>
#define __TBB_NO_IMPLICIT_LINKAGE 1
#include "tbb/scalable_allocator.h"
#include "tbb/tbb_machine.h"
@@ -105,6 +104,18 @@ void limitMem( int limit )
#include <malloc.h> // _aligned_(malloc|free|realloc)
#endif
+#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>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
const size_t COUNT_ELEM_CALLOC = 2;
const int COUNT_TESTS = 1000;
const int COUNT_ELEM = 25000;
@@ -291,7 +302,7 @@ void ReallocParam()
Trealloc(bufs[j], 0);
}
-__TBB_TEST_EXPORT
+HARNESS_EXPORT
int main(int argc, char* argv[]) {
argC=argc;
argV=argv;
@@ -990,11 +1001,11 @@ void CMemTest::RunAllTests(int total_threads)
InvariantDataRealloc(/*aligned=*/true);
TestAlignedParameters();
#if __APPLE__
- REPORT("Warning: skipping some tests (known issue on Mac OS* X)\n");
+ REPORT("Known issue: some tests are skipped on Mac OS* X\n");
#else
UniquePointer();
AddrArifm();
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if !__TBB_LRB_NATIVE
NULLReturn(1*MByte,100*MByte,total_threads);
#endif
#endif
diff --git a/src/test/test_malloc_lib_unload.cpp b/src/test/test_malloc_lib_unload.cpp
index c77af1f..0c06632 100644
--- a/src/test/test_malloc_lib_unload.cpp
+++ b/src/test/test_malloc_lib_unload.cpp
@@ -39,47 +39,63 @@
#include "harness_memory.h"
#if TBB_USE_DEBUG
-#define DEBUG_SUFFIX "_debug"
+#define SUFFIX1 "_debug"
+#define SUFFIX2
#else
-#define DEBUG_SUFFIX
+#define SUFFIX1
+#define SUFFIX2 "_debug"
#endif /* TBB_USE_DEBUG */
-// MALLOCLIB_NAME is the name of the TBB memory allocator library.
#if _WIN32||_WIN64
-#define MALLOCLIB_NAME "tbbmalloc" DEBUG_SUFFIX ".dll"
-#elif __APPLE__
-#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".dylib"
+#define PREFIX
+#define EXT ".dll"
+#else
+#define PREFIX "lib"
+#if __APPLE__
+#define EXT ".dylib"
#elif __linux__
-#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
+#define EXT __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
#elif __FreeBSD__ || __sun
-#define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".so"
+#define EXT ".so"
#else
#error Unknown OS
#endif
+#endif
+
+// Form the names of the TBB memory allocator binaries.
+#define MALLOCLIB_NAME1 PREFIX "tbbmalloc" SUFFIX1 EXT
+#define MALLOCLIB_NAME2 PREFIX "tbbmalloc" SUFFIX2 EXT
+
+#if _WIN32 || _WIN64
+#define LIBRARY_HANDLE HMODULE
+#define LOAD_LIBRARY(name) LoadLibrary((name))
+#else
+#define LIBRARY_HANDLE void*
+#define LOAD_LIBRARY(name) dlopen((name), RTLD_NOW|RTLD_GLOBAL)
+#endif
struct Run {
void operator()( int /*id*/ ) const {
void* (*malloc_ptr)(size_t);
void (*free_ptr)(void*);
-#if _WIN32 || _WIN64
- HMODULE lib = LoadLibrary(MALLOCLIB_NAME);
-#else
- void *lib = dlopen(MALLOCLIB_NAME, RTLD_NOW|RTLD_GLOBAL);
-#endif
- if (NULL == lib) {
- REPORT("Can't load " MALLOCLIB_NAME "\n");
+ const char* actual_name;
+ LIBRARY_HANDLE lib = LOAD_LIBRARY(actual_name = MALLOCLIB_NAME1);
+ if (!lib) lib = LOAD_LIBRARY(actual_name = MALLOCLIB_NAME2);
+ if (!lib) {
+ REPORT("Can't load " MALLOCLIB_NAME1 " or " MALLOCLIB_NAME2 "\n");
exit(1);
}
#if _WIN32 || _WIN64
- (void *&)malloc_ptr = GetProcAddress(lib, "scalable_malloc");
- (void *&)free_ptr = GetProcAddress(lib, "scalable_free");
+ // casts at both sides are to soothe MinGW compiler
+ (void *&)malloc_ptr = (void*)GetProcAddress(lib, "scalable_malloc");
+ (void *&)free_ptr = (void*)GetProcAddress(lib, "scalable_free");
#else
(void *&)malloc_ptr = dlsym(lib, "scalable_malloc");
(void *&)free_ptr = dlsym(lib, "scalable_free");
#endif
if (!malloc_ptr || !free_ptr) {
- REPORT("Can't find scalable_(malloc|free) in " MALLOCLIB_NAME "\n");
+ REPORT("Can't find scalable_(malloc|free) in %s \n", actual_name);
exit(1);
}
@@ -90,13 +106,13 @@ struct Run {
#if _WIN32 || _WIN64
BOOL ret = FreeLibrary(lib);
ASSERT(ret, "FreeLibrary must be successful");
- ASSERT(GetModuleHandle(MALLOCLIB_NAME),
- MALLOCLIB_NAME " must not be unloaded");
+ ASSERT(GetModuleHandle(actual_name),
+ "allocator library must not be unloaded");
#else
int ret = dlclose(lib);
ASSERT(ret == 0, "dlclose must be successful");
ASSERT(dlsym(RTLD_DEFAULT, "scalable_malloc"),
- MALLOCLIB_NAME " must not be unloaded");
+ "allocator library must not be unloaded");
#endif
}
};
diff --git a/src/test/test_malloc_overload.cpp b/src/test/test_malloc_overload.cpp
index df219f0..5bd7df2 100644
--- a/src/test/test_malloc_overload.cpp
+++ b/src/test/test_malloc_overload.cpp
@@ -37,9 +37,14 @@
#if MALLOC_REPLACEMENT_AVAILABLE
#if _WIN32 || _WIN64
-// as the test build /EHs-, suppress warning C4530: C++ exception handler used,
-// but unwind semantics are not enabled
+// As the test is intentionally build with /EHs-, suppress multiple VS2005's
+// warnings like C4530: C++ exception handler used, but unwind semantics are not enabled
+#if defined(_MSC_VER) && !__INTEL_COMPILER
+/* ICC 10.1 and 11.0 generates code that uses std::_Raise_handler,
+ but it's only defined in libcpmt(d), which the test doesn't linked with.
+ */
#define _HAS_EXCEPTIONS 0
+#endif
// to use strdup and putenv w/o warnings
#define _CRT_NONSTDC_NO_DEPRECATE 1
#endif
@@ -72,6 +77,13 @@ typedef unsigned __int64 uint64_t;
// On Windows, the tricky way to print "done" is necessary to create
// dependence on msvcpXX.dll, for sake of a regression test.
// On Linux, C++ RTL headers are undesirable because of breaking strict ANSI mode.
+#if defined(_MSC_VER) && _MSC_VER >= 1300 && _MSC_VER <= 1310 && !defined(__INTEL_COMPILER)
+/* Fixing compilation error reported by VS2003 for exception class
+ when _HAS_EXCEPTIONS is 0:
+ bad_cast that inherited from exception is not in std namespace.
+*/
+using namespace std;
+#endif
#include <string>
#endif
@@ -95,12 +107,22 @@ union BackRefIdx { // index to backreference array
} s;
};
-struct LargeObjectHeader {
- void *unalignedResult; /* The address obtained from and returned to the OS */
- size_t unalignedSize; /* The size that was requested from getMemory */
- size_t objectSize; /* The size originally requested by a client */
- bool fromMapMemory; /* True if allocated with MapMemory usage enforced */
- BackRefIdx backRefIdx;
+struct LargeMemoryBlock {
+ LargeMemoryBlock *next, // ptrs in list of cached blocks
+ *prev;
+ 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
+};
+
+struct LargeObjectHdr {
+ LargeMemoryBlock *memoryBlock;
+ /* Have to duplicate it here from CachedObjectHdr,
+ as backreference must be checked without further pointer dereference.
+ Points to LargeObjectHdr. */
+ BackRefIdx backRefIdx;
};
/*
@@ -119,8 +141,8 @@ static bool scalableMallocLargeBlock(void *object, size_t size)
ASSERT(_msize(object) >= size, NULL);
#endif
- LargeObjectHeader *h = (LargeObjectHeader*)((uintptr_t)object-sizeof(LargeObjectHeader));
- return uintptr_t(h->unalignedSize)<uintptr_t(h) && h->objectSize==size;
+ LargeMemoryBlock *lmb = ((LargeObjectHdr*)object-1)->memoryBlock;
+ return uintptr_t(lmb)<uintptr_t(((LargeObjectHdr*)object-1)) && lmb->objectSize==size;
}
struct BigStruct {
diff --git a/src/test/test_malloc_regression.cpp b/src/test/test_malloc_regression.cpp
index 212aa9e..6123f7c 100644
--- a/src/test/test_malloc_regression.cpp
+++ b/src/test/test_malloc_regression.cpp
@@ -52,7 +52,7 @@ void RunThread(const Body& body, const Arg& arg) {
#include "harness_memory.h"
// The regression test for bug #1518 where thread boot strap allocations "leaked"
-bool test_bootstrap_leak(void) {
+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
@@ -76,12 +76,18 @@ bool test_bootstrap_leak(void) {
}
}
+ ptrdiff_t memory_leak = 0;
// Notice that 16K boot strap memory block is enough to serve 42 threads.
const int num_thread_runs = 200;
- for( int i=0; i<num_thread_runs; ++i )
- RunThread( minimalAllocFree(), alloc_size );
-
- ptrdiff_t memory_leak = GetMemoryUsage() - memory_in_use;
+ for (int run=0; run<3; run++) {
+ memory_in_use = GetMemoryUsage();
+ for( int i=0; i<num_thread_runs; ++i )
+ RunThread( minimalAllocFree(), alloc_size );
+
+ memory_leak = GetMemoryUsage() - memory_in_use;
+ if (!memory_leak)
+ break;
+ }
if( memory_leak>0 ) { // possibly too strong?
REPORT( "Error: memory leak of up to %ld bytes\n", static_cast<long>(memory_leak));
}
@@ -92,14 +98,44 @@ bool test_bootstrap_leak(void) {
return memory_leak<=0;
}
-int TestMain () {
+bool TestReallocMsize(size_t startSz) {
bool passed = true;
- // Check whether memory usage data can be obtained; if not, skip test_bootstrap_leak.
- if( !GetMemoryUsage() )
- return Harness::Skipped;
- passed &= test_bootstrap_leak();
+ char *buf = (char*)scalable_malloc(startSz);
+ ASSERT(buf, "");
+ size_t realSz = scalable_msize(buf);
+ ASSERT(realSz>=startSz, "scalable_msize must be not less then allocated size");
+ memset(buf, 'a', realSz-1);
+ buf[realSz-1] = 0;
+ char *buf1 = (char*)scalable_realloc(buf, 2*realSz);
+ ASSERT(buf1, "");
+ 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 ) {
+ REPORT( "Error: data broken for %d Bytes object.\n", startSz);
+ passed = false;
+ }
+ scalable_free(buf1);
+ return passed;
+}
+
+int TestMain () {
+ bool passed = true;
+ // Check whether memory usage data can be obtained; if not, skip test_bootstrap_leak.
+ if( GetMemoryUsage() )
+ passed &= TestBootstrapLeak();
+
+ for (size_t a=1, b=1, sum=1; sum<=64*1024; ) {
+ passed &= TestReallocMsize(sum);
+ a = b;
+ b = sum;
+ sum = a+b;
+ }
+ 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 239ab76..3056eee 100644
--- a/src/test/test_malloc_whitebox.cpp
+++ b/src/test/test_malloc_whitebox.cpp
@@ -77,7 +77,7 @@ public:
// push to maximal cache limit
for (int i=0; i<2; i++) {
const int sizes[] = { MByte/sizeof(int),
- (MByte-2*largeObjectCacheStep)/sizeof(int) };
+ (MByte-2*largeBlockCacheStep)/sizeof(int) };
for (int q=0; q<2; q++) {
size_t curr = 0;
for (int j=0; j<LARGE_MEM_SIZES_NUM; j++, curr++)
@@ -185,17 +185,43 @@ public:
}
};
-void TestBackRef() {
- size_t beforeNumBackRef = 0, afterNumBackRef = 0;
+class FreeBlockPoolHit: NoAssign {
+ // to trigger possible leak for both cleanup on pool overflow
+ // and on thread termination
+ static const int ITERS = 2*FreeBlockPool::POOL_HIGH_MARK;
+public:
+ FreeBlockPoolHit() {}
+ void operator()(int) const {
+ void *objs[ITERS];
+
+ for (int i=0; i<ITERS; i++)
+ objs[i] = scalable_malloc(minLargeObjectSize-1);
+ for (int i=0; i<ITERS; i++)
+ scalable_free(objs[i]);
+
+#ifdef USE_WINTHREAD
+ // under Windows DllMain used to call mallocThreadShutdownNotification,
+ // as we don't use it have to call the callback manually
+ mallocThreadShutdownNotification(NULL);
+#endif
+ }
+};
+static size_t allocatedBackRefCount()
+{
+ size_t cnt = 0;
for (int i=0; i<=backRefMaster->lastUsed; i++)
- beforeNumBackRef += backRefMaster->backRefBl[i]->allocatedCount;
+ cnt += backRefMaster->backRefBl[i]->allocatedCount;
+ return cnt;
+}
+
+void TestBackRef() {
+ size_t beforeNumBackRef, afterNumBackRef;
+ beforeNumBackRef = allocatedBackRefCount();
for( int p=MaxThread; p>=MinThread; --p )
NativeParallelFor( p, BackRefWork() );
-
- for (int i=0; i<=backRefMaster->lastUsed; i++)
- afterNumBackRef += backRefMaster->backRefBl[i]->allocatedCount;
+ afterNumBackRef = allocatedBackRefCount();
ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
// lastUsed marks peak resource consumption. As we allocate below the mark,
@@ -203,13 +229,21 @@ void TestBackRef() {
int sustLastUsed = backRefMaster->lastUsed;
NativeParallelFor( 1, BackRefWork() );
ASSERT(sustLastUsed == backRefMaster->lastUsed, "backreference leak detected");
+
+ // check leak of back references while per-thread small object pool is in use
+ // warm up need to cover bootStrapMalloc call
+ NativeParallelFor( 1, FreeBlockPoolHit() );
+ beforeNumBackRef = allocatedBackRefCount();
+ NativeParallelFor( 1, FreeBlockPoolHit() );
+ afterNumBackRef = allocatedBackRefCount();
+ ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
}
void TestObjectRecognition() {
- const unsigned falseObjectSize = 113; // unsigned is the type expected by getObjectSize
+ size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
+ unsigned falseObjectSize = 113; // unsigned is the type expected by getObjectSize
size_t obtainedSize;
Block *auxBackRef;
- LargeObjectHeader *auxLOHBackRef;
ASSERT(getObjectSize(falseObjectSize)!=falseObjectSize, "Error in test: bad choice for false object size");
@@ -219,13 +253,18 @@ void TestObjectRecognition() {
char* falseSO = (char*)falseBlock + falseObjectSize*7;
ASSERT(alignDown(falseSO, blockSize)==(void*)falseBlock, "Error in test: false object offset is too big");
- void* bufferLOH = scalable_malloc(2*blockSize+sizeof(LargeObjectHeader));
- LargeObjectHeader* falseLO =
- (LargeObjectHeader*)alignUp((uintptr_t)bufferLOH+sizeof(LargeObjectHeader), blockSize);
- LargeObjectHeader* headerLO = falseLO-1;
- headerLO->unalignedSize = 2*sizeof(LargeObjectHeader);
- headerLO->unalignedResult = headerLO;
- ASSERT(scalable_msize(falseLO)==sizeof(LargeObjectHeader), "Error in test: LOH falsification failed");
+ void* bufferLOH = scalable_malloc(2*blockSize + headersSize);
+ LargeObjectHdr* falseLO =
+ (LargeObjectHdr*)alignUp((uintptr_t)bufferLOH + headersSize, blockSize);
+ LargeObjectHdr* headerLO = (LargeObjectHdr*)falseLO-1;
+ headerLO->memoryBlock = (LargeMemoryBlock*)bufferLOH;
+ headerLO->memoryBlock->unalignedSize = 2*blockSize + headersSize;
+ headerLO->memoryBlock->objectSize = blockSize + headersSize;
+ headerLO->backRefIdx = newBackRef();
+ setBackRef(headerLO->backRefIdx, headerLO);
+ ASSERT(scalable_msize(falseLO) == blockSize + headersSize,
+ "Error in test: LOH falsification failed");
+ removeBackRef(headerLO->backRefIdx);
const int NUM_OF_IDX = BR_MAX_CNT+2;
BackRefIdx idxs[NUM_OF_IDX];
@@ -260,7 +299,7 @@ void TestObjectRecognition() {
scalable_free(smallPtr);
obtainedSize = safer_scalable_msize(mem, NULL);
- ASSERT(obtainedSize>2*blockSize, "Correct pointer not accepted?");
+ ASSERT(obtainedSize>=2*blockSize, "Correct pointer not accepted?");
scalable_free(mem);
scalable_free(bufferLOH);
}
diff --git a/src/test/test_model_plugin.cpp b/src/test/test_model_plugin.cpp
index 95022c4..b2b3a15 100644
--- a/src/test/test_model_plugin.cpp
+++ b/src/test/test_model_plugin.cpp
@@ -26,17 +26,6 @@
the GNU General Public License.
*/
-#if __LRB__
-
-#ifndef _USRDLL
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#include "harness.h"
-int TestMain() {
- return Harness::Skipped;
-}
-#endif
-
-#else//__LRB__
#if _WIN32 || _WIN64
#include <windows.h>
@@ -46,8 +35,24 @@ int TestMain() {
#include <stdlib.h>
#include <stdio.h>
+
+#include "tbb/tbb_config.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 "harness_report.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+#if TBB_USE_EXCEPTIONS
+ #include "harness_report.h"
+#endif
#ifdef _USRDLL
#include "tbb/task_scheduler_init.h"
@@ -96,11 +101,13 @@ __declspec(dllexport)
void plugin_call(int maxthread)
{
srand(2);
- try {
+ __TBB_TRY {
CModel model;
model.init_and_terminate(maxthread);
- } catch( std::runtime_error& error ) {
+ } __TBB_CATCH( std::runtime_error& error ) {
+#if TBB_USE_EXCEPTIONS
REPORT("ERROR: %s\n", error.what());
+#endif /* TBB_USE_EXCEPTIONS */
}
}
@@ -152,9 +159,9 @@ int use_lot_of_tls() {
&& count < 4096 ) // Sun Solaris doesn't have any built-in limit, so we set something big enough
{
last_handles[++count%10] = result;
- REMARK("%d\n", count);
pthread_setspecific(result,&setspecific_dummy);
}
+ REMARK("Created %d keys\n", count);
for( int i=0; i<10; ++i )
pthread_key_delete(last_handles[i]);
#endif
@@ -164,21 +171,53 @@ int use_lot_of_tls() {
typedef void (*PLUGIN_CALL)(int);
int TestMain () {
+#if !RML_USE_WCRM
PLUGIN_CALL my_plugin_call;
int tls_key_count = use_lot_of_tls();
REMARK("%d thread local objects allocated in advance\n", tls_key_count);
+#if _WIN32 || _WIN64
+ HMODULE hLib;
+#if __TBB_ARENA_PER_MASTER
+ hLib = LoadLibrary("irml.dll");
+ if ( !hLib )
+ hLib = LoadLibrary("irml_debug.dll");
+ if ( !hLib )
+ return Harness::Skipped; // No shared RML, skip the test
+ FreeLibrary(hLib);
+#endif /* __TBB_ARENA_PER_MASTER */
+#else /* !WIN */
+#if __APPLE__
+ #define LIBRARY_NAME(base) base".dylib"
+#else
+ #define LIBRARY_NAME(base) base".so"
+#endif
+ void* hLib;
+#if __TBB_ARENA_PER_MASTER
+#if __linux__
+ #define RML_LIBRARY_NAME(base) LIBRARY_NAME(base) ".1"
+#else
+ #define RML_LIBRARY_NAME(base) LIBRARY_NAME(base)
+#endif
+ hLib = dlopen(RML_LIBRARY_NAME("libirml"), RTLD_LAZY);
+ if ( !hLib )
+ hLib = dlopen(RML_LIBRARY_NAME("libirml_debug"), RTLD_LAZY);
+ if ( !hLib )
+ return Harness::Skipped;
+ dlclose(hLib);
+#endif /* __TBB_ARENA_PER_MASTER */
+#endif /* OS */
for( int i=1; i<100; ++i ) {
+ REMARK("Iteration %d, loading plugin library...\n", i);
#if _WIN32 || _WIN64
- HMODULE hLib = LoadLibrary("test_model_plugin_dll.dll");
- if (hLib==NULL){
+ hLib = LoadLibrary("test_model_plugin_dll.dll");
+ if ( !hLib ) {
#if !__TBB_NO_IMPLICIT_LINKAGE
report_error_in("LoadLibrary");
return -1;
#else
- REPORT("skip\n");
- return 0;
+ return Harness::Skipped;
#endif
}
my_plugin_call = (PLUGIN_CALL) GetProcAddress(hLib, "plugin_call");
@@ -186,20 +225,14 @@ int TestMain () {
report_error_in("GetProcAddress");
return -1;
}
-#else
-#if __APPLE__
- const char *dllname = "test_model_plugin_dll.dylib";
-#else
- const char *dllname = "test_model_plugin_dll.so";
-#endif
- void* hLib = dlopen( dllname, RTLD_LAZY );
- if (hLib==NULL){
+#else /* !WIN */
+ hLib = dlopen( LIBRARY_NAME("test_model_plugin_dll"), RTLD_LAZY );
+ if ( !hLib ) {
#if !__TBB_NO_IMPLICIT_LINKAGE
report_error_in("dlopen");
return -1;
#else
- REPORT("skip\n");
- return 0;
+ return Harness::Skipped;
#endif
}
my_plugin_call = PLUGIN_CALL (dlsym(hLib, "plugin_call"));
@@ -207,12 +240,12 @@ int TestMain () {
report_error_in("dlsym");
return -1;
}
-#endif
+#endif /* !WIN */
- REMARK("Iteration %d, calling plugin... ", i);
+ REMARK("Calling plugin method...\n");
my_plugin_call(MaxThread);
- REMARK("succeeded\n");
+ REMARK("Unloading plugin library...\n");
#if _WIN32 || _WIN64
FreeLibrary(hLib);
#else
@@ -221,7 +254,9 @@ int TestMain () {
} // end for(1,100)
return Harness::Done;
+#else
+ return Harness::Skipped;
+#endif /* !RML_USE_WCRM */
}
#endif//_USRDLL
-#endif//__LRB__
diff --git a/src/test/test_mutex.cpp b/src/test/test_mutex.cpp
index e963d9c..0e0ecb2 100644
--- a/src/test/test_mutex.cpp
+++ b/src/test/test_mutex.cpp
@@ -56,8 +56,8 @@
#endif /* _OPENMP */
#include "tbb/tbb_profiling.h"
-#ifndef TBBTEST_LOW_WORKLOAD
- #define TBBTEST_LOW_WORKLOAD TBB_USE_THREADING_TOOLS
+#ifndef TBB_TEST_LOW_WORKLOAD
+ #define TBB_TEST_LOW_WORKLOAD TBB_USE_THREADING_TOOLS
#endif
// This test deliberately avoids a "using tbb" statement,
@@ -181,11 +181,11 @@ void Test( const char * name ) {
Counter<M> counter;
counter.value = 0;
tbb::profiling::set_name(counter.mutex, name);
-#if TBBTEST_LOW_WORKLOAD
+#if TBB_TEST_LOW_WORKLOAD
const int n = 10000;
#else
const int n = 100000;
-#endif /* TBBTEST_LOW_WORKLOAD */
+#endif /* TBB_TEST_LOW_WORKLOAD */
tbb::tick_count t0 = tbb::tick_count::now();
tbb::parallel_for(tbb::blocked_range<size_t>(0,n,n/10),AddOne<Counter<M> >(counter));
tbb::tick_count t1 = tbb::tick_count::now();
@@ -302,11 +302,11 @@ template<typename M>
void TestReaderWriterLock( const char * mutex_name ) {
REMARK( "%s readers & writers time = ", mutex_name );
Invariant<M,8> invariant(mutex_name);
-#if TBBTEST_LOW_WORKLOAD
+#if TBB_TEST_LOW_WORKLOAD
const size_t n = 10000;
#else
const size_t n = 500000;
-#endif /* TBBTEST_LOW_WORKLOAD */
+#endif /* TBB_TEST_LOW_WORKLOAD */
tbb::tick_count t0 = tbb::tick_count::now();
tbb::parallel_for(tbb::blocked_range<size_t>(0,n,n/100),TwiddleInvariant<Invariant<M,8> >(invariant));
tbb::tick_count t1 = tbb::tick_count::now();
@@ -566,7 +566,7 @@ int TestMain () {
for( int p=MinThread; p<=MaxThread; ++p ) {
tbb::task_scheduler_init init( p );
REMARK( "testing with %d workers\n", static_cast<int>(p) );
-#if TBBTEST_LOW_WORKLOAD
+#if TBB_TEST_LOW_WORKLOAD
// The amount of work is decreased in this mode to bring the length
// of the runs under tools into the tolerable limits.
const int n = 1;
diff --git a/src/test/test_openmp.cpp b/src/test/test_openmp.cpp
index cac9418..103110f 100644
--- a/src/test/test_openmp.cpp
+++ b/src/test/test_openmp.cpp
@@ -32,8 +32,10 @@
Bellow is workaround to compile test within enviroment of Intel Compiler
but by Microsoft Compiler. So, there is wrong "omp.h" file included and
manifest section is missed from .exe file - restoring here.
+
+ As of Visual Studio 2010, crtassem.h is no longer shipped.
*/
-#if !defined(__INTEL_COMPILER) && _MSC_VER >= 1400
+#if !defined(__INTEL_COMPILER) && _MSC_VER >= 1400 && _MSC_VER < 1600
#include <crtassem.h>
#if !defined(_OPENMP)
#define _OPENMP
@@ -196,7 +198,7 @@ const int N = 13*13;
int TestMain () {
#ifdef _PGO_INSTRUMENT
- REPORT("Warning: test_openmp.exe has problems if compiled with -prof-genx; skipping\n");
+ REPORT("Known issue: test_openmp.exe has problems if compiled with -prof-genx; skipping\n");
return Harness::Skipped;
#endif
MinThread = 1;
diff --git a/src/test/test_parallel_for.cpp b/src/test/test_parallel_for.cpp
index 2ffc044..559f346 100644
--- a/src/test/test_parallel_for.cpp
+++ b/src/test/test_parallel_for.cpp
@@ -163,7 +163,18 @@ public:
}
};
+#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> // std::invalid_argument
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
template <typename T>
void TestParallelForWithStepSupport()
{
@@ -193,7 +204,7 @@ void TestParallelForWithStepSupport()
// Testing some corner cases
tbb::parallel_for(static_cast<T>(2), static_cast<T>(1), static_cast<T>(1), TestFunctor<T>());
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
try{
tbb::parallel_for(static_cast<T>(1), static_cast<T>(100), static_cast<T>(0), TestFunctor<T>()); // should cause std::invalid_argument
}catch(std::invalid_argument){
@@ -202,7 +213,7 @@ void TestParallelForWithStepSupport()
catch ( ... ) {
ASSERT ( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unrecognized exception. std::invalid_argument is expected" );
}
-#endif
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
}
// Exception support test
@@ -210,16 +221,13 @@ void TestParallelForWithStepSupport()
#include "tbb/tbb_exception.h"
#include "harness_eh.h"
-class test_functor_with_exception
-{
+#if TBB_USE_EXCEPTIONS
+class test_functor_with_exception {
public:
- void operator ()(size_t) const{
- ThrowTestException();
- }
+ void operator ()(size_t) const { ThrowTestException(); }
};
-void TestExceptionsSupport()
-{
+void TestExceptionsSupport() {
REMARK (__FUNCTION__);
{ // Tests version with a step provided
ResetEhGlobals();
@@ -234,6 +242,7 @@ void TestExceptionsSupport()
CATCH_AND_ASSERT();
}
}
+#endif /* TBB_USE_EXCEPTIONS */
// Cancellation support test
class functor_to_cancel {
@@ -259,7 +268,7 @@ class my_worker_pfor_step_task : public tbb::task
return NULL;
}
public:
- my_worker_pfor_step_task ( tbb::task_group_context &context) : my_ctx(context) { }
+ my_worker_pfor_step_task ( tbb::task_group_context &context_) : my_ctx(context_) { }
};
void TestCancellation()
@@ -327,9 +336,9 @@ int TestMain () {
TestParallelForWithStepSupport<long long>();
TestParallelForWithStepSupport<unsigned long long>();
TestParallelForWithStepSupport<size_t>();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
TestExceptionsSupport();
-#endif
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
if (p>1) TestCancellation();
#if HAVE_m128
TestSSE();
@@ -339,8 +348,8 @@ int TestMain () {
TestCPUUserTime(p);
}
}
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception handling tests are skipped due to a known issue.\n");
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception handling tests are skipped.\n");
#endif
return Harness::Done;
}
diff --git a/src/test/test_parallel_for_each.cpp b/src/test/test_parallel_for_each.cpp
index 8935f50..320aadf 100644
--- a/src/test/test_parallel_for_each.cpp
+++ b/src/test/test_parallel_for_each.cpp
@@ -72,13 +72,33 @@ void RunPForEachTests()
ASSERT(test_vector[NUMBER_OF_ELEMENTS] == 1000000, "parallel_for_each processed an extra element");
}
-// Exception support test
+typedef void (*TestMutatorType)(size_t&);
+
+void TestMutator(size_t& value) {
+ ASSERT(value==0,NULL);
+ ++sum;
+ ++value;
+}
+
+//! Test that tbb::parallel_for_each works for mutable iterators.
+template <typename Iterator>
+void RunMutablePForEachTests() {
+ size_t test_vector[NUMBER_OF_ELEMENTS];
+ for( size_t i=0; i<NUMBER_OF_ELEMENTS; ++i )
+ test_vector[i] = 0;
+ sum = 0;
+ tbb::parallel_for_each( Iterator(test_vector), Iterator(test_vector+NUMBER_OF_ELEMENTS), (TestMutatorType)TestMutator );
+ ASSERT( sum==NUMBER_OF_ELEMENTS, "parallel_for_each called function wrong number of times" );
+ for( size_t i=0; i<NUMBER_OF_ELEMENTS; ++i )
+ ASSERT( test_vector[i]==1, "parallel_for_each did not process each element exactly once" );
+}
+
#define HARNESS_EH_SIMPLE_MODE 1
#include "tbb/tbb_exception.h"
#include "harness_eh.h"
-void test_function_with_exception(size_t)
-{
+#if TBB_USE_EXCEPTIONS
+void test_function_with_exception(size_t) {
ThrowTestException();
}
@@ -99,8 +119,9 @@ void TestExceptionsSupport()
tbb::parallel_for_each(begin, end, (TestFunctionType)test_function_with_exception);
CATCH_AND_ASSERT();
}
+#endif /* TBB_USE_EXCEPTIONS */
-// Cancellaton support test
+// Cancelation support test
void function_to_cancel(size_t ) {
++g_CurExecuted;
CancellatorTask::WaitUntilReady();
@@ -124,7 +145,7 @@ class my_worker_pforeach_task : public tbb::task
return NULL;
}
public:
- my_worker_pforeach_task ( tbb::task_group_context &context) : my_ctx(context) { }
+ my_worker_pforeach_task ( tbb::task_group_context &ctx) : my_ctx(ctx) { }
};
template <typename Iterator>
@@ -147,12 +168,14 @@ int TestMain () {
RunPForEachTests<Harness::RandomIterator<size_t> >();
RunPForEachTests<Harness::InputIterator<size_t> >();
RunPForEachTests<Harness::ForwardIterator<size_t> >();
+ RunMutablePForEachTests<Harness::RandomIterator<size_t> >();
+ RunMutablePForEachTests<Harness::ForwardIterator<size_t> >();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
TestExceptionsSupport<Harness::RandomIterator<size_t> >();
TestExceptionsSupport<Harness::InputIterator<size_t> >();
TestExceptionsSupport<Harness::ForwardIterator<size_t> >();
-#endif
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
if (p > 1) {
TestCancellation<Harness::RandomIterator<size_t> >();
TestCancellation<Harness::InputIterator<size_t> >();
@@ -161,8 +184,8 @@ int TestMain () {
// Test that all workers sleep when no work
TestCPUUserTime(p);
}
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception handling tests are skipped due to a known issue.\n");
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception handling tests are skipped.\n");
#endif
return Harness::Done;
}
diff --git a/src/test/test_parallel_invoke.cpp b/src/test/test_parallel_invoke.cpp
index 9aa3b37..e4ce649 100644
--- a/src/test/test_parallel_invoke.cpp
+++ b/src/test/test_parallel_invoke.cpp
@@ -214,6 +214,7 @@ void test_parallel_invoke()
#define HARNESS_EH_SIMPLE_MODE 1
#include "harness_eh.h"
+#if TBB_USE_EXCEPTIONS
volatile size_t exception_mask; // each bit represents whether the function should throw exception or not
// throws exception if corresponding exception_mask bit is set
@@ -250,8 +251,9 @@ void TestExceptionHandling()
}
}
}
+#endif /* TBB_USE_EXCEPTIONS */
-// Cancellaton support test
+// Cancelation support test
void function_to_cancel() {
++g_CurExecuted;
CancellatorTask::WaitUntilReady();
@@ -309,11 +311,11 @@ int TestMain () {
tbb::task_scheduler_init init(p);
test_parallel_invoke();
if (p > 1) {
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception handling tests are skipped due to a known issue.\n");
-#else
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception handling tests are skipped.\n");
+#elif TBB_USE_EXCEPTIONS
TestExceptionHandling();
-#endif
+#endif /* TBB_USE_EXCEPTIONS */
TestCancellation();
}
TestCPUUserTime(p);
diff --git a/src/test/test_parallel_pipeline.cpp b/src/test/test_parallel_pipeline.cpp
new file mode 100644
index 0000000..0efeb37
--- /dev/null
+++ b/src/test/test_parallel_pipeline.cpp
@@ -0,0 +1,243 @@
+/*
+ Copyright 2005-2010 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.
+*/
+
+// Before including pipeline.h, set up the variable to count heap allocated
+// filter_node objects, and make it known for the header.
+int filter_node_count = 0;
+#define __TBB_TEST_FILTER_NODE_COUNT filter_node_count
+#include "tbb/pipeline.h"
+
+#include "tbb/atomic.h"
+#include "harness.h"
+
+const int n_tokens = 8;
+const int max_counter = 16;
+static tbb::atomic<int> tmp_counter;
+
+class check_type {
+ unsigned int id;
+ bool is_ready;
+public:
+ check_type() : id(0), is_ready(false) {}
+ void function() {
+ if( id == 0 ) {
+ id = 1;
+ is_ready = true;
+ }
+ }
+};
+
+template<typename U>
+class input_filter {
+ tbb::atomic<int> counter;
+public:
+ input_filter() {
+ counter = max_counter;
+ }
+ U operator()( tbb::flow_control& control ) {
+ if( --counter < 0 ) {
+ control.stop();
+ }
+ return U();
+ }
+};
+
+template<>
+class input_filter<void> {
+ tbb::atomic<int> counter;
+public:
+ input_filter() {
+ counter = max_counter;
+ }
+ void operator()( tbb::flow_control& control ) {
+ if( --counter < 0 ) {
+ control.stop();
+ }
+ }
+};
+
+template<typename T, typename U>
+class middle_filter {
+public:
+ U operator()(T /*my_storage*/) {
+ return U();
+ }
+};
+
+template<typename T>
+class output_filter {
+public:
+ void operator()(T) {
+ tmp_counter++;
+ }
+};
+
+void check_and_reset() {
+ ASSERT(tmp_counter == max_counter, "not all tokens were passed through pipeline");
+ tmp_counter = 0;
+}
+
+static const tbb::filter::mode filter_table[] = { tbb::filter::parallel, tbb::filter::serial_in_order, tbb::filter::serial_out_of_order};
+const unsigned number_of_filter_types = sizeof(filter_table)/sizeof(filter_table[0]);
+
+void run_function_spec() {
+ ASSERT(!filter_node_count, NULL);
+ input_filter<void> i_filter;
+ // Test pipeline that contains only one filter
+ for( unsigned i = 0; i<number_of_filter_types; i++) {
+ tbb::filter_t<void, void> one_filter( filter_table[i], i_filter );
+ ASSERT(filter_node_count==1, "some filter nodes left after previous iteration?");
+ tbb::parallel_pipeline( n_tokens, one_filter );
+#if __TBB_LAMBDAS_PRESENT
+ tbb::atomic<int> counter;
+ counter = max_counter;
+ // Construct filter using lambda-syntax when parallel_pipeline() is being run;
+ tbb::parallel_pipeline( n_tokens,
+ tbb::make_filter<void, void>(filter_table[i], [&counter]( tbb::flow_control& control ) {
+ if( counter-- == 0 )
+ control.stop();
+ }
+ )
+ );
+#endif
+ }
+ ASSERT(!filter_node_count, "filter_node objects leaked");
+}
+
+template<typename type1, typename type2>
+void run_function() {
+ ASSERT(!filter_node_count, NULL);
+
+ const size_t number_of_filters = 3;
+
+ input_filter<type1> i_filter;
+ middle_filter<type1, type2> m_filter;
+ output_filter<type2> o_filter;
+
+ unsigned limit = 1;
+ // Test pipeline that contains number_of_filters filters
+ for( unsigned i=0; i<number_of_filters; ++i)
+ limit *= number_of_filter_types;
+ // Iterate over possible filter sequences
+ for( unsigned numeral=0; numeral<limit; ++numeral ) {
+ unsigned temp = numeral;
+ tbb::filter::mode filter_type[number_of_filter_types];
+ for( unsigned i=0; i<number_of_filters; ++i, temp/=number_of_filter_types )
+ filter_type[i] = filter_table[temp%number_of_filter_types];
+
+ tbb::filter_t<void, type1> filter1( filter_type[0], i_filter );
+ tbb::filter_t<type1, type2> filter2( filter_type[1], m_filter );
+ tbb::filter_t<type2, void> filter3( filter_type[2], o_filter );
+ ASSERT(filter_node_count==3, "some filter nodes left after previous iteration?");
+ // Create filters sequence when parallel_pipeline() is being run
+ tbb::parallel_pipeline( n_tokens, filter1 & filter2 & filter3 );
+ check_and_reset();
+
+ // Create filters sequence partially outside parallel_pipeline() and also when parallel_pipeline() is being run
+ tbb::filter_t<void, type2> filter12;
+ filter12 = filter1 & filter2;
+ tbb::parallel_pipeline( n_tokens, filter12 & filter3 );
+ check_and_reset();
+
+ tbb::filter_t<void, void> filter123 = filter12 & filter3;
+ // Run pipeline twice with the same filter sequence
+ for( unsigned i = 0; i<2; i++ ) {
+ tbb::parallel_pipeline( n_tokens, filter123 );
+ check_and_reset();
+ }
+
+ // Now copy-construct another filter_t instance, and use it to run pipeline
+ {
+ tbb::filter_t<void, void> copy123( filter123 );
+ tbb::parallel_pipeline( n_tokens, copy123 );
+ check_and_reset();
+ }
+
+ // Construct filters and create the sequence when parallel_pipeline() is being run
+ tbb::parallel_pipeline( n_tokens,
+ tbb::make_filter<void, type1>(filter_type[0], i_filter) &
+ tbb::make_filter<type1, type2>(filter_type[1], m_filter) &
+ tbb::make_filter<type2, void>(filter_type[2], o_filter) );
+ check_and_reset();
+
+ // Construct filters, make a copy, destroy the original filters, and run with the copy
+ int cnt = filter_node_count;
+ {
+ tbb::filter_t<void, void>* p123 = new tbb::filter_t<void,void> (
+ tbb::make_filter<void, type1>(filter_type[0], i_filter) &
+ tbb::make_filter<type1, type2>(filter_type[1], m_filter) &
+ tbb::make_filter<type2, void>(filter_type[2], o_filter) );
+ ASSERT(filter_node_count==cnt+5, "filter node accounting error?");
+ tbb::filter_t<void, void> copy123( *p123 );
+ delete p123;
+ ASSERT(filter_node_count==cnt+5, "filter nodes deleted prematurely?");
+ tbb::parallel_pipeline( n_tokens, copy123 );
+ check_and_reset();
+ }
+ ASSERT(filter_node_count==cnt, "scope ended but filter nodes not deleted?");
+
+#if __TBB_LAMBDAS_PRESENT
+ tbb::atomic<int> counter;
+ counter = max_counter;
+ // Construct filters using lambda-syntax and create the sequence when parallel_pipeline() is being run;
+ tbb::parallel_pipeline( n_tokens,
+ tbb::make_filter<void, type1>(filter_type[0], [&counter]( tbb::flow_control& control ) -> type1 {
+ if( --counter < 0 )
+ control.stop();
+ return type1(); }
+ ) &
+ tbb::make_filter<type1, type2>(filter_type[1], []( type1 /*my_storage*/ ) -> type2 {
+ return type2(); }
+ ) &
+ tbb::make_filter<type2, void>(filter_type[2], [] ( type2 ) -> void {
+ tmp_counter++; }
+ )
+ );
+ check_and_reset();
+#endif
+ }
+ ASSERT(!filter_node_count, "filter_node objects leaked");
+}
+
+#include "tbb/task_scheduler_init.h"
+
+int TestMain() {
+ // Test with varying number of threads.
+ for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
+ // Initialize TBB task scheduler
+ tbb::task_scheduler_init init(nthread);
+
+ // Run test several times with different types
+ run_function_spec();
+ run_function<size_t,int>();
+ run_function<int,double>();
+ run_function<check_type,size_t>();
+ }
+ return Harness::Done;
+}
+
diff --git a/src/test/test_parallel_sort.cpp b/src/test/test_parallel_sort.cpp
index ca22a00..58df967 100644
--- a/src/test/test_parallel_sort.cpp
+++ b/src/test/test_parallel_sort.cpp
@@ -26,18 +26,28 @@
the GNU General Public License.
*/
+#include "tbb/parallel_sort.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/concurrent_vector.h"
+#include "harness.h"
#include <math.h>
+#include <exception>
+
+#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 <algorithm>
#include <iterator>
#include <functional>
#include <string>
#include <cstring>
-#include <exception>
-#include "tbb/parallel_sort.h"
-#include "tbb/task_scheduler_init.h"
-#include "tbb/concurrent_vector.h"
-#include "harness.h"
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
/** Has tightly controlled interface so that we can verify
that parallel_sort uses only the required interface. */
diff --git a/src/test/test_pipeline_with_tbf.cpp b/src/test/test_pipeline_with_tbf.cpp
index 903d451..2376434 100644
--- a/src/test/test_pipeline_with_tbf.cpp
+++ b/src/test/test_pipeline_with_tbf.cpp
@@ -152,11 +152,10 @@ public:
unsigned long next_input;
unsigned free_buffer = 0;
{ // lock protected scope
- tbb::atomic<tbb::internal::Token>& current_token = this->current_token;
tbb::spin_mutex::scoped_lock lock(input_lock);
- if( current_token>=StreamSize )
+ if( this->current_token>=StreamSize )
return NULL;
- next_input = current_token++;
+ next_input = this->current_token++;
// once in a while, emulate waiting for input; this only makes sense for serial input
if( this->is_serial() && WaitTest.required() )
WaitTest.probe( );
@@ -337,6 +336,8 @@ void TestTrivialPipeline( unsigned nthread, unsigned number_of_filters ) {
delete filter[i];
filter[i] = NULL;
}
+ for( unsigned j = 0; j<number_of_tb_filters; j++)
+ delete t[j];
pipeline.clear();
}
}
diff --git a/src/test/test_reader_writer_lock.cpp b/src/test/test_reader_writer_lock.cpp
new file mode 100644
index 0000000..86a4dd0
--- /dev/null
+++ b/src/test/test_reader_writer_lock.cpp
@@ -0,0 +1,226 @@
+/*
+ Copyright 2005-2010 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.
+*/
+
+// test reader_writer_lock
+#include "tbb/reader_writer_lock.h"
+#include "tbb/atomic.h"
+#include "tbb/tbb_exception.h"
+#include "harness_assert.h"
+#include "harness.h"
+
+tbb::reader_writer_lock the_mutex;
+const int MAX_WORK = 10000;
+
+tbb::atomic<size_t> active_readers, active_writers;
+tbb::atomic<bool> sim_readers;
+
+
+int BusyWork(int percentOfMaxWork) {
+ int iters = 0;
+ for (int i=0; i<MAX_WORK*((double)percentOfMaxWork/100.0); ++i) {
+ iters++;
+ }
+ return iters;
+}
+
+struct StressRWLBody : NoAssign {
+ const int nThread;
+ const int percentMax;
+
+ StressRWLBody(int nThread_, int percentMax_) : nThread(nThread_), percentMax(percentMax_) {}
+
+ void operator()(const int /* threadID */ ) const {
+ int nIters = 100;
+ int r_result=0, w_result=0;
+ for(int i=0; i<nIters; ++i) {
+ // test unscoped blocking write lock
+ the_mutex.lock();
+ w_result += BusyWork(percentMax);
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ // test exception for recursive write lock
+ bool was_caught = false;
+ try {
+ the_mutex.lock();
+ }
+ catch(tbb::improper_lock& ex) {
+ REMARK("improper_lock: %s\n", ex.what());
+ was_caught = true;
+ }
+ catch(...) {
+ REPORT("Wrong exception caught during recursive lock attempt.");
+ }
+ ASSERT(was_caught, "Recursive lock attempt exception not caught properly.");
+ // test exception for recursive read lock
+ was_caught = false;
+ try {
+ the_mutex.lock_read();
+ }
+ catch(tbb::improper_lock& ex) {
+ REMARK("improper_lock: %s\n", ex.what());
+ was_caught = true;
+ }
+ catch(...) {
+ REPORT("Wrong exception caught during recursive lock attempt.");
+ }
+ ASSERT(was_caught, "Recursive lock attempt exception not caught properly.");
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
+ the_mutex.unlock();
+ // test unscoped non-blocking write lock
+ if (the_mutex.try_lock()) {
+ w_result += BusyWork(percentMax);
+ the_mutex.unlock();
+ }
+ // test unscoped blocking read lock
+ the_mutex.lock_read();
+ r_result += BusyWork(percentMax);
+ the_mutex.unlock();
+ // test unscoped non-blocking read lock
+ if(the_mutex.try_lock_read()) {
+ r_result += BusyWork(percentMax);
+ the_mutex.unlock();
+ }
+ { // test scoped blocking write lock
+ tbb::reader_writer_lock::scoped_lock my_lock(the_mutex);
+ w_result += BusyWork(percentMax);
+ }
+ { // test scoped blocking read lock
+ tbb::reader_writer_lock::scoped_lock_read my_lock(the_mutex);
+ r_result += BusyWork(percentMax);
+ }
+ }
+ REMARK("%d reader %d writer iterations of busy work were completed.", r_result, w_result);
+ }
+};
+
+struct CorrectRWLScopedBody : NoAssign {
+ const int nThread;
+
+ CorrectRWLScopedBody(int nThread_) : nThread(nThread_) {}
+
+ void operator()(const int /* threadID */ ) const {
+ bool is_reader;
+
+ for (int i=0; i<50; i++) {
+ if (i%5==0) is_reader = false; // 1 writer for every 5 readers
+ else is_reader = true;
+
+ if (is_reader) {
+ tbb::reader_writer_lock::scoped_lock_read my_lock(the_mutex);
+ active_readers++;
+ if (active_readers > 1) sim_readers = true;
+ ASSERT(active_writers==0, "Active writers in read-locked region.");
+ Harness::Sleep(10);
+ active_readers--;
+ }
+ else { // is writer
+ tbb::reader_writer_lock::scoped_lock my_lock(the_mutex);
+ active_writers++;
+ ASSERT(active_readers==0, "Active readers in write-locked region.");
+ ASSERT(active_writers<=1, "More than one active writer in write-locked region.");
+ Harness::Sleep(10);
+ active_writers--;
+ }
+ }
+ }
+};
+
+struct CorrectRWLBody : NoAssign {
+ const int nThread;
+
+ CorrectRWLBody(int nThread_) : nThread(nThread_) {}
+
+ void operator()(const int /* threadID */ ) const {
+ bool is_reader;
+
+ for (int i=0; i<50; i++) {
+ if (i%5==0) is_reader = false; // 1 writer for every 5 readers
+ else is_reader = true;
+
+ if (is_reader) {
+ the_mutex.lock_read();
+ active_readers++;
+ if (active_readers > 1) sim_readers = true;
+ ASSERT(active_writers==0, "Active writers in read-locked region.");
+ }
+ else { // is writer
+ the_mutex.lock();
+ active_writers++;
+ ASSERT(active_readers==0, "Active readers in write-locked region.");
+ ASSERT(active_writers<=1, "More than one active writer in write-locked region.");
+ }
+ Harness::Sleep(10);
+ if (is_reader) {
+ active_readers--;
+ }
+ else { // is writer
+ active_writers--;
+ }
+ the_mutex.unlock();
+ }
+ }
+};
+
+void TestReaderWriterLockOnNThreads(int nThreads) {
+ // Stress-test all interfaces
+ for (int pc=0; pc<101; pc+=20) {
+ REMARK("\nTesting reader_writer_lock with %d threads, percent of MAX_WORK=%d", nThreads, pc);
+ StressRWLBody myStressBody(nThreads, pc);
+ NativeParallelFor(nThreads, myStressBody);
+ }
+
+ // Test mutual exclusion in direct locking mode
+ CorrectRWLBody myCorrectBody(nThreads);
+ active_writers = active_readers = 0;
+ sim_readers = false;
+ NativeParallelFor(nThreads, myCorrectBody);
+ ASSERT(sim_readers || nThreads<2, "There were no simultaneous readers.");
+ REMARK("Unscoped lock testing succeeded on %d threads.", nThreads);
+
+ // Test mutual exclusionin scoped locking mode
+ CorrectRWLScopedBody myCorrectScopedBody(nThreads);
+ active_writers = active_readers = 0;
+ sim_readers = false;
+ NativeParallelFor(nThreads, myCorrectScopedBody);
+ ASSERT(sim_readers || nThreads<2, "There were no simultaneous readers.");
+ REMARK("Scoped lock testing succeeded on %d threads.", nThreads);
+}
+
+void TestReaderWriterLock() {
+ for(int p = MinThread; p <= MaxThread; p++) {
+ TestReaderWriterLockOnNThreads(p);
+ }
+}
+
+
+int TestMain() {
+ if(MinThread <= 0) MinThread = 1;
+ if(MaxThread > 0) {
+ TestReaderWriterLock();
+ }
+ return Harness::Done;
+}
diff --git a/src/test/test_rwm_upgrade_downgrade.cpp b/src/test/test_rwm_upgrade_downgrade.cpp
index 7a8582b..1cb26e2 100644
--- a/src/test/test_rwm_upgrade_downgrade.cpp
+++ b/src/test/test_rwm_upgrade_downgrade.cpp
@@ -44,7 +44,7 @@ struct Hammer: NoAssign {
for( int j=0; j<100000; ++j ) {
typename RWMutex::scoped_lock lock(MutexProtectingCount,false);
int c = Count;
- for( int j=0; j<10; ++j ) {
+ for( int k=0; k<10; ++k ) {
++dummy;
}
if( lock.upgrade_to_writer() ) {
@@ -53,11 +53,11 @@ struct Hammer: NoAssign {
} else {
c = Count;
}
- for( int j=0; j<10; ++j ) {
+ for( int k=0; k<10; ++k ) {
++Count;
}
lock.downgrade_to_reader();
- for( int j=0; j<10; ++j ) {
+ for( int k=0; k<10; ++k ) {
++dummy;
}
}
@@ -69,6 +69,7 @@ spin_rw_mutex SRW_mutex;
int TestMain () {
for( int p=MinThread; p<=MaxThread; ++p ) {
+ REMARK("Testing on %d threads", p);
Count = 0;
NativeParallelFor( p, Hammer<queuing_rw_mutex>(QRW_mutex) );
Count = 0;
diff --git a/src/tbb/itt_notify_proxy.c b/src/test/test_std_thread.cpp
similarity index 70%
copy from src/tbb/itt_notify_proxy.c
copy to src/test/test_std_thread.cpp
index 7fdedfa..5032606 100644
--- a/src/tbb/itt_notify_proxy.c
+++ b/src/test/test_std_thread.cpp
@@ -26,30 +26,16 @@
the GNU General Public License.
*/
-#include "tbb/tbb_config.h"
-
-/* This declaration in particular shuts up "empty translation unit" warning */
-extern int __TBB_load_ittnotify();
-
-#if __TBB_NEW_ITT_NOTIFY
-#if DO_ITT_NOTIFY
-
-#if _WIN32||_WIN64
- #ifndef UNICODE
- #define UNICODE
- #endif
-#endif /* WIN */
-
-extern void ITT_DoOneTimeInitialization();
-
-#define ITT_SIMPLE_INIT 1
-#define __itt_init_lib_name ITT_DoOneTimeInitialization
-
-#include "tools_api/ittnotify_static.c"
-
-int __TBB_load_ittnotify() {
- return __itt_init_lib();
+#define TBB_IMPLEMENT_CPP0X 1
+#include "tbb/compat/thread"
+#define THREAD std::thread
+#define THIS_THREAD std::this_thread
+#define THIS_THREAD_SLEEP THIS_THREAD::sleep_for
+#include "test_thread.h"
+#include "harness.h"
+
+int TestMain () {
+ CheckSignatures();
+ RunTests();
+ return Harness::Done;
}
-
-#endif /* DO_ITT_NOTIFY */
-#endif /* __TBB_NEW_ITT_NOTIFY */
diff --git a/src/test/test_task.cpp b/src/test/test_task.cpp
index 42ca1f0..197f168 100644
--- a/src/test/test_task.cpp
+++ b/src/test/test_task.cpp
@@ -33,10 +33,17 @@
#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
//------------------------------------------------------------------------
-
class UnboundedlyRecursiveOnUnboundedStealingTask : public tbb::task {
typedef UnboundedlyRecursiveOnUnboundedStealingTask this_type;
@@ -44,21 +51,21 @@ class UnboundedlyRecursiveOnUnboundedStealingTask : public tbb::task {
const int m_Depth;
volatile bool m_GoAhead;
- volatile uintptr_t m_Anchor;
-
// Well, virtually unboundedly, for any practical purpose
static const int max_depth = 1000000;
public:
- UnboundedlyRecursiveOnUnboundedStealingTask( this_type *parent = NULL, int depth = max_depth )
- : m_Parent(parent)
- , m_Depth(depth)
+ UnboundedlyRecursiveOnUnboundedStealingTask( this_type *parent_ = NULL, int depth_ = max_depth )
+ : m_Parent(parent_)
+ , m_Depth(depth_)
, m_GoAhead(true)
- , m_Anchor(0)
{}
/*override*/
tbb::task* execute() {
+ // Using large padding array sppeds up reaching stealing limit
+ const int paddingSize = 16 * 1024;
+ volatile char padding[paddingSize];
if( !m_Parent || (m_Depth > 0 && m_Parent->m_GoAhead) ) {
if ( m_Parent ) {
// We are stolen, let our parent to start waiting for us
@@ -69,7 +76,7 @@ public:
spawn( t );
// Give a willing thief a chance to steal
for( int i = 0; i < 1000000 && m_GoAhead; ++i ) {
- m_Anchor += 1;
+ ++padding[i % paddingSize];
__TBB_Yield();
}
// If our child has not been stolen yet, then prohibit it siring ones
@@ -81,8 +88,6 @@ public:
}
}; // UnboundedlyRecursiveOnUnboundedStealingTask
-
-
tbb::atomic<int> Count;
class RecursiveTask: public tbb::task {
@@ -91,7 +96,9 @@ class RecursiveTask: public tbb::task {
//! Spawn tasks in list. Exact method depends upon m_Depth&bit_mask.
void SpawnList( tbb::task_list& list, int bit_mask ) {
if( m_Depth&bit_mask ) {
- spawn(list);
+ // Take address to check that signature of spawn(task_list&) is static.
+ void (*s)(tbb::task_list&) = &tbb::task::spawn;
+ (*s)(list);
ASSERT( list.empty(), NULL );
wait_for_all();
} else {
@@ -100,7 +107,7 @@ class RecursiveTask: public tbb::task {
}
}
public:
- RecursiveTask( int child_count, int depth ) : m_ChildCount(child_count), m_Depth(depth) {}
+ RecursiveTask( int child_count, int depth_ ) : m_ChildCount(child_count), m_Depth(depth_) {}
/*override*/ tbb::task* execute() {
++Count;
if( m_Depth>0 ) {
@@ -138,7 +145,7 @@ void TestStealLimit( int nthread ) {
//! Test task::spawn( task_list& )
void TestSpawnChildren( int nthread ) {
- REMARK("testing task::spawn_children for %d threads\n",nthread);
+ REMARK("testing task::spawn(task_list&) for %d threads\n",nthread);
tbb::task_scheduler_init init(nthread);
for( int j=0; j<50; ++j ) {
Count = 0;
@@ -174,7 +181,7 @@ class TaskGenerator: public tbb::task {
int m_Depth;
public:
- TaskGenerator( int child_count, int depth ) : m_ChildCount(child_count), m_Depth(depth) {}
+ TaskGenerator( int child_count, int _depth ) : m_ChildCount(child_count), m_Depth(_depth) {}
~TaskGenerator( ) { m_ChildCount = m_Depth = -125; }
/*override*/ tbb::task* execute() {
@@ -182,10 +189,12 @@ public:
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);
- spawn(t);
+ GetTaskPtr(k)->spawn(t);
}
+ ASSERT(k==m_ChildCount,NULL);
--m_Depth;
__TBB_Yield();
ASSERT( state()==recycle && ref_count()>0, NULL);
@@ -252,7 +261,7 @@ void TestAffinity( int nthread ) {
t->set_ref_count(n);
// Spawn n-1 affinitized children.
for( int i=1; i<n; ++i )
- t->spawn( *new(t->allocate_child()) AffinityTask(i) );
+ tbb::task::spawn( *new(t->allocate_child()) AffinityTask(i) );
if( n>1 ) {
// Keep master from stealing
while( TotalCount!=n-1 )
@@ -260,7 +269,9 @@ void TestAffinity( int nthread ) {
}
// Wait for the children
t->wait_for_all();
- t->destroy(*t);
+ int k = 0;
+ GetTaskPtr(k)->destroy(*t);
+ ASSERT(k==1,NULL);
}
struct NoteAffinityTask: public tbb::task {
@@ -284,15 +295,17 @@ struct NoteAffinityTask: public tbb::task {
// This test checks one of the paths inside the scheduler by affinitizing the child task
// to non-existent thread so that it is proxied in the local task pool but not retrieved
// by another thread.
+// If no workers requested, the extra slot #2 is allocated for a worker thread to serve
+// "enqueued" tasks. In this test, it is used only for the affinity purpose.
void TestNoteAffinityContext() {
tbb::task_scheduler_init init(1);
tbb::empty_task* t = new( tbb::task::allocate_root() ) tbb::empty_task;
t->set_ref_count(2);
// This master in the absence of workers will have an affinity id of 1.
// So use another number to make the task get proxied.
- t->spawn( *new(t->allocate_child()) NoteAffinityTask(2) );
+ tbb::task::spawn( *new(t->allocate_child()) NoteAffinityTask(2) );
t->wait_for_all();
- t->destroy(*t);
+ tbb::task::destroy(*t);
}
//------------------------------------------------------------------------
@@ -300,6 +313,7 @@ void TestNoteAffinityContext() {
// when a task's constructor throws an exception.
//------------------------------------------------------------------------
+#if TBB_USE_EXCEPTIONS
static int TestUnconstructibleTaskCount;
struct ConstructionFailure {
@@ -357,6 +371,7 @@ void TestUnconstructibleTask() {
tbb::task::spawn_root_and_wait(*t);
ASSERT( TestUnconstructibleTaskCount==4, NULL );
}
+#endif /* TBB_USE_EXCEPTIONS */
//------------------------------------------------------------------------
// Test for alignment problems with task objects.
@@ -442,10 +457,10 @@ int Fib( int n ) {
int y=-1;
tbb::task* root_task = new( tbb::task::allocate_root() ) tbb::empty_task;
root_task->set_ref_count(2);
- root_task->spawn( *new( root_task->allocate_child() ) RightFibTask(&y,n) );
+ tbb::task::spawn( *new( root_task->allocate_child() ) RightFibTask(&y,n) );
int x = Fib(n-2);
root_task->wait_for_all();
- tbb::task::self().destroy(*root_task);
+ tbb::task::destroy(*root_task);
return y+x;
}
}
@@ -524,7 +539,7 @@ void TestDag( int p ) {
a[n-1][n-1]->increment_ref_count();
a[n-1][n-1]->spawn_and_wait_for_all(*a[0][0]);
ASSERT( DagTask::execution_count == n*n - 1, NULL );
- a[n-1][n-1]->destroy(*a[n-1][n-1]);
+ tbb::task::destroy(*a[n-1][n-1]);
ASSERT( DagTask::destruction_count > n*n - p, NULL );
while ( DagTask::destruction_count != n*n )
__TBB_Yield();
@@ -544,7 +559,7 @@ class RelaxedOwnershipTask: public tbb::task {
r.set_ref_count( 1 );
m_barrier.wait();
p.spawn( *new(p.allocate_child()) tbb::empty_task );
- p.spawn( *new(p.allocate_additional_child_of(p)) tbb::empty_task );
+ p.spawn( *new(task::allocate_additional_child_of(p)) tbb::empty_task );
p.spawn( m_taskToSpawn );
p.destroy( m_taskToDestroy );
r.spawn_and_wait_for_all( m_taskToExecute );
@@ -581,7 +596,10 @@ void TestRelaxedOwnership( int p ) {
tl.push_back( *new( r.allocate_child() ) RelaxedOwnershipTask(tS, tD, tE) );
}
r.set_ref_count( 5 * p + 1 );
- r.spawn_and_wait_for_all( tl );
+ int k=0;
+ GetTaskPtr(k)->spawn( tl );
+ ASSERT(k==1,NULL);
+ r.wait_for_all();
r.destroy( r );
}
@@ -593,7 +611,7 @@ void RunSchedulerInstanceOnUserThread( int n_child ) {
tbb::task* e = new( tbb::task::allocate_root() ) tbb::empty_task;
e->set_ref_count(1+n_child);
for( int i=0; i<n_child; ++i )
- e->spawn( *new(e->allocate_child()) tbb::empty_task );
+ tbb::task::spawn( *new(e->allocate_child()) tbb::empty_task );
e->wait_for_all();
e->destroy(*e);
}
@@ -613,8 +631,8 @@ class TaskWithChildToSteal : public tbb::task {
volatile bool m_GoAhead;
public:
- TaskWithChildToSteal( int depth )
- : m_Depth(depth)
+ TaskWithChildToSteal( int depth_ )
+ : m_Depth(depth_)
, m_GoAhead(false)
{}
@@ -623,19 +641,19 @@ public:
m_GoAhead = true;
if ( m_Depth > 0 ) {
TaskWithChildToSteal &t = *new( tbb::task::allocate_child() ) TaskWithChildToSteal(m_Depth - 1);
- t.SpawnMeAndWaitOn( *this );
+ t.SpawnAndWaitOnParent();
}
else
Harness::Sleep(50); // The last task in chain sleeps for 50 ms
return NULL;
}
- void SpawnMeAndWaitOn( tbb::task& parent ) {
- parent.set_ref_count( 2 );
- parent.spawn( *this );
+ void SpawnAndWaitOnParent() {
+ parent()->set_ref_count( 2 );
+ parent()->spawn( *this );
while (!this->m_GoAhead )
__TBB_Yield();
- parent.wait_for_all();
+ parent()->wait_for_all();
}
}; // TaskWithChildToSteal
@@ -649,31 +667,323 @@ void TestDispatchLoopResponsiveness() {
tbb::task &r = *new( tbb::task::allocate_root() ) tbb::empty_task;
for ( int depth = 0; depth < 3; ++depth ) {
TaskWithChildToSteal &t = *new( r.allocate_child() ) TaskWithChildToSteal(depth);
- t.SpawnMeAndWaitOn(r);
+ t.SpawnAndWaitOnParent();
}
r.destroy(r);
// The success criteria of this test is not hanging
}
+void TestWaitDiscriminativenessWithoutStealing() {
+ REMARK( "testing that task::wait_for_all is specific to the root it is called on (no workers)\n" );
+ // The test relies on the strict LIFO scheduling order in the absence of workers
+ tbb::task_scheduler_init init(1);
+ tbb::task &r1 = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ tbb::task &r2 = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ const int NumChildren = 10;
+ r1.set_ref_count( NumChildren + 1 );
+ r2.set_ref_count( NumChildren + 1 );
+ for( int i=0; i < NumChildren; ++i ) {
+ tbb::empty_task &t1 = *new( r1.allocate_child() ) tbb::empty_task;
+ tbb::empty_task &t2 = *new( r2.allocate_child() ) tbb::empty_task;
+ tbb::task::spawn(t1);
+ tbb::task::spawn(t2);
+ }
+ r2.wait_for_all();
+ ASSERT( r2.ref_count() <= 1, "Not all children of r2 executed" );
+ ASSERT( r1.ref_count() > 1, "All children of r1 prematurely executed" );
+ r1.wait_for_all();
+ ASSERT( r1.ref_count() <= 1, "Not all children of r1 executed" );
+ r1.destroy(r1);
+ r2.destroy(r2);
+}
+
+
+using tbb::internal::spin_wait_until_eq;
+
+//! Deterministic emulation of a long running task
+class LongRunningTask : public tbb::task {
+ volatile bool& m_CanProceed;
+
+ tbb::task* execute() {
+ spin_wait_until_eq( m_CanProceed, true );
+ return NULL;
+ }
+public:
+ LongRunningTask ( volatile bool& canProceed ) : m_CanProceed(canProceed) {}
+};
+
+void TestWaitDiscriminativenessWithStealing() {
+ if( tbb::tbb_thread::hardware_concurrency() < 2 )
+ return;
+ REMARK( "testing that task::wait_for_all is specific to the root it is called on (one worker)\n" );
+ volatile bool canProceed = false;
+ tbb::task_scheduler_init init(2);
+ tbb::task &r1 = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ tbb::task &r2 = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ r1.set_ref_count( 2 );
+ r2.set_ref_count( 2 );
+ tbb::task& t1 = *new( r1.allocate_child() ) tbb::empty_task;
+ tbb::task& t2 = *new( r2.allocate_child() ) LongRunningTask(canProceed);
+ tbb::task::spawn(t2);
+ tbb::task::spawn(t1);
+ r1.wait_for_all();
+ ASSERT( r1.ref_count() <= 1, "Not all children of r1 executed" );
+ ASSERT( r2.ref_count() == 2, "All children of r2 prematurely executed" );
+ canProceed = true;
+ r2.wait_for_all();
+ ASSERT( r2.ref_count() <= 1, "Not all children of r2 executed" );
+ r1.destroy(r1);
+ r2.destroy(r2);
+}
+
+struct MasterBody : NoAssign, Harness::NoAfterlife {
+ static Harness::SpinBarrier my_barrier;
+
+ class BarrenButLongTask : public tbb::task {
+ volatile bool& m_Started;
+ volatile bool& m_CanProceed;
+
+ tbb::task* execute() {
+ m_Started = true;
+ spin_wait_until_eq( m_CanProceed, true );
+ volatile int k = 0;
+ for ( int i = 0; i < 1000000; ++i ) ++k;
+ return NULL;
+ }
+ public:
+ BarrenButLongTask ( volatile bool& started, volatile bool& can_proceed )
+ : m_Started(started), m_CanProceed(can_proceed)
+ {}
+ };
+
+ class BinaryRecursiveTask : public tbb::task {
+ int m_Depth;
+
+ tbb::task* execute() {
+ if( !m_Depth )
+ return NULL;
+ set_ref_count(3);
+ spawn( *new( tbb::task::allocate_child() ) BinaryRecursiveTask(m_Depth - 1) );
+ spawn( *new( tbb::task::allocate_child() ) BinaryRecursiveTask(m_Depth - 1) );
+ wait_for_all();
+ return NULL;
+ }
+
+ void note_affinity( affinity_id ) {
+ __TBB_ASSERT( false, "These tasks cannot be stolen" );
+ }
+ public:
+ BinaryRecursiveTask ( int depth_ ) : m_Depth(depth_) {}
+ };
+
+ void operator() ( int id ) const {
+ if ( id ) {
+ tbb::task_scheduler_init init(2);
+ volatile bool child_started = false,
+ can_proceed = false;
+ tbb::task& r = *new( tbb::task::allocate_root() ) tbb::empty_task;
+ r.set_ref_count(2);
+ r.spawn( *new(r.allocate_child()) BarrenButLongTask(child_started, can_proceed) );
+ spin_wait_until_eq( child_started, true );
+ my_barrier.wait();
+ can_proceed = true;
+ r.wait_for_all();
+ r.destroy(r);
+ }
+ else {
+ my_barrier.wait();
+ tbb::task_scheduler_init init(1);
+ Count = 0;
+ int depth = 16;
+ BinaryRecursiveTask& r = *new( tbb::task::allocate_root() ) BinaryRecursiveTask(depth);
+ tbb::task::spawn_root_and_wait(r);
+ }
+ }
+public:
+ MasterBody ( int num_masters ) { my_barrier.initialize(num_masters); }
+};
+
+Harness::SpinBarrier MasterBody::my_barrier;
+
+/** Ensures that tasks spawned by a master thread or one of the workers servicing
+ it cannot be stolen by another master thread. **/
+void TestMastersIsolation ( int p ) {
+ // The test requires at least 3-way parallelism to work correctly
+ if ( p > 2 && tbb::task_scheduler_init::default_num_threads() >= p ) {
+ tbb::task_scheduler_init init(p);
+ NativeParallelFor( p, MasterBody(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( tbb::task::allocate_root() ) TaskGenerator(2,2);
+ tbb::task::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 (tbb::task::allocate_root()) tbb::empty_task;
+ successor->set_ref_count(2);
+ enqueue( *new (tbb::task::allocate_root()) EnqueuedTask(successor, 1, track) );
+ enqueue( *new (tbb::task::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?");
+ }
+ 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_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if TBB_USE_EXCEPTIONS
TestUnconstructibleTask<1>();
TestUnconstructibleTask<10000>();
#endif
TestAlignment();
TestNoteAffinityContext();
TestDispatchLoopResponsiveness();
+ TestWaitDiscriminativenessWithoutStealing();
+ TestWaitDiscriminativenessWithStealing();
for( int p=MinThread; p<=MaxThread; ++p ) {
TestSpawnChildren( p );
TestSpawnRootList( p );
TestSafeContinuation( p );
+ TestEnqueue( p );
TestLeftRecursion( p );
TestDag( p );
TestAffinity( p );
TestUserThread( p );
TestStealLimit( p );
TestRelaxedOwnership( p );
+#if __TBB_ARENA_PER_MASTER
+ TestMastersIsolation( p );
+#endif /* __TBB_ARENA_PER_MASTER */
}
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 22bfd41..b5b9984 100644
--- a/src/test/test_task_assertions.cpp
+++ b/src/test/test_task_assertions.cpp
@@ -26,19 +26,29 @@
the GNU General Public License.
*/
-// to avoid usage of #pragma comment
-#define __TBB_NO_IMPLICIT_LINKAGE 1
-#define __TBB_TASK_CPP_DIRECTLY_INCLUDED 1
-#include "../tbb/task.cpp"
+// Test correctness of forceful TBB initialization before any dynamic initialization
+// of static objects inside the library took place.
+namespace tbb {
+namespace internal {
+ // Forward declaration of the TBB general initialization routine from task.cpp
+ void DoOneTimeInitializations();
+}}
+
+struct StaticInitializationChecker {
+ StaticInitializationChecker () { tbb::internal::DoOneTimeInitializations(); }
+} theChecker;
//------------------------------------------------------------------------
// Test that important assertions in class task fail as expected.
//------------------------------------------------------------------------
+#include "harness_inject_scheduler.h"
+
#define HARNESS_NO_PARSE_COMMAND_LINE 1
#include "harness.h"
#include "harness_bad_expr.h"
+#if TRY_BAD_EXPR_ENABLED
//! Task that will be abused.
tbb::task* volatile AbusedTask;
@@ -61,15 +71,12 @@ struct AbuseOneTask {
TRY_BAD_EXPR(AbusedTask->recycle_as_continuation(), "execute" );
TRY_BAD_EXPR(AbusedTask->recycle_as_safe_continuation(), "execute" );
TRY_BAD_EXPR(AbusedTask->recycle_to_reexecute(), "execute" );
-
-
++AbuseOneTaskRan;
}
};
//! Test various __TBB_ASSERT assertions related to class tbb::task.
void TestTaskAssertions() {
-#if TBB_USE_ASSERT
// Catch assertion failures
tbb::set_assertion_handler( AssertionFailureHandler );
tbb::task_scheduler_init init;
@@ -80,14 +87,17 @@ void TestTaskAssertions() {
AbusedTask->destroy(*AbusedTask);
// Restore normal assertion handling
tbb::set_assertion_handler( NULL );
-#endif /* TBB_USE_ASSERT */
}
int TestMain () {
-#if __TBB_EXCEPTION_HANDLING_BROKEN || __TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
- return Harness::Skipped;
-#else
TestTaskAssertions();
return Harness::Done;
-#endif
}
+
+#else /* !TRY_BAD_EXPR_ENABLED */
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#endif /* !TRY_BAD_EXPR_ENABLED */
diff --git a/src/test/test_task_auto_init.cpp b/src/test/test_task_auto_init.cpp
index 461eda9..261b1df 100644
--- a/src/test/test_task_auto_init.cpp
+++ b/src/test/test_task_auto_init.cpp
@@ -121,7 +121,7 @@ struct TestThreadBody : NoAssign, Harness::NoAfterlife {
#include "../tbb/tls.h"
void UseAFewNewTlsKeys () {
- tbb::internal::tls<volatile intptr_t> tls1, tls2, tls3, tls4;
+ tbb::internal::tls<intptr_t> tls1, tls2, tls3, tls4;
tls1 = tls2 = tls3 = tls4 = -1;
}
@@ -171,8 +171,8 @@ struct DriverThreadBody : NoAssign, Harness::NoAfterlife {
// This test checks the validity of temporarily restoring the value of
// the last TLS slot for a given key during the termination of an
- // auto-initialized master thread (in Governor::auto_terminate).
- // If anything goes wrong, GenericScheduler::cleanup_master() will assert.
+ // 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.
tbb::task &r = *new( tbb::task::allocate_root(*g_Ctx) ) FireAndForgetTask;
r.spawn(r);
diff --git a/src/test/test_task_group.cpp b/src/test/test_task_group.cpp
index 3fb6d87..4d68737 100644
--- a/src/test/test_task_group.cpp
+++ b/src/test/test_task_group.cpp
@@ -141,7 +141,8 @@ class SharedGroupBodyImpl : NoCopy, Harness::NoAfterlife {
Harness::ConcurrencyTracker ct;
m_taskGroup->wait();
}
- ASSERT ( Harness::ConcurrencyTracker::PeakParallelism() > 1, "No parallel waiting detected" );
+ if ( Harness::ConcurrencyTracker::PeakParallelism() == 1 )
+ REPORT ( "Warning: No parallel waiting detected in TestParallelWait\n" );
m_barrier.wait();
}
else
@@ -209,7 +210,9 @@ public:
, m_pImpl( new SharedGroupBodyImpl(numThreads, sharingMode) )
{}
SharedGroupBody ( const SharedGroupBody& src )
- : m_bOwner(false)
+ : NoAssign()
+ , Harness::NoAfterlife()
+ , m_bOwner(false)
, m_pImpl(src.m_pImpl)
{}
~SharedGroupBody () {
@@ -431,7 +434,7 @@ void TestTaskHandle2 () {
if ( i == numRepeats - 1 )
break;
rg.run( *h );
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
bool caught = false;
try {
rg.run( *h );
@@ -444,7 +447,7 @@ void TestTaskHandle2 () {
ASSERT ( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unrecognized exception" );
}
ASSERT ( caught, "Expected invalid_multiple_scheduling exception is missing" );
-#endif /* !__TBB_EXCEPTION_HANDLING_BROKEN */
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
}
rg.run_and_wait( *h );
for( unsigned i = 0; i < numRepeats; ++i )
@@ -531,7 +534,7 @@ bool g_Throw;
#if __TBB_SILENT_CANCELLATION_BROKEN
volatile bool g_CancellationPropagationInProgress;
#define CATCH_ANY() \
- catch ( ... ) { \
+ __TBB_CATCH( ... ) { \
if ( g_CancellationPropagationInProgress ) { \
if ( g_Throw ) { \
exceptionCaught = true; \
@@ -541,7 +544,7 @@ bool g_Throw;
ASSERT( false, "Unknown exception" ); \
}
#else
- #define CATCH_ANY() catch ( ... ) { ASSERT( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unknown exception" ); }
+ #define CATCH_ANY() __TBB_CATCH( ... ) { ASSERT( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unknown exception" ); }
#endif
inline
@@ -565,7 +568,7 @@ public:
AssertLive();
if ( g_Throw ) {
if ( ++m_TaskCount == SKIP_CHORES )
- throw test_exception(EXCEPTION_DESCR1);
+ __TBB_THROW( test_exception(EXCEPTION_DESCR1) );
__TBB_Yield();
}
else {
@@ -584,11 +587,13 @@ void LaunchChildren () {
for( unsigned i = 0; i < NUM_CHORES; ++i )
g.run( ThrowingTask(count) );
Concurrency::task_group_status status = Concurrency::not_complete;
- try {
+ __TBB_TRY {
status = g.wait();
- } catch ( TestException& e ) {
+ } __TBB_CATCH ( TestException& e ) {
+#if TBB_USE_EXCEPTIONS
ASSERT( e.what(), "Empty what() string" );
ASSERT( __TBB_EXCEPTION_TYPE_INFO_BROKEN || strcmp(e.what(), EXCEPTION_DESCR1) == 0, "Unknown exception" );
+#endif /* TBB_USE_EXCEPTIONS */
exceptionCaught = true;
++g_ExceptionCount;
} CATCH_ANY();
@@ -597,10 +602,11 @@ void LaunchChildren () {
#if __TBB_SILENT_CANCELLATION_BROKEN
g_CancellationPropagationInProgress = true;
#endif
- throw test_exception(EXCEPTION_DESCR2);
+ __TBB_THROW( test_exception(EXCEPTION_DESCR2) );
}
}
+#if TBB_USE_EXCEPTIONS
void TestEh1 () {
ResetGlobals( true, false );
Concurrency::task_group rg;
@@ -636,6 +642,7 @@ void TestEh2 () {
ASSERT( g_ExceptionCount <= NUM_GROUPS - SKIP_GROUPS, "Too many exceptions from the child groups. The test is broken" );
ASSERT( g_ExceptionCount < NUM_GROUPS - SKIP_GROUPS, "None of the child groups was cancelled" );
}
+#endif /* TBB_USE_EXCEPTIONS */
//------------------------------------------------------------------------
// Tests for manual cancellation of the task_group hierarchy
@@ -680,11 +687,13 @@ void StructuredLaunchChildren () {
new ( h ) handle_type( ThrowingTask(count) );
g.run( *h );
}
- try {
+ __TBB_TRY {
g.wait();
- } catch ( TestException& e ) {
+ } __TBB_CATCH( TestException& e ) {
+#if TBB_USE_EXCEPTIONS
ASSERT( e.what(), "Empty what() string" );
ASSERT( __TBB_EXCEPTION_TYPE_INFO_BROKEN || strcmp(e.what(), EXCEPTION_DESCR1) == 0, "Unknown exception" );
+#endif /* TBB_USE_EXCEPTIONS */
#if __TBB_SILENT_CANCELLATION_BROKEN
ASSERT ( !g.is_canceling() || g_CancellationPropagationInProgress, "wait() has not reset cancellation state" );
#else
@@ -700,7 +709,7 @@ void StructuredLaunchChildren () {
#if __TBB_SILENT_CANCELLATION_BROKEN
g_CancellationPropagationInProgress = true;
#endif
- throw test_exception(EXCEPTION_DESCR2);
+ __TBB_THROW( test_exception(EXCEPTION_DESCR2) );
}
}
@@ -745,6 +754,7 @@ void TestStructuredCancellation1 () {
driver.Finish();
}
+#if TBB_USE_EXCEPTIONS
#if defined(_MSC_VER)
#pragma warning (disable: 4127)
#endif
@@ -776,6 +786,7 @@ void TestStructuredCancellation2 () {
ASSERT( !unexpected_exception, NULL );
driver.Finish();
}
+#endif /* TBB_USE_EXCEPTIONS */
void EmptyFunction () {}
@@ -802,13 +813,11 @@ int TestMain () {
Concurrency::MaxConcurrency , p,
Concurrency::TargetOversubscriptionFactor, 1);
Concurrency::Scheduler *s = Concurrency::Scheduler::Create( sp );
- if ( p > 1 ) {
- TestVagabondGroup();
- }
#endif /* !TBBTEST_USE_TBB */
if ( p > 1 ) {
TestParallelSpawn();
TestParallelWait();
+ TestVagabondGroup();
}
TestFib1();
TestFib2();
@@ -821,19 +830,19 @@ int TestMain () {
#endif
TestCancellation1();
TestStructuredCancellation1();
-#if !__TBB_EXCEPTION_HANDLING_BROKEN
+#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
TestEh1();
TestEh2();
TestStructuredWait();
TestStructuredCancellation2<true>();
TestStructuredCancellation2<false>();
-#endif /* !__TBB_EXCEPTION_HANDLING_BROKEN */
+#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
#if !TBBTEST_USE_TBB
s->Release();
#endif
}
-#if __TBB_EXCEPTION_HANDLING_BROKEN
- REPORT("Warning: Exception handling tests are skipped because of a known issue.\n");
+#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
+ REPORT("Known issue: exception handling tests are skipped.\n");
#endif
return Harness::Done;
}
diff --git a/src/test/test_task_leaks.cpp b/src/test/test_task_leaks.cpp
index a24c542..8d5c012 100644
--- a/src/test/test_task_leaks.cpp
+++ b/src/test/test_task_leaks.cpp
@@ -26,20 +26,38 @@
the GNU General Public License.
*/
-// to avoid usage of #pragma comment
-#define __TBB_NO_IMPLICIT_LINKAGE 1
+/* The test uses "single produces multiple consumers" (SPMC )pattern to check
+ if the memory of the tasks stolen by consumer threads is returned to the
+ producer thread and is reused.
-#define COUNT_TASK_NODES 1
-#define __TBB_TASK_CPP_DIRECTLY_INCLUDED 1
-#include "../tbb/task.cpp"
+ The test consists of a series of iterations, which execute a task tree.
+ the test fails is the memory consumption is not stabilized during some
+ number of iterations.
+
+ After the memory consumption stabilized the memory state is perturbed by
+ switching producer thread, and the check is repeated.
+*/
+
+#define __TBB_COUNT_TASK_NODES 1
+#include "harness_inject_scheduler.h"
#include "tbb/atomic.h"
#include "harness_assert.h"
#include <cstdlib>
-//------------------------------------------------------------------------
-// Test for task::spawn_children
-//------------------------------------------------------------------------
+
+// Test configuration parameters
+
+//! Maximal number of test iterations
+const int MaxIterations = 600;
+//! Number of iterations during which the memory consumption must stabilize
+const int AsymptoticRange = 100;
+//! Number of times the memory state is perturbed to repeat the check
+const int NumProducerSwitches = 2;
+//! Number of iterations after which the success of producer switch is checked
+const int ProducerCheckTimeout = 10;
+//! Number of initial iteration used to collect statistics to be used in later checks
+const int InitialStatsIterations = 20;
tbb::atomic<int> Count;
tbb::atomic<tbb::task*> Exchanger;
@@ -57,7 +75,7 @@ class ChangeProducer: public tbb::task {
public:
/*override*/ tbb::task* execute() {
if( is_stolen_task() ) {
- Producer = internal::Governor::local_scheduler();
+ Producer = internal::governor::local_scheduler();
}
return NULL;
}
@@ -73,7 +91,7 @@ public:
/*override*/ tbb::task* execute() {
if( my_depth>0 ) {
int child_count = my_child_count;
- scheduler* my_sched = internal::Governor::local_scheduler();
+ scheduler* my_sched = internal::governor::local_scheduler();
tbb::task& c = *new( tbb::task::allocate_continuation() ) tbb::empty_task;
c.set_ref_count( child_count );
recycle_as_child_of(c);
@@ -83,20 +101,22 @@ public:
tbb::task* t = new( c.allocate_child() ) tbb::empty_task;
--child_count;
t = Exchanger.fetch_and_store(t);
- if( t ) this->spawn(*t);
+ if( t ) spawn(*t);
} else {
tbb::task* t = Exchanger.fetch_and_store(NULL);
- if( t ) this->spawn(*t);
+ if( t ) spawn(*t);
}
while( child_count ) {
- c.spawn( *new( c.allocate_child() ) TaskGenerator(my_child_count, my_depth-1) );
+ tbb::task* t = new( c.allocate_child() ) TaskGenerator(my_child_count, my_depth-1);
+ if( my_depth >4 ) enqueue(*t);
+ else spawn(*t);
--child_count;
}
--my_depth;
return this;
} else {
tbb::task* t = Exchanger.fetch_and_store(NULL);
- if( t ) this->spawn(*t);
+ if( t ) spawn(*t);
return NULL;
}
}
@@ -113,24 +133,27 @@ public:
#pragma warning( pop )
#endif
-void RunTaskGenerators( int i ) {
- tbb::task* dummy_root;
- if( i==250 ) {
+void RunTaskGenerators( bool switchProducer = false, bool checkProducer = false ) {
+ if( switchProducer )
Producer = NULL;
- }
- dummy_root = new( tbb::task::allocate_root() ) tbb::empty_task;
+ tbb::task* dummy_root = new( tbb::task::allocate_root() ) tbb::empty_task;
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 );
else
dummy_root->spawn( *new( dummy_root->allocate_child() ) ChangeProducer );
- if( i==260 && !Producer ) {
+ 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 ) {
- tbb::task& t = *new( tbb::task::allocate_root() ) TaskGenerator(/*child_count=*/4, /*depth=*/6);
- tbb::task::spawn_root_and_wait(t);
+ if( j&1 ) {
+ 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))
+ TaskGenerator(/*child_count=*/4, /*depth=*/6);
+ tbb::task::enqueue(t);
+ }
}
dummy_root->wait_for_all();
dummy_root->destroy( *dummy_root );
@@ -150,18 +173,18 @@ void TestTaskReclamation() {
tbb::task_scheduler_init init (MinThread);
REMARK("Starting with %d threads\n", MinThread);
// For now, the master will produce "additional" tasks; later a worker will replace it;
- Producer = internal::Governor::local_scheduler();
- int N = 20;
+ Producer = internal::governor::local_scheduler();
+ int N = InitialStatsIterations;
// First N iterations fill internal buffers and collect initial statistics
for( int i=0; i<N; ++i ) {
// First N iterations fill internal buffers and collect initial statistics
- RunTaskGenerators( i );
+ RunTaskGenerators();
size_t m = GetMemoryUsage();
if( m-initial_amount_of_memory > 0)
initial_amount_of_memory = m;
- intptr_t n = internal::Governor::local_scheduler()->get_task_node_count( /*count_arena_workers=*/true );
+ intptr_t n = internal::governor::local_scheduler()->get_task_node_count( /*count_arena_workers=*/true );
task_count_sum += n;
task_count_sum_square += n*n;
@@ -172,26 +195,41 @@ void TestTaskReclamation() {
sigma = sqrt( (task_count_sum_square - task_count_sum*task_count_sum/N)/N );
REMARK("Average task count: %g, sigma: %g, sum: %g, square sum:%g \n", average, sigma, task_count_sum, task_count_sum_square);
- int error_count = 0;
- for( int i=0; i<500; ++i ) {
+ int last_error_iteration = 0,
+ producer_switch_iteration = 0,
+ producer_switches = 0;
+ bool switchProducer = false,
+ checkProducer = false;
+ for( int i=0; i < MaxIterations; ++i ) {
// These iterations check for excessive memory use and unreasonable task count
- RunTaskGenerators( i );
+ RunTaskGenerators( switchProducer, checkProducer );
- intptr_t n = internal::Governor::local_scheduler()->get_task_node_count( /*count_arena_workers=*/true );
+ intptr_t n = internal::governor::local_scheduler()->get_task_node_count( /*count_arena_workers=*/true );
size_t m = GetMemoryUsage();
if( (m-initial_amount_of_memory > 0) && (n > average+4*sigma) ) {
- ++error_count;
// Use 4*sigma interval (for normal distribution, 3*sigma contains ~99% of values).
- // Issue a warning for the first couple of times, then errors
- REPORT( "%s: possible leak of up to %ld bytes; currently %ld cached task objects (iteration=%d)\n",
- error_count>3?"Error":"Warning", static_cast<unsigned long>(m-initial_amount_of_memory), long(n), i );
+ REMARK( "Warning: possible leak of up to %ld bytes; currently %ld cached task objects (iteration=%d)\n",
+ static_cast<unsigned long>(m-initial_amount_of_memory), long(n), i );
+ last_error_iteration = i;
initial_amount_of_memory = m;
- if( error_count>5 ) break;
} else {
REMARK( "Consumed %ld bytes and %ld objects (iteration=%d)\n", long(m), long(n), i );
}
+ if ( i == last_error_iteration + AsymptoticRange ) {
+ if ( producer_switches++ == NumProducerSwitches )
+ break;
+ else {
+ last_error_iteration = producer_switch_iteration = i;
+ switchProducer = true;
+ }
+ }
+ else {
+ switchProducer = false;
+ checkProducer = producer_switch_iteration && (i == producer_switch_iteration + ProducerCheckTimeout);
+ }
}
+ ASSERT( last_error_iteration < MaxIterations - AsymptoticRange, "The amount of allocated tasks keeps growing. Leak is possible." );
}
int TestMain () {
diff --git a/src/test/test_task_scheduler_init.cpp b/src/test/test_task_scheduler_init.cpp
index 4879a45..53839e8 100644
--- a/src/test/test_task_scheduler_init.cpp
+++ b/src/test/test_task_scheduler_init.cpp
@@ -30,43 +30,61 @@
#include <cstdlib>
#include "harness_assert.h"
+#include <cstdio>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+ #pragma warning (push)
+ #pragma warning (disable: 4530)
+#endif
+
+#include <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+#include "harness.h"
+
//! Test that task::initialize and task::terminate work when doing nothing else.
/** maxthread is treated as the "maximum" number of worker threads. */
void InitializeAndTerminate( int maxthread ) {
- for( int i=0; i<200; ++i ) {
- switch( i&3 ) {
- default: {
- tbb::task_scheduler_init init( std::rand() % maxthread + 1 );
- ASSERT(init.is_active(), NULL);
- break;
- }
- case 0: {
- tbb::task_scheduler_init init;
- ASSERT(init.is_active(), NULL);
- break;
- }
- case 1: {
- tbb::task_scheduler_init init( tbb::task_scheduler_init::automatic );
- ASSERT(init.is_active(), NULL);
- break;
- }
- case 2: {
- tbb::task_scheduler_init init( tbb::task_scheduler_init::deferred );
- ASSERT(!init.is_active(), "init should not be active; initialization was deferred");
- init.initialize( std::rand() % maxthread + 1 );
- ASSERT(init.is_active(), NULL);
- init.terminate();
- ASSERT(!init.is_active(), "init should not be active; it was terminated");
- break;
+ __TBB_TRY {
+ for( int i=0; i<200; ++i ) {
+ switch( i&3 ) {
+ default: {
+ tbb::task_scheduler_init init( std::rand() % maxthread + 1 );
+ ASSERT(init.is_active(), NULL);
+ break;
+ }
+ case 0: {
+ tbb::task_scheduler_init init;
+ ASSERT(init.is_active(), NULL);
+ break;
+ }
+ case 1: {
+ tbb::task_scheduler_init init( tbb::task_scheduler_init::automatic );
+ ASSERT(init.is_active(), NULL);
+ break;
+ }
+ case 2: {
+ tbb::task_scheduler_init init( tbb::task_scheduler_init::deferred );
+ ASSERT(!init.is_active(), "init should not be active; initialization was deferred");
+ init.initialize( std::rand() % maxthread + 1 );
+ ASSERT(init.is_active(), NULL);
+ init.terminate();
+ ASSERT(!init.is_active(), "init should not be active; it was terminated");
+ break;
+ }
}
}
+ } __TBB_CATCH( std::runtime_error& error ) {
+#if TBB_USE_EXCEPTIONS
+ REPORT("ERROR: %s\n", error.what() );
+#endif /* TBB_USE_EXCEPTIONS */
}
}
-#include <cstdio>
-#include <stdexcept>
-#include "harness.h"
-
#if _WIN64
namespace std { // 64-bit Windows compilers have not caught up with 1998 ISO C++ standard
using ::srand;
@@ -75,11 +93,7 @@ namespace std { // 64-bit Windows compilers have not caught up with 1998 IS
struct ThreadedInit {
void operator()( int ) const {
- try {
- InitializeAndTerminate(MaxThread);
- } catch( std::runtime_error& error ) {
- REPORT("ERROR: %s\n", error.what() );
- }
+ InitializeAndTerminate(MaxThread);
}
};
@@ -98,7 +112,8 @@ class ConcurrencyTrackingBody {
public:
void operator() ( const Range& ) const {
Harness::ConcurrencyTracker ct;
- for ( volatile int i = 0; i < 1000000; ++i );
+ for ( volatile int i = 0; i < 1000000; ++i )
+ ;
}
};
@@ -126,11 +141,7 @@ int TestMain () {
#endif
#endif /* _MSC_VER && !__TBB_NO_IMPLICIT_LINKAGE */
std::srand(2);
- try {
- InitializeAndTerminate(MaxThread);
- } catch( std::runtime_error& error ) {
- REPORT("ERROR: %s\n", error.what() );
- }
+ InitializeAndTerminate(MaxThread);
for( int p=MinThread; p<=MaxThread; ++p ) {
REMARK("testing with %d threads\n", p );
NativeParallelFor( p, ThreadedInit() );
diff --git a/src/test/test_task_scheduler_observer.cpp b/src/test/test_task_scheduler_observer.cpp
index ed7069f..99936f8 100644
--- a/src/test/test_task_scheduler_observer.cpp
+++ b/src/test/test_task_scheduler_observer.cpp
@@ -59,7 +59,9 @@ tbb::internal::tls<State*> LocalState;
void MyObserver::on_scheduler_entry( bool is_worker ) {
State& state = *LocalState;
ASSERT( is_worker==!state.IsMaster, NULL );
+#if !__TBB_ARENA_PER_MASTER
ASSERT( (state.MyFlags & flags)==0, NULL );
+#endif /* !__TBB_ARENA_PER_MASTER */
++EntryCount;
state.MyFlags |= flags;
}
diff --git a/src/tbb/itt_notify_proxy.c b/src/test/test_tbb_condition_variable.cpp
similarity index 70%
rename from src/tbb/itt_notify_proxy.c
rename to src/test/test_tbb_condition_variable.cpp
index 7fdedfa..74f2d6d 100644
--- a/src/tbb/itt_notify_proxy.c
+++ b/src/test/test_tbb_condition_variable.cpp
@@ -26,30 +26,10 @@
the GNU General Public License.
*/
-#include "tbb/tbb_config.h"
+#include "test_condition_variable.h"
-/* This declaration in particular shuts up "empty translation unit" warning */
-extern int __TBB_load_ittnotify();
-
-#if __TBB_NEW_ITT_NOTIFY
-#if DO_ITT_NOTIFY
-
-#if _WIN32||_WIN64
- #ifndef UNICODE
- #define UNICODE
- #endif
-#endif /* WIN */
-
-extern void ITT_DoOneTimeInitialization();
-
-#define ITT_SIMPLE_INIT 1
-#define __itt_init_lib_name ITT_DoOneTimeInitialization
-
-#include "tools_api/ittnotify_static.c"
-
-int __TBB_load_ittnotify() {
- return __itt_init_lib();
+int TestMain() {
+ REMARK( "testing with tbb condvar\n" );
+ DoCondVarTest<tbb::mutex,tbb::recursive_mutex>();
+ return Harness::Done;
}
-
-#endif /* DO_ITT_NOTIFY */
-#endif /* __TBB_NEW_ITT_NOTIFY */
diff --git a/src/test/test_tbb_header.cpp b/src/test/test_tbb_header.cpp
index a827e81..cd3ec9b 100644
--- a/src/test/test_tbb_header.cpp
+++ b/src/test/test_tbb_header.cpp
@@ -84,9 +84,11 @@ int TestMain ()
TestTypeDefinitionPresence( cache_aligned_allocator<int> );
TestTypeDefinitionPresence( tbb_hash_compare<int> );
TestTypeDefinitionPresence2(concurrent_hash_map<int, int> );
+ TestTypeDefinitionPresence2(concurrent_unordered_map<int, int> );
TestTypeDefinitionPresence( concurrent_bounded_queue<int> );
TestTypeDefinitionPresence( deprecated::concurrent_queue<int> );
TestTypeDefinitionPresence( strict_ppl::concurrent_queue<int> );
+ TestTypeDefinitionPresence( combinable<int> );
TestTypeDefinitionPresence( concurrent_vector<int> );
TestTypeDefinitionPresence( enumerable_thread_specific<int> );
TestTypeDefinitionPresence( mutex );
@@ -98,6 +100,7 @@ int TestMain ()
TestTypeDefinitionPresence( spin_mutex );
TestTypeDefinitionPresence( spin_rw_mutex );
TestTypeDefinitionPresence( critical_section );
+ TestTypeDefinitionPresence( reader_writer_lock );
TestTypeDefinitionPresence( tbb_exception );
TestTypeDefinitionPresence( captured_exception );
TestTypeDefinitionPresence( movable_exception<int> );
@@ -115,6 +118,7 @@ int TestMain ()
TestFuncDefinitionPresence( parallel_scan, (const tbb::blocked_range2d<int>&, Body3&, const tbb::auto_partitioner&), void );
TestFuncDefinitionPresence( parallel_sort, (int*, int*), void );
TestTypeDefinitionPresence( pipeline );
+ TestFuncDefinitionPresence( parallel_pipeline, (size_t, const tbb::filter_t<void,void>&), void );
TestTypeDefinitionPresence( task );
TestTypeDefinitionPresence( empty_task );
TestTypeDefinitionPresence( task_list );
diff --git a/src/test/test_tbb_thread.cpp b/src/test/test_tbb_thread.cpp
index 19aa089..962dd40 100644
--- a/src/test/test_tbb_thread.cpp
+++ b/src/test/test_tbb_thread.cpp
@@ -26,260 +26,13 @@
the GNU General Public License.
*/
-#include "tbb/tbb_thread.h"
-#include "tbb/atomic.h"
-
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#include "harness_report.h"
-#include "harness_assert.h"
-
-static const int THRDS = 3;
-static const int THRDS_DETACH = 2;
-static tbb::atomic<int> sum;
-static tbb::atomic<int> BaseCount;
-static tbb::tbb_thread::id real_ids[THRDS+THRDS_DETACH];
-
-class Base {
- mutable int copy_throws;
- friend void RunTests();
- friend void CheckExceptionSafety();
- void operator=( const Base& ); // Deny access
-protected:
- Base() : copy_throws(100) {++BaseCount;}
- Base( const Base& c ) : copy_throws(c.copy_throws) {
- if( --copy_throws<=0 )
- throw 0;
- ++BaseCount;
- }
- ~Base() {--BaseCount;}
-};
-
-template<int N>
-class Data: Base {
- Data(); // Deny access
- explicit Data(int v) : value(v) {}
-
- friend void RunTests();
- friend void CheckExceptionSafety();
-public:
- int value;
-};
-
-
-#include "harness_barrier.h"
-
-class ThreadFunc: Base {
- ThreadFunc() {}
-
- static Harness::SpinBarrier init_barrier;
-
- friend void RunTests();
-public:
- void operator()(){
- real_ids[0] = tbb::this_tbb_thread::get_id();
- init_barrier.wait();
-
- sum.fetch_and_add(1);
- }
- void operator()(int num){
- real_ids[num] = tbb::this_tbb_thread::get_id();
- init_barrier.wait();
-
- sum.fetch_and_add(num);
- }
- void operator()(int num, Data<0> dx) {
- real_ids[num] = tbb::this_tbb_thread::get_id();
-
- const double WAIT = .1;
- tbb::tick_count t0 = tbb::tick_count::now();
- tbb::this_tbb_thread::sleep( tbb::tick_count::interval_t(WAIT) );
- tbb::tick_count t1 = tbb::tick_count::now();
- ASSERT( ( WAIT - (t1-t0).seconds() ) < 1e-10
- || (t1-t0).seconds() > WAIT, "Should sleep enough.");
-
- init_barrier.wait();
-
- sum.fetch_and_add(num);
- sum.fetch_and_add(dx.value);
- }
- void operator()(Data<0> d) {
- tbb::this_tbb_thread::sleep( tbb::tick_count::interval_t(d.value*1.) );
- }
-};
-
-Harness::SpinBarrier ThreadFunc::init_barrier(THRDS);
-
-void CheckRelations( const tbb::tbb_thread::id ids[], int n, bool duplicates_allowed ) {
- for( int i=0; i<n; ++i ) {
- const tbb::tbb_thread::id x = ids[i];
- for( int j=0; j<n; ++j ) {
- const tbb::tbb_thread::id y = ids[j];
- ASSERT( (x==y)==!(x!=y), NULL );
- ASSERT( (x<y)==!(x>=y), NULL );
- ASSERT( (x>y)==!(x<=y), NULL );
- ASSERT( (x<y)+(x==y)+(x>y)==1, NULL );
- ASSERT( x!=y || i==j || duplicates_allowed, NULL );
- for( int k=0; k<n; ++k ) {
- const tbb::tbb_thread::id z = ids[j];
- ASSERT( !(x<y && y<z) || x<z, "< is not transitive" );
- }
- }
- }
-}
-
-class AnotherThreadFunc: Base {
-public:
- void operator()() {}
- void operator()(const Data<1>&) {}
- void operator()(const Data<1>&, const Data<2>&) {}
- friend void CheckExceptionSafety();
-};
-
-void CheckExceptionSafety() {
- int original_count = BaseCount;
- // d loops over number of copies before throw occurs
- for( int d=1; d<=3; ++d ) {
- // Try all combinations of throw/nothrow for f, x, and y's copy constructor.
- for( int i=0; i<8; ++i ) {
- {
- const AnotherThreadFunc f = AnotherThreadFunc();
- if( i&1 ) f.copy_throws = d;
- const Data<1> x(0);
- if( i&2 ) x.copy_throws = d;
- const Data<2> y(0);
- if( i&4 ) y.copy_throws = d;
- bool exception_caught = false;
- for( int j=0; j<3; ++j ) {
- try {
- switch(j) {
- case 0: {tbb::tbb_thread t(f); t.join();} break;
- case 1: {tbb::tbb_thread t(f,x); t.join();} break;
- case 2: {tbb::tbb_thread t(f,x,y); t.join();} break;
- }
- } catch(...) {
- exception_caught = true;
- }
- ASSERT( !exception_caught||(i&((1<<(j+1))-1))!=0, NULL );
- }
- }
-// Intel Compiler sometimes fails to destroy all implicitly generated copies
-// of an object when a copy constructor throws an exception.
-// Problem was reported as Quad issue 482935.
-// This #if should be removed or tightened when the bug is fixed.
-#if !((_WIN32 || _WIN64) && defined(__INTEL_COMPILER))
- ASSERT( BaseCount==original_count, "object leak detected" );
-#endif
- }
- }
-}
-
-#include <cstdio>
-
-void RunTests() {
-
- ThreadFunc t;
- Data<0> d100(100), d1(1), d0(0);
- tbb::tbb_thread::id id;
- tbb::tbb_thread::id id0, uniq_ids[THRDS];
-
- tbb::tbb_thread thrs[THRDS];
- tbb::tbb_thread thr;
- tbb::tbb_thread thr0(t);
- tbb::tbb_thread thr1(t, 2);
- tbb::tbb_thread thr2(t, 1, d100);
-
- ASSERT( thr0.get_id() != id, NULL );
- id0 = thr0.get_id();
- tbb::move(thrs[0], thr0);
- ASSERT( thr0.get_id() == id, NULL );
- ASSERT( thrs[0].get_id() == id0, NULL );
-
- tbb::tbb_thread::native_handle_type h1 = thr1.native_handle();
- tbb::tbb_thread::native_handle_type h2 = thr2.native_handle();
- tbb::tbb_thread::id id1 = thr1.get_id();
- tbb::tbb_thread::id id2 = thr2.get_id();
- tbb::swap(thr1, thr2);
- ASSERT( thr1.native_handle() == h2, NULL );
- ASSERT( thr2.native_handle() == h1, NULL );
- ASSERT( thr1.get_id() == id2, NULL );
- ASSERT( thr2.get_id() == id1, NULL );
- thr1.swap(thr2);
- ASSERT( thr1.native_handle() == h1, NULL );
- ASSERT( thr2.native_handle() == h2, NULL );
- ASSERT( thr1.get_id() == id1, NULL );
- ASSERT( thr2.get_id() == id2, NULL );
- thr1.swap(thr2);
-
- tbb::move(thrs[1], thr1);
- ASSERT( thr1.get_id() == id, NULL );
-
- tbb::move(thrs[2], thr2);
- ASSERT( thr2.get_id() == id, NULL );
-
- for (int i=0; i<THRDS; i++)
- uniq_ids[i] = thrs[i].get_id();
-
- ASSERT( thrs[2].joinable(), NULL );
-
- for (int i=0; i<THRDS; i++)
- thrs[i].join();
- for (int i=0; i<THRDS; i++)
- ASSERT( real_ids[i] == uniq_ids[i], NULL );
-
- int current_sum = sum;
- ASSERT( current_sum == 104, NULL );
- ASSERT( ! thrs[2].joinable(), NULL );
- ASSERT( BaseCount==4, "object leak detected" );
-
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
- CheckExceptionSafety();
-#endif
-
- // Note: all tests involving BaseCount should be put before the tests
- // involing detached threads, because there is no way of knowing when
- // a detached thread destroys its arguments.
-
- tbb::tbb_thread thr_detach_0(t, d0);
- real_ids[THRDS] = thr_detach_0.get_id();
- thr_detach_0.detach();
- ASSERT( thr_detach_0.get_id() == id, NULL );
-
- tbb::tbb_thread thr_detach_1(t, d1);
- real_ids[THRDS+1] = thr_detach_1.get_id();
- thr_detach_1.detach();
- ASSERT( thr_detach_1.get_id() == id, NULL );
-
- CheckRelations(real_ids, THRDS+THRDS_DETACH, true);
-
- CheckRelations(uniq_ids, THRDS, false);
-
- for (int i=0; i<2; i++) {
- AnotherThreadFunc empty_func;
- tbb::tbb_thread thr_to(empty_func), thr_from(empty_func);
- tbb::tbb_thread::id from_id = thr_from.get_id();
- if (i) thr_to.join();
- thr_to = thr_from;
- ASSERT( thr_from.get_id() == tbb::tbb_thread::id(), NULL );
- ASSERT( thr_to.get_id() == from_id, NULL );
- }
-
- ASSERT( tbb::tbb_thread::hardware_concurrency() > 0, NULL);
-}
-
-typedef bool (*id_relation)( tbb::tbb_thread::id, tbb::tbb_thread::id );
-
-id_relation CheckSignatures() {
- id_relation r[6] = {&tbb::operator==,
- &tbb::operator!=,
- &tbb::operator<,
- &tbb::operator>,
- &tbb::operator<=,
- &tbb::operator>=};
- return r[1];
-}
-
+#define THREAD tbb::tbb_thread
+#define THIS_THREAD tbb::this_tbb_thread
+#define THIS_THREAD_SLEEP THIS_THREAD::sleep
+#include "test_thread.h"
#include "harness.h"
+/* we want to test tbb::tbb_thread */
int TestMain () {
CheckSignatures();
RunTests();
diff --git a/src/test/test_tbb_version.cpp b/src/test/test_tbb_version.cpp
index 835c393..72a2da3 100644
--- a/src/test/test_tbb_version.cpp
+++ b/src/test/test_tbb_version.cpp
@@ -26,12 +26,25 @@
the GNU General Public License.
*/
+#include "tbb/tbb_stddef.h"
+
#include <stdio.h>
#include <stdlib.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 <vector>
#include <string>
#include <utility>
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
#include "tbb/task_scheduler_init.h"
#define HARNESS_CUSTOM_MAIN 1
@@ -40,10 +53,10 @@
#include "harness.h"
#if defined (_WIN32) || defined (_WIN64)
-#define TEST_SYSTEM_COMMAND "test_tbb_version.exe 1"
+#define TEST_SYSTEM_COMMAND "test_tbb_version.exe @"
#define putenv _putenv
#else
-#define TEST_SYSTEM_COMMAND "./test_tbb_version.exe 1"
+#define TEST_SYSTEM_COMMAND "./test_tbb_version.exe @"
#endif
enum string_required {
@@ -58,8 +71,8 @@ void initialize_strings_vector(std::vector <string_pair>* vector);
const char stderr_stream[] = "version_test.err";
const char stdout_stream[] = "version_test.out";
-__TBB_TEST_EXPORT
-int main(int argc, char*[] ) {
+HARNESS_EXPORT
+int main(int argc, char *argv[] ) {
/* We first introduced runtime version identification in 3014 */
#if TBB_INTERFACE_VERSION>=3014
// For now, just test that run-time TBB version matches the compile-time version,
@@ -68,12 +81,12 @@ int main(int argc, char*[] ) {
ASSERT(tbb::TBB_runtime_interface_version()==TBB_INTERFACE_VERSION,
"Running with the library of different version than the test was compiled against");
#endif
- try{
+ __TBB_TRY {
FILE *stream_out;
FILE *stream_err;
char psBuffer[512];
- if(argc>1) {
+ if(argc>1 && argv[1][0] == '@' ) {
stream_err = freopen( stderr_stream, "w", stderr );
if( stream_err == NULL ){
REPORT( "Internal test error (freopen)\n" );
@@ -188,7 +201,7 @@ int main(int argc, char*[] ) {
}
}
fclose( stream_err );
- } catch(...) {
+ } __TBB_CATCH(...) {
ASSERT( 0,"unexpected exception" );
}
REPORT("done\n");
@@ -199,8 +212,8 @@ int main(int argc, char*[] ) {
// Fill dictionary with version strings for platforms
void initialize_strings_vector(std::vector <string_pair>* vector)
{
- vector->push_back(string_pair("TBB: VERSION\t\t2.2", required)); // check TBB_VERSION
- vector->push_back(string_pair("TBB: INTERFACE VERSION\t4003", required)); // check TBB_INTERFACE_VERSION
+ vector->push_back(string_pair("TBB: VERSION\t\t3.0", required)); // check TBB_VERSION
+ vector->push_back(string_pair("TBB: INTERFACE VERSION\t5000", 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));
@@ -233,6 +246,7 @@ void initialize_strings_vector(std::vector <string_pair>* vector)
vector->push_back(string_pair("TBB: ALLOCATOR", required));
vector->push_back(string_pair("TBB: RML", not_required));
vector->push_back(string_pair("TBB: Intel(R) RML library built:", not_required));
+ vector->push_back(string_pair("TBB: Intel(R) RML library version:", not_required));
vector->push_back(string_pair("TBB: SCHEDULER", required));
return;
diff --git a/src/test/test_tbb_thread.cpp b/src/test/test_thread.h
similarity index 78%
copy from src/test/test_tbb_thread.cpp
copy to src/test/test_thread.h
index 19aa089..888eeef 100644
--- a/src/test/test_tbb_thread.cpp
+++ b/src/test/test_thread.h
@@ -37,7 +37,7 @@ static const int THRDS = 3;
static const int THRDS_DETACH = 2;
static tbb::atomic<int> sum;
static tbb::atomic<int> BaseCount;
-static tbb::tbb_thread::id real_ids[THRDS+THRDS_DETACH];
+static THREAD::id real_ids[THRDS+THRDS_DETACH];
class Base {
mutable int copy_throws;
@@ -48,7 +48,7 @@ protected:
Base() : copy_throws(100) {++BaseCount;}
Base( const Base& c ) : copy_throws(c.copy_throws) {
if( --copy_throws<=0 )
- throw 0;
+ __TBB_THROW(0);
++BaseCount;
}
~Base() {--BaseCount;}
@@ -76,26 +76,35 @@ class ThreadFunc: Base {
friend void RunTests();
public:
void operator()(){
- real_ids[0] = tbb::this_tbb_thread::get_id();
+ real_ids[0] = THIS_THREAD::get_id();
init_barrier.wait();
sum.fetch_and_add(1);
}
void operator()(int num){
- real_ids[num] = tbb::this_tbb_thread::get_id();
+ real_ids[num] = THIS_THREAD::get_id();
init_barrier.wait();
sum.fetch_and_add(num);
}
void operator()(int num, Data<0> dx) {
- real_ids[num] = tbb::this_tbb_thread::get_id();
+ real_ids[num] = THIS_THREAD::get_id();
const double WAIT = .1;
+ const double SHORT_TOLERANCE = 1e-8;
+#if _WIN32 || _WIN64
+ const double LONG_TOLERANCE = 0.120; // maximal scheduling quantum for Windows Server
+#else
+ const double LONG_TOLERANCE = 0.200; // reasonable upper bound
+#endif
tbb::tick_count t0 = tbb::tick_count::now();
tbb::this_tbb_thread::sleep( tbb::tick_count::interval_t(WAIT) );
tbb::tick_count t1 = tbb::tick_count::now();
- ASSERT( ( WAIT - (t1-t0).seconds() ) < 1e-10
- || (t1-t0).seconds() > WAIT, "Should sleep enough.");
+ double delta = (t1-t0).seconds() - WAIT;
+ if(delta+SHORT_TOLERANCE <= 0.0)
+ REPORT("ERROR: Sleep interval too short (%g outside short tolerance(%g))\n", (t1-t0).seconds(), WAIT - SHORT_TOLERANCE);
+ if(delta > LONG_TOLERANCE)
+ REPORT("WARNING: Sleep interval too long (%g outside long tolerance(%g))\n", (t1-t0).seconds(), WAIT + LONG_TOLERANCE);
init_barrier.wait();
@@ -109,18 +118,18 @@ public:
Harness::SpinBarrier ThreadFunc::init_barrier(THRDS);
-void CheckRelations( const tbb::tbb_thread::id ids[], int n, bool duplicates_allowed ) {
+void CheckRelations( const THREAD::id ids[], int n, bool duplicates_allowed ) {
for( int i=0; i<n; ++i ) {
- const tbb::tbb_thread::id x = ids[i];
+ const THREAD::id x = ids[i];
for( int j=0; j<n; ++j ) {
- const tbb::tbb_thread::id y = ids[j];
+ const THREAD::id y = ids[j];
ASSERT( (x==y)==!(x!=y), NULL );
ASSERT( (x<y)==!(x>=y), NULL );
ASSERT( (x>y)==!(x<=y), NULL );
ASSERT( (x<y)+(x==y)+(x>y)==1, NULL );
ASSERT( x!=y || i==j || duplicates_allowed, NULL );
for( int k=0; k<n; ++k ) {
- const tbb::tbb_thread::id z = ids[j];
+ const THREAD::id z = ids[j];
ASSERT( !(x<y && y<z) || x<z, "< is not transitive" );
}
}
@@ -135,6 +144,7 @@ public:
friend void CheckExceptionSafety();
};
+#if TBB_USE_EXCEPTIONS
void CheckExceptionSafety() {
int original_count = BaseCount;
// d loops over number of copies before throw occurs
@@ -152,9 +162,9 @@ void CheckExceptionSafety() {
for( int j=0; j<3; ++j ) {
try {
switch(j) {
- case 0: {tbb::tbb_thread t(f); t.join();} break;
- case 1: {tbb::tbb_thread t(f,x); t.join();} break;
- case 2: {tbb::tbb_thread t(f,x,y); t.join();} break;
+ case 0: {THREAD t(f); t.join();} break;
+ case 1: {THREAD t(f,x); t.join();} break;
+ case 2: {THREAD t(f,x,y); t.join();} break;
}
} catch(...) {
exception_caught = true;
@@ -172,6 +182,7 @@ void CheckExceptionSafety() {
}
}
}
+#endif /* TBB_USE_EXCEPTIONS */
#include <cstdio>
@@ -179,14 +190,14 @@ void RunTests() {
ThreadFunc t;
Data<0> d100(100), d1(1), d0(0);
- tbb::tbb_thread::id id;
- tbb::tbb_thread::id id0, uniq_ids[THRDS];
+ THREAD::id id;
+ THREAD::id id0, uniq_ids[THRDS];
- tbb::tbb_thread thrs[THRDS];
- tbb::tbb_thread thr;
- tbb::tbb_thread thr0(t);
- tbb::tbb_thread thr1(t, 2);
- tbb::tbb_thread thr2(t, 1, d100);
+ THREAD thrs[THRDS];
+ THREAD thr;
+ THREAD thr0(t);
+ THREAD thr1(t, 2);
+ THREAD thr2(t, 1, d100);
ASSERT( thr0.get_id() != id, NULL );
id0 = thr0.get_id();
@@ -194,10 +205,10 @@ void RunTests() {
ASSERT( thr0.get_id() == id, NULL );
ASSERT( thrs[0].get_id() == id0, NULL );
- tbb::tbb_thread::native_handle_type h1 = thr1.native_handle();
- tbb::tbb_thread::native_handle_type h2 = thr2.native_handle();
- tbb::tbb_thread::id id1 = thr1.get_id();
- tbb::tbb_thread::id id2 = thr2.get_id();
+ THREAD::native_handle_type h1 = thr1.native_handle();
+ THREAD::native_handle_type h2 = thr2.native_handle();
+ THREAD::id id1 = thr1.get_id();
+ THREAD::id id2 = thr2.get_id();
tbb::swap(thr1, thr2);
ASSERT( thr1.native_handle() == h2, NULL );
ASSERT( thr2.native_handle() == h1, NULL );
@@ -231,7 +242,7 @@ void RunTests() {
ASSERT( ! thrs[2].joinable(), NULL );
ASSERT( BaseCount==4, "object leak detected" );
-#if !__TBB_EXCEPTION_HANDLING_TOTALLY_BROKEN
+#if TBB_USE_EXCEPTIONS
CheckExceptionSafety();
#endif
@@ -239,12 +250,12 @@ void RunTests() {
// involing detached threads, because there is no way of knowing when
// a detached thread destroys its arguments.
- tbb::tbb_thread thr_detach_0(t, d0);
+ THREAD thr_detach_0(t, d0);
real_ids[THRDS] = thr_detach_0.get_id();
thr_detach_0.detach();
ASSERT( thr_detach_0.get_id() == id, NULL );
- tbb::tbb_thread thr_detach_1(t, d1);
+ THREAD thr_detach_1(t, d1);
real_ids[THRDS+1] = thr_detach_1.get_id();
thr_detach_1.detach();
ASSERT( thr_detach_1.get_id() == id, NULL );
@@ -255,18 +266,18 @@ void RunTests() {
for (int i=0; i<2; i++) {
AnotherThreadFunc empty_func;
- tbb::tbb_thread thr_to(empty_func), thr_from(empty_func);
- tbb::tbb_thread::id from_id = thr_from.get_id();
+ THREAD thr_to(empty_func), thr_from(empty_func);
+ THREAD::id from_id = thr_from.get_id();
if (i) thr_to.join();
thr_to = thr_from;
- ASSERT( thr_from.get_id() == tbb::tbb_thread::id(), NULL );
+ ASSERT( thr_from.get_id() == THREAD::id(), NULL );
ASSERT( thr_to.get_id() == from_id, NULL );
}
- ASSERT( tbb::tbb_thread::hardware_concurrency() > 0, NULL);
+ ASSERT( THREAD::hardware_concurrency() > 0, NULL);
}
-typedef bool (*id_relation)( tbb::tbb_thread::id, tbb::tbb_thread::id );
+typedef bool (*id_relation)( THREAD::id, THREAD::id );
id_relation CheckSignatures() {
id_relation r[6] = {&tbb::operator==,
@@ -277,11 +288,3 @@ id_relation CheckSignatures() {
&tbb::operator>=};
return r[1];
}
-
-#include "harness.h"
-
-int TestMain () {
- CheckSignatures();
- RunTests();
- return Harness::Done;
-}
diff --git a/src/test/test_user_events.cpp b/src/test/test_user_events.cpp
deleted file mode 100644
index 3ea44ea..0000000
--- a/src/test/test_user_events.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- Copyright 2005-2010 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 DO_ITT_NOTIFY 1
-#define TBB_USE_ASSERT 1
-#define TBB_DO_ITT_EVENTS 1
-
-/* to do implicite linkage under Windows, but __TBB_BUILD stops it */
-#include "tbb/tbb_stddef.h"
-
-#if _MSC_VER /* need this to overcome _declspec( dllimport ) for ITT_event */
-#define __TBB_BUILD 1
-#endif
-
-#include "../tbb/itt_notify.cpp"
-
-#undef DO_ITT_NOTIFY
-
-#include <string>
-#include <vector>
-#include <sstream>
-#include <iostream>
-#include <tbb/atomic.h>
-#include <tbb/tbb_thread.h>
-#include <tbb/concurrent_hash_map.h>
-#include "harness_assert.h"
-
-namespace tbb {
-namespace internal {
-
-void DoOneTimeInitializations() {}
-bool GetBoolEnvironmentVariable(char const*) { return true; }
-bool FillDynamicLinks(const char*, const DynamicLinkDescriptor [], size_t) {
- return true;
-}
-void PrintExtraVersionInfo( const char* , const char* ) {}
-
-struct EvName {
- int event;
- char name[100];
-
- EvName(int event, const char *n) : event(event) {
- strcpy(name, n);
- }
-};
-
-struct Hash_Cmp {
- static size_t hash(int event) {
- return event;
- }
- static bool equal(int e1, int e2) {
- return e1==e2;
- }
-};
-
-typedef concurrent_hash_map<__itt_event,std::string,Hash_Cmp> EvNames;
-
-static EvNames ev_names;
-
-static atomic<int> uniq_itt_event;
-
-__itt_event test_event_create(const char *name, int)
-{
- __itt_event my_cnt = uniq_itt_event++;
- EvNames::accessor acc;
- std::string str(name);
-
- ev_names.insert( acc, my_cnt );
- acc->second = str;
-
- return my_cnt;
-}
-
-struct IdxStr {
- itt_event_t h;
- std::string str;
-};
-
-static ITT_Event_Hnd_to_Event<true> ev;
-static IdxStr *idxs;
-static atomic<int> waiting_threads;
-
-class Pusher
-{
- int my_num;
- int events_per_thread;
-
- void barrier() {
- waiting_threads--;
- while(waiting_threads)
- ;
- }
-public:
- Pusher(int my_num, int events_per_thread) :
- my_num(my_num), events_per_thread(events_per_thread) {}
- void operator()(){
- barrier();
-
- for (int i=events_per_thread*my_num;
- i<events_per_thread*(my_num+1); i++) {
- IdxStr i_s;
- char buf[100];
-
- sprintf(buf, "%d", i);
- i_s.str = buf;
- i_s.h = ev.add_event(buf);
-
- idxs[i] = i_s;
- }
- }
- void operator()(int thread_id){
- std::vector<itt_event_t> l_idx;
- barrier();
-
- for (int i=0; i<events_per_thread; i++) {
- char buf[100];
-
- sprintf(buf, "%d_%d", thread_id, i);
-
- itt_event_t idx = ev.add_event(buf);
- int event = ev.get_event_by_handler( idx );
-
- EvNames::const_accessor acc;
- bool ok = ev_names.find(acc, event);
- ASSERT(ok, "itt_event should exists");
- ASSERT(0==acc->second.compare(buf), "different event names");
-
- l_idx.push_back(idx);
- }
-
- for (int i=0; i<events_per_thread; i++) {
- ev.get_event_by_handler( l_idx[i] );
- }
- }
-};
-
-
-void Test()
-{
- ITT_Handler_event_create = test_event_create;
- uniq_itt_event = 77;
- const int init_num_thr = 8;
- const int events_per_thread = 1000;
-
- tbb::tbb_thread threads[init_num_thr];
- waiting_threads = init_num_thr;
- idxs = new IdxStr[init_num_thr*events_per_thread];
- for (int i=0; i<init_num_thr; i++)
- new(threads+i) tbb::tbb_thread(Pusher(i, events_per_thread));
-
- for (int i=0; i<init_num_thr; i++)
- threads[i].join();
-
- ev.switch_to_event_creation();
-
- for (int i=0; i<init_num_thr*events_per_thread; i++) {
- std::ostringstream out;
- out << i;
-
- __itt_event e = ev.get_event_by_handler(idxs[i].h);
-
- EvNames::const_accessor acc;
- bool ok = ev_names.find(acc, e);
- ASSERT(ok, "itt_event should exists");
- ASSERT(0==acc->second.compare(out.str()), "different event names");
- }
-
- waiting_threads = init_num_thr;
- for (int i=0; i<init_num_thr; i++)
- new(threads+i) tbb::tbb_thread(Pusher(i, events_per_thread), i);
- for (int i=0; i<init_num_thr; i++)
- threads[i].join();
-}
-
-} // namespace internal
-} // namespace tbb
-
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#include "harness.h"
-
-int TestMain () {
- tbb::internal::Test();
- return Harness::Done;
-}
--
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